三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Android 13 网络Adb限制解除:从源码到实战的完整适配指南

Android 13 网络Adb限制解除:从源码到实战的完整适配指南

1. Android 13网络ADB限制解析

去年升级到Android 13后,我发现无线调试变得异常麻烦。每次都要先连接WiFi才能使用ADB,切换网络还会自动断开。这跟Android 11那种即插即用的体验差太远了。经过两周的源码追踪,终于搞清楚了Google在Android 13引入的新限制机制。

Android 13的ADB无线调试现在强制依赖WiFi连接状态,核心限制体现在三个层面:

  1. 网络依赖:必须连接可信WiFi热点
  2. 状态监听:实时监控网络变化
  3. 安全验证:SSID/BSSID双重校验

在AdbDebuggingManager.java中,我找到了关键判断逻辑:

// 原始校验代码 AdbConnectionInfo currentInfo = getCurrentWifiApInfo(); if (currentInfo == null) { Settings.Global.putInt(mContentResolver, Settings.Global.ADB_WIFI_ENABLED, 0); break; }

这种设计虽然增强了安全性,但对开发者体验影响很大。比如我在办公室和会议室切换时,ADB就会频繁断开。更麻烦的是,有些定制设备根本没有WiFi模块,这就完全堵死了无线调试的可能。

2. 源码级适配方案

2.1 系统属性配置

首先要在设备Makefile中添加关键属性。我在device.mk中加入:

# 强制启用TLS服务 PRODUCT_PROPERTY_OVERRIDES += \ persist.adb.tls_server.enable=1

这个属性会被AdbService.java在系统启动时读取:

// 系统服务启动时的关键判断 boolean enableWifi = SystemProperties.getBoolean( "persist.adb.tls_server.enable", false); if (enableWifi) { startAdbWifi(); }

实测发现只设置这个属性还不够,设备重启后ADB仍然会被关闭。通过日志分析发现AdbDebuggingManager仍在执行网络校验。

2.2 端口号固定

Android 13默认使用随机端口,这对自动化脚本很不友好。修改adb_wifi.cpp:

// 修改前 sTlsServer = new TlsServer(0); // 修改后 sTlsServer = new TlsServer(5555);

这里有个坑要注意:修改后必须clean编译,否则可能会因为增量编译导致修改不生效。我当初就因为这个浪费了半天时间排查。

2.3 网络校验移除

关键修改在AdbDebuggingManager.java,需要注释掉三处逻辑:

  1. 初始化时的网络检查
  2. 网络变化监听器注册
  3. WiFi状态变更回调

最典型的修改示例:

// 注释掉整个网络判断区块 /* AdbConnectionInfo currentInfo = getCurrentWifiApInfo(); if (currentInfo == null) { Settings.Global.putInt(mContentResolver, Settings.Global.ADB_WIFI_ENABLED, 0); break; } */

记得同时移除相关的BroadcastReceiver注册代码,否则会导致内存泄漏。我在第一次修改时就忘了处理这个细节。

3. 调试与验证

3.1 日志监控技巧

建议在修改后的代码中添加调试日志:

Log.d(TAG, "lwz debug - bypass network check");

使用组合过滤命令查看关键日志:

adb logcat | grep -E "AdbService|adbd|ADB_WIFI"

正常成功的日志序列应该是:

01-01 08:00:00.000 496 511 I adbd : persist.adb.tls_server.enable changed to 1 01-01 08:00:00.002 496 511 I adbd : adb wifi started on port 5555 01-01 08:00:00.005 762 762 D AdbService: Wifi ADB enabled

3.2 常见问题排查

我遇到过几个典型问题:

  1. 属性不生效:检查vendor/default.prop是否有覆盖
  2. 端口被占用:使用netstat -tuln确认5555端口
  3. SELinux限制:查看avc denied日志并添加策略

特别提醒:在Android 13上,即使修改成功,Settings界面可能仍显示"无线调试已关闭"。这是UI状态不同步导致的,实际功能正常。

4. 深入原理剖析

4.1 核心组件关系

ADB无线调试涉及三个关键组件:

  1. adb_wifi:Native层服务,实际处理TCP连接
  2. AdbService:系统服务,管理全局状态
  3. AdbDebuggingManager:实现具体业务逻辑

它们的工作流程如下:

  1. 系统启动时init进程拉起adbd
  2. SystemServer启动AdbService
  3. AdbService创建AdbDebuggingManager实例
  4. 各组件通过Binder和属性系统通信

4.2 属性系统详解

Android 13新增了几个关键属性:

属性名称作用域描述
persist.adb.tls_server.enableSystem总开关
service.adb.tls.portRuntime动态端口记录
adb_wifi_enabledSettingsUI状态同步

其中persist.adb.tls_server.enable的优先级最高,会覆盖其他设置。这也是我们修改的核心切入点。

4.3 兼容性处理

为了让修改更健壮,我建议添加版本判断:

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) { // 仅Android 13+需要特殊处理 bypassNetworkCheck(); }

这种写法可以确保修改不会影响低版本设备的正常运行。在跨版本系统开发时特别有用。

经过这些修改后,我的测试设备终于恢复了Android 11那种流畅的无线调试体验。现在无论是否连接WiFi,都能直接通过adb connect连上设备。这个方案已经在多个定制ROM上验证通过,稳定性完全可以满足日常开发需求。

← 返回列表