
Traduce bytecode Dalvik (DEX/APK) a bytecode Java equivalente, permitiendo que las herramientas de análisis de Java procesen aplicaciones Android con alta corrección para casos extremos.
Nota: Este repositorio puede estar desactualizado. El desarrollo futuro se llevará a cabo en https://github.com/Storyyeller/enjarify.
Enjarify es una herramienta para traducir bytecode Dalvik a bytecode Java equivalente. Esto permite que las herramientas de análisis de Java analicen aplicaciones Android.
Enjarify es una aplicación pura de Python 3, por lo que puedes simplemente clonar el repositorio y ejecutarlo. Para ejecutarlo directamente, asumiendo que estás en el directorio principal del repositorio, puedes hacer
python3 -O -m enjarify.main yourapp.apk
Para uso normal, probablemente querrás usar los scripts envolventes y configurarlo en tu PATH.
Para mayor comodidad, se proporciona un script envolvente de shell, enjarify.sh. Esto intentará usar Pypy si está disponible, ya que es más rápido que CPython. Si deseas poder llamar a Enjarify desde cualquier lugar, puedes crear un enlace simbólico desde algún lugar en tu PATH, como ~/bin. Para hacer esto, asumiendo que estás dentro del nivel superior del repositorio,
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
Se proporciona un script envolvente por lotes, enjarify.bat. Para poder llamarlo desde cualquier lugar, simplemente agrega el directorio raíz del repositorio a tu PATH. El script por lotes siempre invocará a python3 como intérprete. Si deseas usar pypy, solo edita el script.
Asumiendo que configuraste el script correctamente en tu PATH, puedes llamarlo desde cualquier lugar simplemente escribiendo enjarify, por ejemplo:
enjarify yourapp.apk
La forma más básica de uso es simplemente especificar un archivo apk o dex como entrada. Si especificas un apk multidex, Enjarify traducirá automáticamente todos los archivos dex y generará los resultados en un único jar combinado. Si especificas un archivo dex, solo se traducirá ese archivo dex. Por ejemplo, asumiendo que extrajiste manualmente los archivos dex, podrías hacer
enjarify classes2.dex
El archivo de salida predeterminado es [inputname]-enjarify.jar en el directorio actual. Para especificar explícitamente el nombre del archivo de salida, usa la opción -o o --output.
enjarify yourapp.apk -o yourapp.jar
Por defecto, Enjarify se negará a sobrescribir el archivo de salida si ya existe. Para sobrescribir la salida, usa la opción -f o --force.
Dex2jar es una herramienta más antigua que también intenta traducir Dalvik a bytecode Java. Funciona razonablemente bien la mayor parte del tiempo, pero muchas características oscuras o casos extremos pueden hacer que falle o incluso produzca resultados incorrectos de forma silenciosa. Por el contrario, Enjarify está diseñado para funcionar en la mayor cantidad de casos posible, incluso para código donde Dex2jar fallaría. Entre otras cosas, Enjarify maneja correctamente nombres de clase Unicode, constantes usadas como múltiples tipos, conversiones implícitas, manejadores de excepciones que saltan al flujo de control normal, clases que referencian demasiadas constantes, métodos muy largos, manejadores de excepción después de un manejador catchall, y valores iniciales estáticos del tipo incorrecto.
Enjarify actualmente no traduce metadatos opcionales como atributos de archivo fuente, números de línea y anotaciones.
Enjarify se esfuerza por traducir con éxito la mayor cantidad de clases posible, pero hay algunos casos potenciales en los que simplemente no es posible debido a limitaciones en Android, Java o ambos. Afortunadamente, esto solo ocurre en circunstancias forzadas, por lo que no debería ser un problema en la práctica.
PyPy es mucho más rápido que CPython. Para instalar PyPy, consulta http://pypy.org/. Asegúrate de obtener PyPy3 en lugar de PyPy normal. El script envolvente de Linux utilizará automáticamente el comando pypy3 si está disponible. En Windows, necesitarás editar el script envolvente tú mismo.
Por defecto, Enjarify ejecuta optimizaciones en el bytecode que lo hacen más legible para los humanos (propagación de copias, eliminación de valores no utilizados, etc.). Si no necesitas esto, puedes acelerar las cosas desactivando las optimizaciones con la opción --fast. Ten en cuenta que en el caso muy raro de que una clase sea demasiado grande para caber en un classfile sin optimización, Enjarify la reintentará automáticamente con todas las optimizaciones habilitadas, por lo que esta opción no afecta la cantidad de clases que se traducen con éxito.
Este no es un producto oficial de Google (experimental o de otro tipo), es solo código que casualmente es propiedad de Google.