¿Cómo abrir ViewServer en el teléfono móvil de Root para que HierachyViewer pueda conectarse?
Para obtener información sobre qué es un visor de jerarquía, consulte la documentación oficial:/tools/debugging/debugging-ui.html. Comprensión personal: Hierarchy Viewer puede obtener información de la interfaz de usuario en tiempo real del teléfono móvil actual, lo que brinda una gran comodidad a los diseñadores de interfaces y evaluadores automatizados.
La documentación oficial de Android menciona:
Para proteger la seguridad, Hierarchy Viewer solo se puede conectar a dispositivos que ejecutan la versión de desarrollo del sistema Android.
Por razones de seguridad, el visor de jerarquía solo puede conectarse a teléfonos de desarrollo o emuladores de Android (para ser precisos, solo puede conectarse a sistemas Android con parámetros ro.secure iguales a 0 y ro.debuggable igual a 1). ). Cuando el visor de jerarquía está conectado a un teléfono móvil, se debe iniciar un cliente llamado View Server en el teléfono móvil para poder comunicarse con él a través de sockets. En teléfonos comerciales, el servidor de visualización no se puede abrir, por lo que el visor de jerarquía no se puede conectar a teléfonos comerciales normales.
El código fuente de Android implementa esta restricción:
Directorio raíz del código fuente de ANDROID\frameworks\base\services\Java\com\ANDROID\server\WM\WindowManageservice.java.
Un párrafo en:
================================= == ================================================== == ====
startViewServer booleano público (puerto int){
if (isSystemSecure()) {
return false
}
if (!checkCallingPermission(manifest . permiso . dump, " startViewServer ") {
return false
}
. .. .
========================================= == ============================================
El método para verificar si View Server se ha abierto en el teléfono móvil es el siguiente:
Ventana 3 de llamada al servicio ADB Shell
Si el valor de retorno es: resultado: paquete ( 00000000000000 '... ')", El servidor de visualización está cerrado.
Si el valor de retorno es:result:parcel(00000000001 '...'), el servidor de visualización está abierto.
Si es un teléfono móvil que puede abrir View Server. Desarrollar teléfonos móviles, simuladores o teléfonos móviles con parches del sistema según los pasos de esta publicación), podemos usar el siguiente comando para abrir View Server:
Ventana de llamada de servicio de shell ADB 1 i32 4939
Apague el servidor de visualización usando el siguiente comando:
ventana de llamada de servicio de shell adb 2 i32 4939
Pasos de implementación:
Después de un poco de investigación y práctica, descubrí que siempre que el teléfono esté rooteado, instale Busybox y modifique algunos archivos en /system/framework en el teléfono para abrirlo.
Este artículo hace referencia a /tag/viewserver/, y los siguientes son los pasos específicos (estoy basado en Windows, si está ejecutando un sistema operativo Linux, lea la publicación original directamente):
La premisa es que tu teléfono ha obtenido permisos ROOT. Hay BUSYBOX.
Además: lea atentamente los comentarios de esta publicación, tal vez obtenga algo nuevo.
1. Conecte un teléfono móvil comercial a la PC mediante USB para garantizar el funcionamiento normal del servicio adb.
2. Haga una copia de seguridad de los archivos en /system/framework/ del teléfono en la PC. Al realizar una copia de seguridad, asegúrese de que la estructura de carpetas donde se guardan los archivos de copia de seguridad en su PC sea la misma que /system/framework en su teléfono.
Por ejemplo, cree una nueva carpeta ANDROID_SDK_ROOT\system\framework (ANDROID_SDK_ROOT en este artículo se refiere al directorio raíz donde está instalado el SDK de Android).
Luego salta a la carpeta Android_SDK_root\platform-tools en cmd e ingresa el siguiente código para la copia de seguridad:
ADB pull/system/framework ANDROID_SDK_ ROOT \ system \ framework
3. Ingrese a adb shell y genere BOOTCLASSPATH:
Práctica recomendada:
1.echo $ ruta de clase de arranque en adb shell >:/tarjeta SD/ruta de clase de arranque.
2. Regrese al cmd de Windows e ingrese ADB pull/SD card/boot class path.
3.bootclasspath.txt se guardará en la carpeta C:\Users\ su nombre de usuario.
El contenido de este txt se utilizará en el paso 15.
4. Descargue las herramientas baksmali y smali. Estas dos herramientas se utilizan para descompilar y compilar archivos odex.
Dirección de descarga:
/u/5055823/baks Mali-1 . 2. jar
Supongamos que descargué ambos archivos jar al directorio raíz del SDK de ANDROID.
5. Ejecute baksmali para descompilar el archivo services.odex en \system\framework:
Java-jar ANDROID _ SDK _ ROOT \ baks Mali-1 . -a 17-x ANDROID _ SDK _ ROOT \ system \ framework \ servicios . -d ANDROID _ SDK _ ROOT \ system \ framework
Descripción de parámetros:/p/smali/wiki/deodexin construcciones
Especialmente el número después de "-a" indica el nivel de API de su sistema (relacionado con la versión de su sistema). La comparación de la versión del sistema y el nivel de API es la siguiente:
Además, ni siquiera puedes ejecutar java -jar, ¿verdad? ¡Ve a instalar jdk! )
Si este paso es exitoso, se generará una carpeta de salida en la misma carpeta (para mí es ANDROID_SDK_ROOT).
Aquí se ofrece una breve explicación de los archivos odex y los archivos dex.
Archivo Dex: Dex es el nombre completo de Dalvik VM ejecutado, es decir, el programa Android Dalvik Executive, que no es un código de bytes de Java sino un código de bytes de Dalvik y 16 instrucciones de máquina.
Archivo Odex: el archivo dex optimizado se forma optimizando el archivo dex según el modelo específico, lo que mejora la velocidad de ejecución del software y reduce el uso de RAM cuando el software se está ejecutando.
Archivo pequeño: convierte archivos dex en un formato de código legible, un formato común para archivos descompilados.
6. Utilice Eclipse para abrir el archivo out\com\Android\server\WM\windowmanagerservice.smali.
Encuentra la función. El método privado es seguro para el sistema.
============================================ === ======================
. Método privado isSystemSecure()Z
. Regístrate 4
. Prefacio
. Línea 5965
Cadena constante v0, " 1 "
Cadena constante v1, " ro.secure "
Cadena constante v2, " 1 "
invocar-estático {v1, v2}, Landroid/os/SystemProperties. ->get(Ljava/lang/String;ljava/lang/String;)Ljava/lang/String;
Mover objeto de resultado v1
invocar-virtual {v0, v1 } ,Ljava/lang/String;->equals(Ljava/lang/Object;)Z
Mover resultado v0
if-eqz v0,:cond_22
Cadena constante v0, "0"
Cadena constante v1, "ro.debuggable"
Cadena constante v2, "0"
invoke-static {v1 , v2}, Landroid/os/SystemProperties. ->get(Ljava/lang/String;ljava/lang/String;)Ljava/lang/String;
Mover objeto de resultado v1
invocar-virtual {v0, v1 } ,Ljava/lang/String;->equals(Ljava/lang/Object;)Z
Mover resultado v0
if-eqz v0,:cond_22
const/4 v0, 0x1
:goto_21
Devolver v0
:Condition_22
Constante/4 v0, 0x0
ir a :goto_21
. Método de finalización
========================================== === =======================
Agregue una línea "const/" entre las líneas 7 y 8 desde la parte inferior de este código 4 v0, 0x 0": goto _ 21" y "return v0". De esta manera, el valor devuelto por v0 siempre será 0x0, lo cual es falso, omitiendo así el juicio de WindowManagerService.java isSystemSecure
.
El método privado isSystemSecure()Z finalmente se convierte en:
================================= == =================================
. Método privado isSystemSecure()Z
. Regístrate 4
. Prefacio
. Línea 6276
Cadena constante v0, " 1 "
Cadena constante v1, " ro.secure "
Cadena constante v2, " 1 "
invocar-estático {v1, v2}, Landroid/os/SystemProperties. ->get(Ljava/lang/String;ljava/lang/String;)Ljava/lang/String;
Mover objeto de resultado v1
invocar-virtual {v0, v1} ,Ljava/lang/String;->equals(Ljava/lang/Object;)Z
Mover resultado v0
if-eqz v0,:cond_22
Cadena constante v0, "0"
Cadena constante v1, "ro.debuggable"
Cadena constante v2, "0"
invoke-static {v1 , v2}, Landroid/os/SystemProperties. ->get(Ljava/lang/String;ljava/lang/String;)Ljava/lang/String;
Mover objeto de resultado v1
invocar-virtual {v0, v1} ,Ljava/lang/String;->equals(Ljava/lang/Object;)Z
Mover resultado v0
if-eqz v0,:cond_22
const/4 v0, 0x1
:goto_21
Const/4 v0, 0x0
Devolver v0
:Condición_ 22 p>
Constante/4 v0, 0x0
goto:goto_21
. Método de finalización
========================================== === =============================================
7. Ahora ejecute SMALI y vuelva a compilar:
Java-jar SMALI-1 4 2 . El archivo dex debería aparecer en la carpeta ANDROID_SDK_ROOT.
8. Descargue la herramienta de compresión en Windows:
/u/5055823/zip.exe
Supongamos que también coloco zip.exe en la carpeta ANDROID_SDK_ROOT del medio. .
9. Confirme que el directorio de ejecución de la línea de comando cmd actual es ANDROID_SDK_ROOT, ejecute:
zip.exe service_hacked.jar. /classes.dex
En este momento, el paquete services_hacked.jar aparece en la carpeta ANDROID_SDK_ROOT.
10. Ingrese a adb shell e ingrese su para obtener permisos ROOT.
11. Vuelva a montar /system y cambie los permisos del /system.
Pasos de referencia (solo como referencia, asegúrese de utilizar el método correcto adecuado para su teléfono móvil.
Consulte la siguiente respuesta del usuario del "blog de galfordq":
Ingrese mount para verificar qué partición se ha montado /system. Por ejemplo, el mío es:
B. Escriba los siguientes comandos para volver a montar /system y cambiar los permisos de /system (reemplace "/dev/block/mmcblk0p25" con su partición de montaje /system):
mount -o rw, re mount-t yaffs 2/dev/block/mmcblk 0 p 25
Chmod -R 777 /system permite modificar /system a voluntad.
El propósito de este paso es reemplazar servicios.odex en /system/framework en el paso 17. Si este paso no tiene éxito, en el paso 17, es posible que haya un sistema de archivos de solo lectura con permisos insuficientes.
12. Descargue el archivo de empaquetado dexopt.
/u/5055823/dexopt-wrapper
También colocaremos el archivo dexopt-wrapper en la carpeta ANDROID_SDK_ROOT.
13. Copie services_hacked.jar y dexopt-wrapper a la carpeta /data/local/tmp del teléfono.
adb envía ANDROID_SDK_ROOT/services_hacked . jar/data/local/tmp
adb envía ANDROID_SDK_ROOT/dex opt-wrapper/data/local/tmp
14. Ingrese adb shell, ingrese su y cambie los permisos de dexopt-wrapper a 777.
chmod 777/data/local/tmp/dex opt-wrapper
15 En adb shell, en la carpeta cd to /data/local/tmp, ejecute:
. /dexopt-contenedor. /services_hacked.jar. /services _ hacked .odex <La dirección se guardó en el tercer paso de este artículo, pero ":/system/framework/services.jar" debe eliminarse>
Este paso es para optimizar el séptimo dex. archivo en el archivo odex.
============================================ === ================================================= === ======
Por ejemplo, mi comando es:. /dex opt-wrapper.
/services_hacked .jar ./services _ hacked .odex/system/framework/core .jar:/system/framework/ext . /system/framework/
marco . jar:/system/framework/framework 2 . jar:/system/framework/Android política . -XML jar:/system/framework/HTC dev .jar:/system/framework/HTC extension . Android .jar:/system/framework/WiMAX.
/system/framework/USB net.jar:/system/framework/com. p>
============================================= = ================================================== = ======
Esto genera nuestro propio odex: servicios _ hacked.odex en la carpeta /data/local/tmp.
16. Firme nuestro propio service_hacked.odex:
busybox DD if =/system/framework/services . bs = 1 count = 20 skip = 52 seek = 52 conv = not runc
Explicación del parámetro:
if = archivo de entrada
of = archivo de salida p>
bs = tamaño de bloque (1 byte)
count = número de bloques
skip = desplazamiento del archivo de entrada
seek = desplazamiento del archivo de salida
conv = not runc: no trunca el archivo de salida.
17. ¡Reemplace services.odex en /system/framework con nuestro propio services_hacked.odex!
DD if =/data/local/tmp/services _ hacked . odex of =/system/framework/services
Después de este paso, el teléfono estará en breve. tiempo (dentro de 1 minuto) ¡se reinicia automáticamente! ¡Espera un momento!
18. Después de un reinicio exitoso, use el siguiente comando para abrir View Server:
Ventana de llamada del servicio de shell ADB 1 i32 4939
Use el siguiente comando para compruebe si Ver servidor está abierto:
Ventana 3 de llamada al servicio Shell de ADB
Si el valor de retorno es resultado:parcel(000000000001 '...'), ¡levántese!
(Si un determinado paso falla y es necesario restaurar el sistema, consulte el paso 16 en /tag/viewserver/ o comuníquese con mi correo electrónico: czxttkl@gmail.com para obtener más información).
A continuación, compile y ejecute HierarchyViewer en Eclipse para ver el árbol de interfaz de usuario en tiempo real del teléfono móvil.
Consulte:/255485243.html