Como desarrollador de Android, a menudo necesito aprender el excelente código de otras personas. Originalmente, hay muchos códigos de proyectos de código abierto en GitHub, pero a veces cuando uso el software encuentro la función que quiero, quiero aprender Al implementar el código, usted Es necesario utilizar la tecnología de descompilación en este momento. En circunstancias normales, después de empaquetar una aplicación de Android en un apk, los archivos de recursos y el código utilizados para desarrollar la aplicación ya no se pueden ver. Sin embargo, proporcionamos algunas herramientas en línea y aún puede descompilar el apk. Una vez descompilado el apk, podemos ver los archivos de recursos (imágenes), el diseño, los estilos, los códigos de implementación relacionados, etc., utilizados para desarrollar esta aplicación. Puede considerarse como una habilidad más práctica en el desarrollo de Android. Cuando estamos interesados en aplicaciones desarrolladas por otros, podemos usar este medio técnico para descompilar el apk empaquetado por otros, y luego podemos ver lo que sentimos.Contenido interesante. La descompilación no permite a los desarrolladores descifrar y reinstalar una aplicación. El objetivo principal es promover que los desarrolladores aprendan, aprendan de un buen código y mejoren su nivel de autodesarrollo.
1. Herramientas de descompilación
- apktool (adquisición de archivos de recursos), dirección de descarga: https://ibotpeaches.github.io/Apktool/install
- dex2jar (adquisición de archivos de código fuente), dirección de descarga: https://github.com/pxb1988/dex2jar
- jd-gui (vista de código fuente), dirección de descarga: http://jd.benow.ca
También se divide en dos partes, una es la herramienta de descompilación de código y la otra es la herramienta de descompilación de recursos.
Herramientas para descompilar código:
-
dex2jar y jd-gui : dex2jar convierte el dex en el APK de Android en un archivo jar, que luego se puede ver usando jd-gui y guardar como un archivo java.
-
jadx : jadx es una herramienta de descompilación muy fácil de usar, pero el autor original ya no la mantiene. Pero también podría ser una herramienta clásica.
Herramientas para descompilar recursos:
- APKTool : utilice APKTool para extraer imágenes de diseño y otros recursos.
2. Proceso de descompilación
1. Primero necesita obtener el software descompilado. El software que obtiene generalmente es xxx.apk, pero a veces el software que obtiene es xxx.apk y xxx.odex. Este último es el producto de la optimización de la plataforma. Acerca de xxx La fusión de .apk y xxx.odex se analizarán en otro artículo. Después de obtener la apk completa, puedes comenzar el trabajo de descompilación.
2. Descompilar archivos de recursos:
java -jar apktool_2.3.1.jar d -f KeyValueTest.apk -o KeyValueTest
- Después de ejecutar el comando anterior, si no se informa ningún error de la siguiente manera, la descompilación fue exitosa:
- Descripción de parámetros:
- -f Si la carpeta de destino ya existe, fuerce la eliminación de la carpeta existente (de forma predeterminada, la decodificación falla si la carpeta de destino ya existe).
- -o especifica el nombre de la carpeta de destino de decodificación (el nombre del archivo APK se usa de forma predeterminada para nombrar la carpeta de destino).
- -s no descompila el archivo dex, lo que significa que el archivo clases.dex se conservará (el archivo dex se decodificará en un archivo pequeño de forma predeterminada).
- -r no descompila los archivos de recursos, lo que significa que el archivo resources.arsc se conservará (resources.arsc se descodificará en archivos de recursos específicos de forma predeterminada)
- En este momento, se genera una carpeta KeyValueTest en la carpeta actual.
- Debajo de esta carpeta están los archivos de recursos descompilados, solo necesitamos el directorio res y el archivo AndroidManifest.xml.
Comparar diseño:
Comparar AndroidManifest.xml: - A través de la comparación, descubrimos que los archivos de recursos descompilados por APKTool se pueden usar directamente.
3. Descompilar archivos de código:
- Modifique el sufijo del archivo apk a zip y luego descomprímalo o descomprímalo directamente para obtener el siguiente directorio de archivos:
- En lo que nos centramos aquí es en el archivo Classes.dex. Este archivo es similar al archivo de código de bytes (.class) en Java, por lo que primero debemos usar dex2jar para descompilar el archivo .dex en un archivo jar. La estructura de directorios del archivo dex2jar es la siguiente, de la cual se utiliza d2j-dex2jar.bat.
- Coloque clases.dex en la carpeta. En la ruta del archivo actual, ingrese d2j-dex2jar.bat clases.dex en la línea de comando.
- Luego genere el archivo jar correspondiente:
- Use jd-gui para abrirlo y encontrará que hay un BuildConfig adicional. Este es el archivo de configuración durante la compilación. No se preocupe por eso.
- En MainActivity, comparando el código descompilado con el código fuente, son básicamente iguales. En la referencia del recurso, se reemplaza por un número. Este número se puede reemplazar buscando en R.
ID de recurso encontrado en R - El código se puede guardar a través de la función de guardar de jd-gui (Guardar todo el código fuente)
4. Puede usar dex2jar o jadx para descompilar clases.dex. En comparación con dex2jar, jadx es más conveniente y rápido. Simplemente abra jadx-gui.bat en el archivo bin y seleccione directamente el APK, aunque jadx también se puede descompilar. archivos, pero a veces inexactos.
5. En resumen, puede utilizar APKTool+JADX o APKTool+dex2jar para descompilar APK. Se recomienda utilizar el primero. Hay un sitio web de descompilación en línea que utiliza JADX.
-> Ir aquí <-
6. En este punto, se puede concluir que sin codificar, básicamente se puede obtener un código que es exactamente el mismo que el código fuente. En el caso de codificar, será muy difícil de leer y no se demostrará aquí. Integre la resolución obtenida con los archivos AndroidManifest.xml y java para obtener un código similar al código fuente.
Artículos de referencia citados: https://www.cnblogs.com/cj5785/p/9892978.html
3. Reempaquetar la firma (entorno Mac)
Recompilar es ejecutar el comando en cmd.apktool b test
Después del éxito, los directorios build y dist se generarán en el directorio de prueba.
Almacenados en el directorio de compilación están los archivos dex empaquetados y los archivos de recursos (lo mismo que después de la descompresión del apk)
El archivo apk reempaquetado se almacena en el directorio dist.
Renunciar
Copie el archivo de firma al directorio dist para facilitar la operación
Ingrese al directorio dist desde la terminal y ejecute el comando jarsigner -verbose -keystore [your_key_store_path] -signedjar [signed_apk_name] [usigned_apk_name] [your_key_store_alias] -digestalg SHA1 -sigalg MD5withRSA
Descripción del campo:
- [your_key_store_path]: la ruta absoluta a la ubicación de la clave
- [signed_apk_name]: nombre del paquete de instalación firmado
- [usigned_apk_name]: nombre del paquete de instalación sin firmar
- [your_key_store_alias]: alias de la clave
Debido a que colocamos la clave secreta y test.apk en la misma ruta, la ruta absoluta de la ubicación de la clave se puede completar directamente con testkey. macjenkinskey es el alias de mi clave secreta, no me malinterpretes (evil.jpg)
Ingrese su contraseña. Si no puede ver lo que ingresó, comience a firmar.
Después de firmar, puede ver el apk firmado en el directorio dist.
Epílogo
Al descompilar, también puede cambiar el nombre de la extensión test.apk a test.zip y extraerlo.
Copie clases.dex a la ruta dex2jar-2.0
Ingrese la terminal en la ruta dex2jar-2.0 y ejecute el comando./d2j-dex2jar.sh classes.dex
También puedes obtener clases-dex2jar.jar
Descompile y luego vuelva a compilar, también puede obtener clases.dex, justo debajo de esta ruta
El reempaquetado se refiere al artículo de Tencent Cloud Community. Puede usarlo como referencia. Me gustaría pensar en ello. La descompilación es para permitir a los desarrolladores aprender mejor de tecnologías excelentes. No es para descifrar la apk de otras personas, agregar algunas operaciones ilegales y luego reempaquetado nuevamente.