La red Android13 Adb está habilitada de forma predeterminada

Adb de red de Android 13 está habilitado de forma predeterminada

I. Introducción

¡A través del análisis de código, se descubrió que la red adb está restringida en Android 13!
Requisitos del código nativo de Android13: debe estar conectado a una determinada wifi antes de poder usar adb, y cambiar o apagar wifi detendrá adb.

Si desea hacer Android 11 o el mismo que antes, la computadora puede conectarse directamente a adb después de que el dispositivo esté conectado a una red WiFi/cableada, y el código del sistema debe adaptarse y modificarse.


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

Pensé que estaría bien configurar el número de puerto y la propiedad persist.adb.tls_server.enable, pero todavía hay algunos errores pequeños y todavía necesito estudiar el proceso específico por completo.

2. Implementación predeterminada del código adb

1. Directorio modificado:

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. Modificaciones específicas:

(1) Agregar atributos en XXX_device.mk

persist.adb.tls_server.enable = 1

¡Incluso si lo agregas manualmente, será recordado!

(2) Establecer un número de puerto fijo

+++ 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) Después de eliminar el código para determinar la red, configure ADB_WIFI_ENABLED en 0

Uno se juzga durante la inicialización y el otro se juzga cuando se monitorean los cambios en la red, simplemente elimínelos.

+++ 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");


3. Visualización de registros

Los registros principales para ver son: AdbService.java, AdbDebuggingManager.java, adb_wifi.cpp.
Los registros de AdbService están en modo cerrado de forma predeterminada y deben configurarse en verdadero. Si desea ver los valores específicos de los datos En el interior, usted mismo debe agregar e imprimir los registros de atributos relacionados. AdbDebuggingManager es la impresión del archivo adb_wifi con registros de procesos de excepción relacionados. La TAG es adbd. Independientemente de si adb está abierto o no, todo el sistema siempre tiene impresiones relacionadas con adbd. ¡Hay alrededor de una docena de líneas de registros por segundo
!

Estos son los comandos de información para imprimir varias palabras clave en registros relacionados:


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

lwz es una palabra clave que agregué yo mismo.

Al ver los registros, el proceso de registro aproximado para el inicio normal es el siguiente:


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

Si el juicio de la red no está bloqueado, agregue el proceso de visualización del registro de impresión:

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

Esta es también la razón por la que después de configurar el atributo persist.adb.tls_server.enable =1, el inicio del sistema encontró que el atributo obtenido todavía era 0 y wifi adb no estaba activado.

4. Otros

1. atributos relacionados con adb

(1) propiedad de prop:persist.adb.tls_server.enable

Una vez que se inicia el sistema, AdbService juzgará esta propiedad para determinar si se debe abrir adb posteriormente.

(2) atributo de propiedad: service.adb.tls.port

Esta propiedad la establece adb_wifi.cpp cuando adb está habilitado. Le permitirá saber su número de puerto más adelante.
Por lo tanto, establecer el valor de esta propiedad no tiene sentido.
En adb_wifi.cpp, inicialice TlsServer y configure el puerto fijo 5555, entonces este atributo siempre será 5555.

(3) Configuración: Configuración.Global.ADB_WIFI_ENABLED “adb_wifi_enabled”

Al mismo tiempo, AdbService monitorea los cambios en el atributo Global, lo asocia con AdbDebuggingManager y configura la habilitación de adb.

Consultar y establecer comandos:


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

Este atributo es un valor establecido por la capa superior del sistema y originalmente se usaba principalmente para registrar el estado de encendido/apagado de adb wifi.
Debido a que Android13 determinará si el wifi actual es confiable, configurar este atributo después de cambiar de wifi no es válido.

Sin embargo, si modifica las contramedidas anteriores para eliminar las restricciones de red y establece directamente el atributo Global, adb se activará y desactivará normalmente.

Si no se elimina la contramedida de restricción de red, encontrará que adb_wifi_enabled no se puede establecer en 1,
porque AdbDebuggingManager aún determinará la condición de la red cuando esté encendido y se establecerá en 0 si no hay red.

2. La relación entre AdbService.java, AdbDebuggingManager.java y adb_wifi.cpp

(1) adb_wifi es un servicio iniciado por el init/cpp subyacente

No estudiaré la ubicación específica donde se inicia.
Los registros internos se ejecutan antes, antes que SystemServer.
También es la clave para habilitar específicamente el adb de la red;
también es la razón por la cual configurar persist.adb.tls_server.enable=1 puede habilitar el adb de la red directamente.
Hay registros relacionados para abrir y cerrar adb normalmente.

(2) Tiempo de inicio de AdbService

AdbService es un servicio que se inicia cuando SystemServer ejecuta startOtherServices.

AdbService extiende IAdbManager.Stub // Para interfaces expuestas específicas, consulte IAdbManager

AdbDebuggingManager es una clase que administra adbDebug, se instancia en AdbService y en realidad divide el código de ejecución específico.

AdbDebuggingManager rechaza muchas situaciones en las que no se puede acceder a adb wifi y el atributo Global y el atributo Prop se restablecen a 0.

(3) marco\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();

}

¡La interfaz anterior probablemente sea de poca utilidad para los desarrolladores!

Después de adaptar el código anterior para eliminar las restricciones de la red, en lo que respecta a la aplicación, lo más apropiado es usar Settings.Global.ADB_WIFI_ENABLED para controlar o el estado actual de adb de la red.
Aunque el uso del atributo prop también puede surtir efecto, el sistema usa Configuración para determinar si el valor de Settings.Global.ADB_WIFI_ENABLED es 1 y la visualización del estado no estará sincronizada.

Supongo que te gusta

Origin blog.csdn.net/wenzhi20102321/article/details/132382549
Recomendado
Clasificación