¿Cómo puedo descompilar archivos dex de forma programática dentro de Android?

Sé cómo extraer archivos apk a las clases utilizando un sistema basado en ventanas como a continuación:

Paso 1: Cambio de nombre del archivo .apk

Cambie el nombre del archivo .apk con la extensión .zip (por ejemplo, deje que el archivo sea "demofile.apk" y después de cambiarlo de nombre se convierte en "demofile.apk.zip")

Paso 2: Obtención de archivos java de apk

Ahora extraiga el archivo zip renombrado en una carpeta específica, por ejemplo, deje que esa carpeta sea "demofolder". Ahora descargue dex2jar desde el enlace para windows y extraiga ese archivo zip en la carpeta "demofolder".

Ahora abra el símbolo del sistema y vaya a la carpeta creada en el paso anterior y escriba el comando "dex2jar classes.dex" y presione enter. Esto generará el archivo "classes.dex.dex2jar" en la misma carpeta.

Ahora Descargar java decompiler desde el enlace y extraerlo e iniciar (doble clic) jd-gui.exe

Desde la ventana de jd-gui, busca el archivo "classes.dex.dex2jar" generado en demofolder, esto dará a todos los archivos de clase por nombre src.

Ahora, en el menú Archivo, seleccione "guardar todas las fuentes", esto generará un archivo zip denominado "classes_dex2jar.src.zip" que consta de todos los paquetes y archivos java.

Extraiga ese archivo zip (classes_dex2jar.src.zip) y obtendrá todos los archivos java de la aplicación.

Arriba de los pasos generará archivos java, pero para obtener archivos xml realizar los siguientes pasos.

Paso 3: Obtención de archivos xml de apk

Descargar apktool y apktool instalar desde el enlace y extraer los dos archivos y colocarlo en la misma carpeta (por ejemplo "demoxmlfolder").

Coloque el archivo .apk en la misma carpeta (es decir, demoxmlfolder)

Ahora abra el símbolo del sistema y vaya al directorio donde se almacena apktool (aquí "demoxmlfolder") y escriba el comando "apktool if framework-res.apk" El comando Above debe resultar en "Framework installed …" Ahora en el símbolo del sistema escriba el comando "Apktool d filename.apk" (donde filename es nombre del archivo apk) Esto generará una carpeta de nombre filename en el directorio actual (aquí demoxmlfolder) donde todos los archivos xml serían almacenados en la carpeta res \ layout.

Pero me gustaría saber cómo llevar a cabo la programación arriba dentro de Android . Así que mi aplicación Android simplemente puede extraer el archivo dex de otra aplicación. No me importa si el archivo dex se copia en otro lugar en el teléfono, luego descompilado (es simplemente la descompilación que estoy atrapado en)

En el principio de abajo, que tengo acceso a dex de cada aplicación , no sólo el conocimiento de cómo descompilarlo en Android.

Cualquier ayuda sería fantástica.

final PackageManager pm = getPackageManager(); PackageInfo packageInfo = null; try { packageInfo = pm.getPackageInfo("PACKAGE NAME HERE", PackageManager.GET_META_DATA); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } File file = new File(packageInfo.applicationInfo.sourceDir); Uri uri = Uri.fromFile(file); 

Puede explorar el código fuente de la aplicación ShowJava aquí . Parece que está usando la herramienta Dex2Jar. La descompilación comienza en un BackgroundService y toda la magia sucede en algunas clases especiales de Jar. No sé si este código viene de una biblioteca o si todo este código es creado por él. Mira el ExtractJar y el método DecompileJar que no debería ser difícil de entender lo que está pasando.

Necesita seguir algunos pasos para que funcione:

  1. Llegó al sitio de dex2jar bitbucket y descargar los archivos. Agregue los archivos jar a su proyecto.
  2. A través de DexFileFactory , puede cargar el apk, convertirlo a dex ( loadDexFile ) y guardarlo en un archivo ( writeDexFile ).
  3. Con otra biblioteca que convierte jarras a archivos java, finalmente puede leer el contenido. Encontré Procyon , que parece muy simple. Cargue el archivo de clase con un InputTypeLoader y, a continuación, llame a Decompiler.decompile() .

Por supuesto, puede utilizar otras bibliotecas en el paso 3, pero para los pasos 1 y 2, no he encontrado ninguna alternativa.

  • RadioGroup extendiendo RelativeLayout?
  • Haga referencia al id de una vista dentro de un diseño "include" en xml
  • Error al analizar xml: prefijo sin consolidar de com.google.android.gms.ads.AdView
  • Cómo hacer la forma de anillo con la sección de color Android xml
  • Cómo proporcionar archivos de datos para las pruebas de unidad de Android
  • Error al analizar XML: no se ha encontrado ningún elemento
  • ¿Cómo obtengo el efecto de rizo para los elementos de menú en mi barra de herramientas personalizada?
  • Nombre de paquete alias o apodo
  • Android: Alineación de cuatro cuadrados
  • Error cómico en la declaración de forma xml de Android
  • Android - java.lang.UnsupportedOperationException: No se puede convertir a dimension: type = 0x12
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.