Android 12 打开网络ADB并禁用USB连接ADB

本文详细解释了RK3588平台上的ADB(AndroidDebugBridge)工作原理,涉及adb的组成部分,如何通过AndroidStudio显示设备名称,以及ADB的启用和USB/Wi-Fi调试状态的控制,包括系统属性如`persist.sys.usb.config`和`ADB_ENABLED`在其中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

平台

RK3588 + Android 12

Android 调试桥 (adb)
    Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。adb 提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

  • 客户端:用于发送命令。客户端在开发机器上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
  • 守护程序 (adbd):用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
  • 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。

AndroidStudio 中显示的设备名称

在这里插入图片描述
第一个 rockchip 来自系统属性: ro.product.product.manufacturer
第二个一般是ro.product.model
PS 如果 manufacturer 和 model 一样, 那么会只显示一个的值.

ADB使能和控制USB调试

  • ADB调试的开关:
    系统属性persist.sys.usb.config值里是否包含adb
    系统设置数据库Settings.Global.ADB_ENABLED值是否为非0

frameworks/base/services/core/java/com/android/server/adb/AdbService.java

    private static final String USB_PERSISTENT_CONFIG_PROPERTY = "persist.sys.usb.config";

    private void initAdbState() {
        try {
            /*
             * Use the normal bootmode persistent prop to maintain state of adb across
             * all boot modes.
             */
            mIsAdbUsbEnabled = containsFunction(
                    SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""),
                    UsbManager.USB_FUNCTION_ADB);
            mIsAdbWifiEnabled = "1".equals(
                    SystemProperties.get(WIFI_PERSISTENT_CONFIG_PROPERTY, "0"));

            // register observer to listen for settings changes
            mObserver = new AdbSettingsObserver();
            mContentResolver.registerContentObserver(
                    Settings.Global.getUriFor(Settings.Global.ADB_ENABLED),
                    false, mObserver);
            mContentResolver.registerContentObserver(
                    Settings.Global.getUriFor(Settings.Global.ADB_WIFI_ENABLED),
                    false, mObserver);
        } catch (Exception e) {
            Slog.e(TAG, "Error in initAdbState", e);
        }
    }

    private void setAdbEnabled(boolean enable, byte transportType) {
        if (DEBUG) {
            Slog.d(TAG, "setAdbEnabled(" + enable + "), mIsAdbUsbEnabled=" + mIsAdbUsbEnabled
                    + ", mIsAdbWifiEnabled=" + mIsAdbWifiEnabled + ", transportType="
                        + transportType);
        }

        if (transportType == AdbTransportType.USB && enable != mIsAdbUsbEnabled) {
            mIsAdbUsbEnabled = enable;
        } else if (transportType == AdbTransportType.WIFI && enable != mIsAdbWifiEnabled) {
            mIsAdbWifiEnabled = enable;
            if (mIsAdbWifiEnabled) {
                if (!AdbProperties.secure().orElse(false) && mDebuggingManager == null) {
                    // Start adbd. If this is secure adb, then we defer enabling adb over WiFi.
                    SystemProperties.set(WIFI_PERSISTENT_CONFIG_PROPERTY, "1");
                    mConnectionPortPoller =
                            new AdbDebuggingManager.AdbConnectionPortPoller(mPortListener);
                    mConnectionPortPoller.start();
                }
            } else {
                // Stop adb over WiFi.
                SystemProperties.set(WIFI_PERSISTENT_CONFIG_PROPERTY, "0");
                if (mConnectionPortPoller != null) {
                    mConnectionPortPoller.cancelAndWait();
                    mConnectionPortPoller = null;
                }
            }
        } else {
            // No change
            return;
        }

        if (enable) {
            startAdbd();
        } else {
            stopAdbd();
        }

        for (IAdbTransport transport : mTransports.values()) {
            try {
                transport.onAdbEnabled(enable, transportType);
            } catch (RemoteException e) {
                Slog.w(TAG, "Unable to send onAdbEnabled to transport " + transport.toString());
            }
        }

        if (mDebuggingManager != null) {
            mDebuggingManager.setAdbEnabled(enable, transportType);
        }
    }

    private void startAdbd() {
        SystemProperties.set(CTL_START, ADBD);
    }

    private void stopAdbd() {
        if (!mIsAdbUsbEnabled && !mIsAdbWifiEnabled) {
            SystemProperties.set(CTL_STOP, ADBD);
        }
    }

使用设置系统属性ctl.start启动和ctl.stop停止adbd服务

  • 增加系统控制是否启用USB调试

packages/modules/adb/daemon/main.cpp

int adbd_main(int server_port) {
    umask(0);

    signal(SIGPIPE, SIG_IGN);
//.....
#if defined(__ANDROID__)
	bool adb_usb_on = android::base::GetBoolProperty("persist.adb.adb_usb", false);
    if (access(USB_FFS_ADB_EP0, F_OK) == 0 && adb_usb_on) {
        // Listen on USB.
        usb_init();
        is_usb = true;
    }
#endif

修改系统属性后, 重启adbd服务生效.

  • 默认网络ADB调试端口
    系统属性service.adb.tcp.port

修改 packages/modules/adb/daemon/main.cpp 需注意, 可能导致烧录后不能启动, 卡在下面LOG:

emmc_point is /dev/block/mmcblk0
sd_point is (null)
sd_point_2 is (null)
read cmdline
I:Boot command: boot-recovery
I:Got 2 arguments from boot message
ensure_path_mounted path=/cache/recovery/last_locale 
I:[libfs_mgr]superblock s_max_mnt_count:65535,/dev/block/by-name/cache
I:[libfs_mgr]__mount(source=/dev/block/by-name/cache,target=/cache,type=ext4)=0: Success
Loading make_device from librecovery_ui_ext.so
W:Failed to read max brightness: No such file or directory
I:Screensaver disabled
          erasing_text: zh (81 x 38 @ 5031)
       no_command_text: zh (111 x 38 @ 5031)
            error_text: zh (65 x 38 @ 5031)
W:Failed to load bitmap cancel_wipe_data_text for locale zh-Hans-CN (error -1). Falling back to use default locale.
E:Failed to load bitmap cancel_wipe_data_text for locale en-US (error -1)
W:Failed to load bitmap factory_data_reset_text for locale zh-Hans-CN (error -1). Falling back to use default locale.
E:Failed to load bitmap factory_data_reset_text for locale en-US (error -1)
W:Failed to load bitmap try_again_text for locale zh-Hans-CN (error -1). Falling back to use default locale.
E:Failed to load bitmap try_again_text for locale en-US (error -1)
W:Failed to load bitmap wipe_data_confirmation_text for locale zh-Hans-CN (error -1). Falling back to use default loc.
E:Failed to load bitmap wipe_data_confirmation_text for locale en-US (error -1)
W:Failed to load bitmap wipe_data_menu_header_text for locale zh-Hans-CN (error -1). Falling back to use default loca.
E:Failed to load bitmap wipe_data_menu_header_text for locale en-US (error -1)
I:Starting recovery (pid 258) on Fri Nov 17 01:15:53 2023

I:locale is [zh-Hans-CN]
SELinux: Loaded file_contexts
<think>好的,我现在需要在RK3588芯片的Android 12源码中找到禁用adb连接的方法。用户提到他们之前在device/common/目录下找到了相关代码,但因为冲突被禁用了。我需要先理解adbAndroid系统中的工作方式,以及如何通过修改源码来禁用adb connect功能。 首先,adbAndroid Debug Bridge)是Android开发工具包中的一个重要组件,允许开发者通过USB网络与设备通信。禁用adb connect可能涉及阻止adb守护进程(adbd)的启动或修改其配置,使其不接受连接请求。 在Android系统中,adbd的启动通常由init进程控制,相关配置可能在init.rc文件里。我需要查找RK3588的init脚本,看看adbd的启动条件。如果能够注释掉或修改启动adbd的服务,可能就能禁用adb。不过这样可能会完全禁用adb,而不仅仅是adb connect。用户可能希望保留USB调试,但禁止网络连接?需要进一步确认需求,但用户的问题明确是禁用adb connect,也就是网络连接部分。 另外,adbd的源码位于system/core/adb目录下。可能需要修改adbd的代码,使其不监听网络端口。例如,在adbd_main函数中,可能有关于网络连接的部分,比如调用adb_listen_on_tcp_port的函数。如果注释掉这部分代码,或者添加条件编译,可能可以禁用TCP连接,只保留USB。 同时,查看用户提供的引用[1],提到在device/common/下有usb和uart的代码,但被禁用了。可能之前的修改涉及到这些部分,导致冲突。现在需要找到RK3588特定的device目录,比如device/rockchip/rk3588,或者类似的路径,查看其中的mk文件或rc文件,是否有控制adbd启动的配置。 另外,在系统属性中,adb默认的网络端口是5555。可以通过设置系统属性service.adb.tcp.port为0来禁用TCP连接。这可能在build.prop或system.prop中设置,或者在init脚本中通过setprop命令实现。但用户需要的是源码级别的修改,而不是运行时设置。 可能还需要修改adbd的编译配置,比如在Android.mk中添加宏定义,使得网络功能被禁用。例如,添加-DADB_TCP=0之类的编译选项,阻止TCP相关代码的编译。 需要逐步检查这些可能的修改点: 1. 检查init.rc文件,找到启动adbd的服务,修改其触发条件,比如将on property:sys.usb.config=adb改为其他条件,或者直接移除该服务。但这样可能影响USB调试功能。 2. 修改adbd的源码,在system/core/adb/adbd_main.cpp中,找到启动TCP监听的代码部分。例如,函数调用setup_port(5555, &tcp_transport)之类的代码,将其注释掉或条件编译掉。 3. 在设备特定的makefile中,比如device.mk,添加系统属性设置,如persist.adb.tcp.port=0,或者在系统属性配置文件中设置。 4. 检查是否有SElinux策略阻止adb网络连接,但用户的问题是需要通过源码修改来禁用,而不是配置SElinux。 接下来需要具体查找RK3588 Android 12源码中的相关文件路径。根据引用[1],之前是在device/common/下找到相关代码,但被禁用了。可能现在需要针对RK3588的平台代码进行修改,可能在device/rockchip/rk3588或类似的目录下。 可能的步骤: - 在device/rockchip/rk3588/目录下查找init.rc或类似的文件,查看adbd服务的启动配置。例如,在init.rk3588.rc中,可能有类似service adbd /system/bin/adbd的段落,可以设置disabled标志,或者修改其class属性,使其不自动启动。 - 如果adbd的启动依赖于某些属性,比如ro.debuggable,可能需要修改系统属性,使得ro.debuggable=0,这样adbd不会自动启动。但这样可能影响其他调试功能。 - 在系统构建时,通过PRODUCT_PROPERTY_OVERRIDES设置service.adb.tcp.port=0,禁止TCP监听。这可以在设备对应的product mk文件中设置。 - 修改adbd的源码,在system/core/adb/daemon/main.cpp中,找到函数start_device_log(),或者在adb_listen_on_tcp_port函数处,添加条件判断,使其返回而不监听TCP端口。 例如,在main函数中,可能有一段代码: if (usb || !should_drop_privileges()) { // 启动USB或TCP监听 } 可以在这里添加条件,或者直接注释掉TCP监听部分。 此外,还需要考虑用户是否需要完全禁用adb,还是仅禁用网络adb。如果是后者,可能需要保留USB adb,但禁用TCP连接。因此,修改TCP监听部分更合适。 另外,引用[4]中提到通过pm命令查看包路径,这可能与当前问题无关,但用户提供的引用可能提示其他可能的修改点,比如系统服务配置。 总结可能的源码修改步骤: 1. 修改adbd源码,禁止TCP监听:在system/core/adb/daemon/main.cpp中,注释掉或条件编译掉涉及adb_listen_on_tcp_port的部分。 2. 在设备特定的init配置中,禁止adbd服务启动,或者修改其启动条件。 3. 在系统属性中设置service.adb.tcp.port=0,禁止TCP端口监听。 需要验证这些方法中哪些在源码层面可行,且适合RK3588平台。 例如,在RK3588的设备树中,可能有一个BoardConfig.mk文件,可以在这里添加编译选项,或者修改系统属性。 具体实现方式可能涉及: - 在device/rockchip/rk3588/目录下的某个mk文件中,添加PRODUCT_PROPERTY_OVERRIDES += service.adb.tcp.port=0 - 修改init.rc文件,将adbd服务设置为disabled,或者修改触发条件,比如只有在USB连接时才启动。 - 修改adbd的Android.mk文件,添加编译宏,例如LOCAL_CFLAGS += -DADB_TCP=0,从而在编译时禁用TCP相关代码。 需要进一步查阅adbd的源码,确认如何正确禁用TCP监听。例如,在system/core/adb/daemon/main.cpp中,有以下代码段: static void adbd_init() { ... int usb = 0; int tcp = 0; if (access(USB_ADB_PATH, F_OK) == 0 || access(USB_FFS_ADB_EP0, F_OK) == 0) { usb = 1; } if (access("/dev/android_adb_enable", F_OK) == 0) { tcp = 1; } ... if (tcp) { adbd_listen_on_tcp_port(); } } 如果可以将tcp设置为0,或者条件不满足,则不会监听TCP端口。可能可以通过修改设备配置,使得access("/dev/android_adb_enable", F_OK)返回失败,或者直接修改代码中的条件。 或者,在设备启动时,不创建/dev/android_adb_enable节点,从而使得tcp变量为0。 但这种方法可能需要修改内核或驱动代码,较为复杂。更直接的方法是在adbd的代码中直接注释掉tcp的处理部分。 另一种方法是在adbd的main函数中,直接跳过TCP监听部分。例如,修改: void adbd_main() { ... if (use_tcp) { setup_tcp(); } ... } 将use_tcp设置为false,或者直接注释掉setup_tcp()的调用。 需要找到具体的代码位置,例如在adbd_main函数中,可能调用了adb_listen_on_tcp_port(5555)之类的函数,可以将其注释掉。 或者,在system/core/adb/transport.cpp中,修改adb_listen_on_tcp_port函数,使其返回失败。 例如: int adb_listen_on_tcp_port(int port) { return -1; // 直接禁止TCP监听 } 这样可以确保任何尝试监听TCP端口的操作都会失败。 此外,还需要确保在adbd启动时,不会尝试监听TCP端口。这可能需要在编译时通过宏定义来控制,例如在Android.mk中添加: LOCAL_CFLAGS += -DADB_TCP=0 然后在代码中: #ifndef ADB_TCP #define ADB_TCP 1 #endif ... if (ADB_TCP) { // 启动TCP监听 } 这样,当编译时定义ADB_TCP为0时,相关代码不会被编译进去。 综上,具体的源码修改步骤可能包括: 1. 修改adbd的代码,禁用TCP监听功能,可以通过条件编译或直接注释代码。 2. 在设备特定的配置文件中,禁止adbd服务启动或修改其启动参数。 3. 设置系统属性,禁止TCP端口监听。 现在,需要将这些可能的步骤具体化到RK3588 Android 12的源码中。 例如,针对禁用adb connect(即TCP连接),可以在adbd的源码中禁用TCP监听,重新编译系统镜像。 具体步骤可能如下: - 修改system/core/adb/daemon/main.cpp中的相关代码,移除或注释掉TCP监听的代码。 - 在设备配置中确保adbd服务不会因为其他原因启动TCP监听。 - 编译烧写系统镜像,测试adb connect是否被禁用。 同时,需要注意这些修改是否会影响USB调试功能。如果用户希望保留USB调试,则只需禁用TCP部分,而保留USB部分的代码。 因此,最安全的方法是仅修改TCP监听部分,而不是完全禁用adbd。 最后,需要验证修改后的系统是否仍然支持USB adb,但拒绝网络adb连接。</think>在RK3588的Android 12源码中禁用`adb connect`(即adb的TCP连接功能),需通过修改源码禁止adbd守护进程监听TCP端口。以下是具体步骤: --- ### **步骤1:修改adbd源码,禁用TCP监听** 1. **定位源码文件** adbd的源码位于`system/core/adb/daemon/main.cpp`。在该文件中找到TCP监听相关的代码段,例如: ```cpp // 示例代码段(具体行号可能因版本不同而变化) if (tcp_enabled) { adb_listen_on_tcp_port(5555); // 监听TCP端口5555 } ``` 将其注释或删除,或添加条件判断直接跳过该逻辑。 2. **强制禁用TCP监听** 修改`adb_listen_on_tcp_port`函数,使其直接返回失败: ```cpp int adb_listen_on_tcp_port(int port) { return -1; // 禁止TCP监听 } ``` 或通过宏定义全局禁用TCP功能(推荐): ```makefile # 在adbd的Android.mk或相关编译配置中添加宏定义 LOCAL_CFLAGS += -DADB_TCP=0 ``` --- ### **步骤2:修改设备初始化配置** 1. **禁止TCP端口的系统属性** 在设备特定的`system.prop`或`build.prop`文件中添加: ```properties service.adb.tcp.port=0 ``` 或在`device/rockchip/rk3588/device.mk`中通过`PRODUCT_PROPERTY_OVERRIDES`设置: ```makefile PRODUCT_PROPERTY_OVERRIDES += service.adb.tcp.port=0 ``` 2. **调整init.rc中的adbd服务配置** 在`init.rk3588.rc`或类似文件中,确保adbd服务仅在USB模式下启动: ```rc service adbd /system/bin/adbd class core socket adbd stream 660 system system disabled seclabel u:r:adbd:s0 # 仅当USB配置为adb时启动 on property:sys.usb.config=adb start adbd ``` --- ### **步骤3:重新编译验证** 1. **编译系统镜像** 执行完整编译: ```bash source build/envsetup.sh lunch rk3588-userdebug # 根据实际配置选择 make -j$(nproc) ``` 2. **验证修改效果** - **USB调试**:通过USB连接设备,确认`adb devices`可识别设备。 - **TCP连接**:尝试`adb connect <设备IP>`,应提示连接失败。 --- ### **关键引用说明** - 引用[1]提到`device/common/`下的代码冲突,需注意RK3588的设备树路径可能为`device/rockchip/rk3588/`,修改时需优先检查该目录下的配置[^1]。 - 引用[4]的`pm list packages`命令与adb管理无关,但系统属性设置(如`service.adb.tcp.port`)是禁用TCP监听的核心[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值