Cómo compilar un visor de jerarquía en Eclipse
Actualización 2013.3.15: Antes de la rama del código fuente de Android android-4.2.2_r1, el código fuente de jerarquíaviewer2 se encuentra en la carpeta SOURCE_ROOT/sdk/hierarchyviewer2, y después de la rama android-4.2.2_r1, el código fuente de jerarquíaviewer2 El código fuente se ha movido a SOURCE_ROOT/tools/swt/hierarchyviewer2. El resto de este artículo sigue la estructura del código anterior a la rama android-4.2.2_r1. Si desea conocer la estructura de las herramientas SDK en la nueva versión del árbol de código fuente de Android, visite: Extra: después de la migración importante de las herramientas SDK, Android 4.2.2 se envió al directorio principal de AOSP
(¿No sé cómo descargar el código fuente de Android? Consulte: blogs.com/vowei/archive/2012/08/08/2627614.html Análisis del código fuente del backend en este artículo p>
Ahora hablaré sobre la inicialización de AndroidDebugBridge en Windows. Posibles problemas:
El punto de entrada para el backend del visor de jerarquía está en SOURCE_ROOT/sdk/hierarchyviewer2/app/src/com/android/hierarchyviewer/ HierarchyViewerApplication java
En la función createContents (padre compuesto):
=========================. ============= ======================================= ============= == ============
@Override
Control protegido createContents(padre compuesto) {
// Solo en ventana Creado en abierto para usar con SWT en Mac
mDirector = HierarchyViewerApplicationDirector.
createDirector();
mDirector.initDebugBridge();
mDirector.startListenForDevices();
mDirector.populateDeviceSelectionModel();
......
====================================== = =================================================== = ============
Las funciones del código anterior son las siguientes:
1. HierarchyViewerApplicationDirector.createDirector() - Crear un objeto HierarchyViewerApplicationDirector.
2. mDirector.initDebugBridge () - Inicializa AndroidDebugBridge
3, mDirector.startListenForDevices() - Registra mDirctor como oyente de AndroidDebugBridge (HierarchyViewerDirector hereda la interfaz IDeviceChangeListener), cuando el dispositivo se conecta o desconecta o cambia, mDirctor recibirá eventos.
4, mDirector.populateDeviceSelectionModel(): obtiene la lista de dispositivos conectados actualmente, los procesa y los muestra.
Tenga en cuenta que el segundo paso es inicializar AndroidDebugBridge, que puede fallar cuando se ejecuta en Windows.
El motivo es: mDirector es la clase abstracta de HierarchyViewerDirector, HierarchyViewerDirector.java se encuentra en:
carpeta SOURCE_ROOT/sdk/hierarchyviewer2/libs/jerarchyviewerlib/src/com/android/hierarchyviewerlib .
Echemos un vistazo a la función initDebugBridge() en HierarchyViewerDirector.java:
public void initDebugBridge() {
DeviceBridge.initDebugBridge(getAdbLocation()) ;
}
Verifique la función getAdbLocation():
cadena abstracta pública getAdbLocation();
Resulta que es ¡Solo un método abstracto, no definido!
Como dije antes, mDirector es una clase abstracta de HierarchyViewerDirector, que en realidad está implementada por la clase HierarchyViewerApplicationDirector. HierarchyViewerApplicationDirector.java se encuentra en la carpeta SOURCE_ROOT/sdk/hierarchyviewer2/app/src/com/android/hierarchyviewer.
Echemos un vistazo a cómo se implementa getAdbLocation() en la clase HierarchyViewerApplicationDirector:
==================== = ============================= ===================== = ==============================
cadena pública getAdbLocation() {
Cadena hvParentLocation = System.GetProperty("com.com.com.com.com.com.com.com.com.com.com.com.com.com.com.com.com.com.com.com. com.com .com.com.com.com.com.com.com.com.com.com.com.com.com.getProperty("com.android.hierarchyviewer.bindir");
//$ NON-NLS-1$
// En el nuevo SDK, adb está en platform-tools, pero cuando se ejecuta desde la línea de comandos,
// En el árbol de código fuente de Android, adb se encuentra junto al visor de jerarquía
if (hvParentLocation != null && hvParentLocation.length() != 0) {
// Comprobar si la carpeta de herramientas de plataforma
Archivo platformTools = new File(new File(hvParentLocation).getParent(),
SdkConstants.FD_PLATFORM_TOOLS);
if (platformTools.isDirectory ()) {
Devuelve platformTools.getAbsolutePath() + File.separator + SdkConstants.FN_ADB;
}
Devuelve hvParentLocation + File.separator + SdkConstants;
if (platformTools.isDirectory()) {
return platformTools.getAbsolutePath()separator + SdkConstants.FN_ADB;
}
return SdkConstants.FN _ADB;
}
==================== ======= ============================================ ======= ==========
Mire los comentarios, encontrará que el código getAdbLocation() está escrito de acuerdo con la estructura del árbol de código fuente de Android, y no está escrito de acuerdo a la ruta del SDK normalmente instalado. Por lo tanto, la inicialización de AndroidDebugBridge() fallará.
Entonces, escribí un método sobrecargado para initDebugBridge en HierarchyViewerDirector.java:
===================== == ====================================== ========== == ============================
public void initDebugBridge() {
DeviceBridge. initDebugBridge(getAdbLocation());<
}
public void initDebugBridge(String adbLocation){
DeviceBridge.initDebugBridge(adbLocation);
}
======= ================================ == ================================================
Y cambie HierarchyViewerApplication. Cambie la función createContents en HierarchyViewerApplication.java a:
====================== ==. ================================================= == =========================
@Override
Control protegido createContents(padre compuesto) {
// Crea esta función solo cuando la ventana esté abierta para usar SWT en Mac
mDirector = HierarchyViewerApplicationDirector.createDirector();
mDirector.initDebugBridge("c: /Android/ platform-tools/adb.exe");
mDirector.startListenForDevices();
mDirector.populateDeviceSelectionModel();
.... ..
============================================= ==================================================== ========
Es decir, estoy usando mDirector. initDebugBridge("c:/Android/platform-tools/adb.exe"); apunta a la ruta a adb en mi computadora. De esta forma, inicializar adb no será un problema.
Al ejecutar hierachyviewer en Eclipse, puede encontrar:
E/ddmlib: la conexión establecida fue cancelada por el software en la máquina host
java IOException: la la conexión establecida fue cancelada por el software de su host
Solución alternativa: cierre todo lo relacionado con adb en cmd y reinicie Eclipse.
De:
E/ddmlib.255485243.html