Android13 网络 Adb 默认开启

这篇具有很好参考价值的文章主要介绍了Android13 网络 Adb 默认开启。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android 13 网络 Adb 默认开启

一、前言

通过代码分析发现Android13 上对 网络adb 进行了限制!
Android13原生代码要求:必现连接上某个wifi,才能进行adb ,并且切换wifi或者关闭wifi都是会停止adb。

如果要做成Android11 或者之前一样,设备连接WiFi/有线网络后电脑可以直接进行adb连接,就要对系统代码进行适配修改。


关键:
1、mk 设置系统属性:persist.adb.tls_server.enable=1
2、写死端口号 5555
3、注释若干判断Wifi情况停止adb的代码

之前以为设置端口号和persist.adb.tls_server.enable 属性就ok了,但是还是有些小bug,还是要完全研究一遍具体流程。

二、默认adb 代码实现

1、修改的目录:

packages\modules\adb\daemon\adb_wifi.cpp
framework\base\services\core\java\com\android\server\adb\AdbDebuggingManager.java

//修改前面两个文件就可以实现adb了,后面的文件试辅助分析的。

//虽然 SettingsProvider 也有加载 Settings属性 Settings.Global.ADB_WIFI_ENABLED ,
//但是 prop那个属性更优先,所以可以不用考虑这里默认情况
framework\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java

//增加分析定位文件,系统服务启动后会判断 属性persist.adb.tls_server.enable 进行相关操作
//如果属性设置不生效,可以在这里添加打印日志查看过程
framework\base\services\core\java\com\android\server\adb\AdbService.java

2、具体修改:

(1)在XXX_device.mk 添加属性
persist.adb.tls_server.enable = 1

手动添加,也是会记忆的!

(2)设置固定端口号
+++ b/release/packages/modules/adb/daemon/adb_wifi.cpp
@@ -160,7 +160,8 @@ static void enable_wifi_debugging() {
     if (sTlsServer != nullptr) {
         delete sTlsServer;
     }
-    sTlsServer = new TlsServer(0);
+    // default port 0 means random,change to 5555 ,by liwenzhi
+    sTlsServer = new TlsServer(5555);
     if (!sTlsServer->Start()) {
         LOG(ERROR) << "Failed to start TlsServer";
         delete sTlsServer;
         
(3)去除判断网络后,设置 ADB_WIFI_ENABLED 为 0 的代码

一个是初始化的时候判断,另外一个是监听网络变化的时候判断,都去掉就行。

+++ b/release/frameworks/base/services/core/java/com/android/server/adb/AdbDebuggingManager.java
public class AdbDebuggingManager {


                case MSG_ADBDWIFI_ENABLE: {
                    if (mAdbWifiEnabled) {
                        break;
                    }

                    //not to check network state ,change by  liwenzhi //(1)去除下面一大段判断网络和监听网络的代码
                    /** AdbConnectionInfo currentInfo = getCurrentWifiApInfo();
                    if (currentInfo == null) {
                        Settings.Global.putInt(mContentResolver,
                                Settings.Global.ADB_WIFI_ENABLED, 0); //关闭 adb wifi
                        break;
                    }

                    if (!verifyWifiNetwork(currentInfo.getBSSID(),
                            currentInfo.getSSID())) {
                        // This means that the network is not in the list of trusted networks.
                        // We'll give user a prompt on whether to allow wireless debugging on
                        // the current wifi network.
                        Settings.Global.putInt(mContentResolver,
                                Settings.Global.ADB_WIFI_ENABLED, 0);
                        break;
                    }

                    setAdbConnectionInfo(currentInfo); **/
                    //no listener network change for disable adb_wifi,by  liwenzhi
                    /** IntentFilter intentFilter =
                            new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
                    intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
                    mContext.registerReceiver(mBroadcastReceiver, intentFilter); **/

                    SystemProperties.set(WIFI_PERSISTENT_CONFIG_PROPERTY, "1");


                case MSG_ADBDWIFI_DISABLE:
                    if (!mAdbWifiEnabled) {
                        break;
                    }
                    mAdbWifiEnabled = false;
                    setAdbConnectionInfo(null);
                    //no need unregisterReceiver, because no listener network,chenge by liwenzhi,//(2)监听已经注释,不需要再注销监听
                    //mContext.unregisterReceiver(mBroadcastReceiver);


                case MSG_ADBWIFI_ALLOW:
                    if (mAdbWifiEnabled) {
                        break;
                    }
                    String bssid = (String) msg.obj;
                    boolean alwaysAllow = msg.arg1 == 1;
                    if (alwaysAllow) {
                        mAdbKeyStore.addTrustedNetwork(bssid);
                    }

                    // Let's check again to make sure we didn't switch networks while verifying
                    // the wifi bssid.
                    //no to check network ,change by  liwenzhi //(3)不需要判断网络
                    /** AdbConnectionInfo newInfo = getCurrentWifiApInfo();
                    if (newInfo == null || !bssid.equals(newInfo.getBSSID())) {
                        break;
                    }

                    setAdbConnectionInfo(newInfo); **/
                    Settings.Global.putInt(mContentResolver,
                            Settings.Global.ADB_WIFI_ENABLED, 1);
                    //no listener network change for disable adb_wifi,by  liwenzhi //(4)不需要要监听网络变化
                    /** IntentFilter intentFilter =
                            new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
                    intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
                    mContext.registerReceiver(mBroadcastReceiver, intentFilter); **/

                    SystemProperties.set(WIFI_PERSISTENT_CONFIG_PROPERTY, "1");


三、日志查看

日志查看主要是:AdbService.java、AdbDebuggingManager.java、adb_wifi.cpp
AdbService 的日志默认是关闭模式的,需要设置成true,并且如果要看里面数据具体值,相关属性的日志需要自己添加打印出来。
AdbDebuggingManager 是有相关异常过程日志的
adb_wifi 该文件的打印,TAG 是adbd, 不管有没有打开adb,整个系统是一直有这个 adbd 的相关打印的,每秒大概有十几行日志!

这里查看打印相关日志多个关键字的信息命令:


logcat | grep -E "lwz|AdbService|changed to|adb wifi|AdbDebuggingManager"

lwz 是我自己加的关键字。

通过日志查看,正常开启的情况大概日志过程是:


01-01 08:00:22.756   496   511 I adbd    : Waiting for persist.adb.tls_server.enable=1
08-16 15:13:50.123   762   762 D SystemServerTiming: StartAdbService
08-16 15:13:51.528   762   762 D AdbService: systemReady //修改 DEBUG = true 才看到的日志
08-16 15:13:51.528   762   762 D AdbService: lwz systemReady= persist.adb.tls_server.enable = 1 //自己加的日志打印
08-16 15:13:51.528   762   762 D AdbService: lwz systemReady mIsAdbWifiEnabled= true //自己加的日志打印,确认查看服务启动是否打开 adb
08-16 15:13:58.993   762   799 D AdbService: setAdbEnabled(true), mIsAdbUsbEnabled=true, mIsAdbWifiEnabled=true, transportType=0
08-16 15:13:58.994   762   762 D AdbService: lwz onChange shouldEnable = true
08-16 15:13:58.995   762   799 D AdbService: setAdbEnabled(true), mIsAdbUsbEnabled=true, mIsAdbWifiEnabled=true, transportType=1
08-16 15:13:59.015   762   802 D ActivityManagerTiming: OnBootPhase_1000_com.android.server.adb.AdbService$Lifecycle
08-16 15:13:59.016   762   802 V ActivityManagerTiming: OnBootPhase_1000_com.android.server.adb.AdbService$Lifecycle took to complete: 1ms
08-16 15:13:59.016   762   799 D AdbService: boot completed
08-16 15:13:59.033   496   511 I adbd    : persist.adb.tls_server.enable changed to 1 //正常开启adb的日志
08-16 15:13:59.056   496   511 I adbd    : adb wifi started on port 5555
08-16 15:13:59.058   496   511 I adbd    : Waiting for persist.adb.tls_server.enable=0

如果未屏蔽网络判断,添加打印日志查看过程:

08-18 16:51:20.104   762   762 D SystemServerTiming: OnBootPhase_550_com.android.server.adb.AdbService$Lifecycle
08-18 16:51:20.104   762   762 D AdbService: systemReady
08-18 16:51:20.105   762   762 D AdbService: lwz systemReady mIsAdbWifiEnabled= true //这里说明,prop 属性已经设置了
08-18 16:51:26.248   762   798 I AdbDebuggingManager: Not connected to any wireless network. Not enabling adbwifi. //这里提示没网络,会执行关闭adb
08-18 16:51:26.586   762   762 D AdbService: lwz onChange shouldEnable = false
08-18 16:51:27.411   762   762 D AdbService: lwz onChange shouldEnable = false
08-18 16:51:27.971   762   798 D AdbService: setAdbEnabled(true), mIsAdbUsbEnabled=true, mIsAdbWifiEnabled=true, transportType=0
08-18 16:51:27.972   762   798 D AdbService: setAdbEnabled(false), mIsAdbUsbEnabled=true, mIsAdbWifiEnabled=true, transportType=1 //关闭adb
08-18 16:51:27.973   510   517 I adbd    : persist.adb.tls_server.enable changed to 0  //到这里 persist.adb.tls_server.enable 属性又变成了 0
08-18 16:51:27.973   510   517 I adbd    : adb wifi stopped
08-18 16:51:27.981   762   798 D AdbService: Broadcasting enable = false, type = 1

这个也是为啥配置了那个 persist.adb.tls_server.enable =1 属性后,系统启动发现获取属性还是0 ,并且wifi adb未打开。

四、其他

1、adb 相关属性

(1) prop属性:persist.adb.tls_server.enable

系统启动后,AdbService 会判断该属性决定后续是否执行开启adb。

(2)prop属性:service.adb.tls.port

该属性是 adb_wifi.cpp 使能adb的时候设置的. 后续让你知道它的端口号。
所以设置这个属性值是没有意义的。
在 adb_wifi.cpp,初始化 TlsServer 设置固定端口 5555,那么这个属性一直就是 5555.

(3)Settings属性:Settings.Global.ADB_WIFI_ENABLED “adb_wifi_enabled”

同时在 AdbService 是有监听 这个Global 属性的变化,关联上 AdbDebuggingManager ,设置 adb 使能。

查询和设置命令:


//查询属性;
setttings get global adb_wifi_enabled
//设置属性 0/1:
setttings put global adb_wifi_enabled 1

该属性是系统上层设置的一个值,原本主要用来记录adb wifi 的开关状态。
因为Android13 会判断当前wifi是否是信任的,切换wifi后设置这个属性是无效的。

但是如果修改了上面去除网络限制对策后,直接设置Global属性,是会正常开关adb的。

如果未去除网络限制对策,你会发现 adb_wifi_enabled 无法设置成1,
因为 AdbDebuggingManager 在开启的是会还会判断网络情况,如果没有网络会设置为 0 .

2、AdbService.java、AdbDebuggingManager.java、adb_wifi.cpp 的关系

(1) adb_wifi 是底层init/cpp 启动的服务

具体哪里启动的暂不去研究
里面的日志是跑在比较前面的,比SystemServer 更早。
同时也是具体能够使能 网络adb 的关键;
也是为啥设置了 persist.adb.tls_server.enable=1 能够直接使能网络adb的原因。
正常开启和关闭adb 是有相关日志的。

(2)AdbService启动时机

AdbService 是SystemServer 执行 startOtherServices 里面启动的服务。

AdbService extends IAdbManager.Stub //具体暴露接口可以看 IAdbManager

AdbDebuggingManager 是一个管理adbDebug的类,在 AdbService 里面实例化,其实就是分化了一下具体执行的代码。

很多无法进入adb wifi 的情况都是在AdbDebuggingManager 拒绝的,并且重新设置了 Global属性 和 Prop 属性为0

(3)ramework\base\core\java\android\debug\IAdbManager.aidl
package android.debug;

import android.debug.FingerprintAndPairDevice;
import android.debug.IAdbCallback;

/**
 * Interface to communicate remotely with the {@code AdbService} in the system server.
 *
 * @hide //隐藏的!
 */
interface IAdbManager {

    /**
     * Allow ADB debugging from the attached host. If {@code alwaysAllow} is
     * {@code true}, add {@code publicKey} to list of host keys that the
     * user has approved.
     *
     * @param alwaysAllow if true, add permanently to list of allowed keys
     * @param publicKey RSA key in mincrypt format and Base64-encoded
     */
    void allowDebugging(boolean alwaysAllow, String publicKey);

    /**
     * Deny ADB debugging from the attached host.
     */
    void denyDebugging();

    /**
     * Deny ADB wireless debugging on the connected network.
     */
    void denyWirelessDebugging();

    /**
     * Returns true if device supports secure Adb over Wi-Fi.
     */
    boolean isAdbWifiSupported();

}

上面接口估计对开发者没啥用!

适配了去除网络限制上面代码后,就应用而言,使用 Settings.Global.ADB_WIFI_ENABLED 控制和或者当前 网络adb状态最合适的。
虽然使用prop 属性也能生效,但是系统应用Settings判断的是Settings.Global.ADB_WIFI_ENABLED的值是否为1,会出现状态显示不同步的情况。文章来源地址https://www.toymoban.com/news/detail-658088.html

到了这里,关于Android13 网络 Adb 默认开启的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 13 wifi adb设置固定端口解决

    本文只管解决介绍不做代码层面具体分析。 Android13 wifi adb 做了一些变更,不管是代码层面还是用户使用层面都是做了修改! 具体来说应该是Android12 就变更了,因为我之前一直开发Android11 网络, 最近系统版本变更到 Android13 ,发现代码上确实做了较多变更。 我这里是Tv平台

    2024年02月15日
    浏览(28)
  • android如何通过adb快速开启、关闭辅助副屏

    adb 指令 效果

    2024年02月01日
    浏览(41)
  • Android 11编译第三弹 ADB开启ROOT权限

    问题:Relese版本,默认adb访问会降级到shell权限,一些敏感操作不能进行,远程调试比较麻烦。且Release版本没有su模块,不能切换Root用户。 开启adb调试以后,默认进入adb是system权限,不能切换到root(因为Release没有集成su). 有两种方式切换Root: 1) Release也集成su模块 2)默认

    2024年02月09日
    浏览(39)
  • Android13 adb input 调试命令使用和源码解析

    目录 一、概述 二、常用命令 2.1 输入文本 2.2 模拟按键 2.3 模拟点击 2.4 模拟滑动 2.5 模拟长按 2.6 模拟滚动 三、进阶用法 3.1 组合按键的用法 3.2 长按power键 3.3 输入中文 3.4 代码模拟发送按键 1. 方法1: 2. 方法2: 3. 方法3: 四、注意事项 五、源码解析 六、总结 好了 本篇作为And

    2024年01月20日
    浏览(48)
  • 高通Android系列随身WIFI强行开启adb,关闭商家远程控制

    目前市面上便宜的随身wifi大概分为高通、中芯微、MTK几家的SOC。大部分Android产品都关闭了adb或者开启的是user adb,没有root权限。下面说说高通系列如何强行开root adb,以及关闭部分机器远程控制功能。 如果机器默认未开启adb,就需要直接使用硬件方式进入9008进行备份和刷机,

    2024年02月07日
    浏览(27)
  • rk3588配置uac功能,android13使能uac及adb的复合设备

              最近,因新增需求需要在现有产品上增加UAC的功能,查阅并学习相关知识后,在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uacadb的复合设备。基于开源共享精神希望给大家提供些参考。         (1)我首先预览rockchip发布的文档包,遍历了系统及

    2024年01月20日
    浏览(39)
  • 【Android入门到项目实战--4.8】—— 如何查看数据库?(adb)

    目录 什么是adb? 配置adb 使用adb 本文使用adb shell来查看数据库。         adb是Android SDK中自带的一个调试工具,可以直接对连接在电脑上的手机或模拟器进行调试操作,它存放在sdk的platform-tools目录里,如果想在命令行中使用,先把它的路径配置到环境变量里。       

    2024年02月15日
    浏览(27)
  • 使用网络adb连接android设备

    1.系统默认开启网络adb 1.1 打开cmd管理员,输入adb connect IP,例如:adb connect 192.168.4.39 1.2 返回connected to 192.168.4.39:5555 成功连接 ,可进行其它adb 指令操作,  如连接失败有些设备需要在设置中开启网络adb开关,一般是在开发者选项中。 1.3 断开adb连接 在cmd窗口中输入adb discon

    2024年02月15日
    浏览(34)
  • adb修改android系统时间 adb shell date必须要root权限

    以下是一个示例代码,展示如何实现这个格式化: 请注意, GetSystemTime 函数获取的是 GMT 时间,所以如果你需要的是本地时间的毫秒数,应该使用 GetLocalTime 函数替换 GetSystemTime 。同时,这种方法假定系统时区设置是正确的。如果系统时区设置不正确,计算出的时间可能会有

    2024年02月02日
    浏览(39)
  • Android系统 adb shell auth授权使用

    adb shell是Android开发者常用的一个工具,它可以让我们在电脑上通过USB或网络连接到Android设备,并执行一些命令或操作。但是,有时候我们可能不想让任何人都能随意使用adb shell,而是需要一些授权或验证的机制,以保护我们的设备和数据。本文将介绍如何在基于rockchip rk35

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包