
Traduz bytecode Dalvik (DEX/APK) para bytecode Java equivalente, permitindo que ferramentas de análise Java processem aplicativos Android com alta precisão para casos extremos.
Nota: Este repositório pode estar desatualizado. O desenvolvimento futuro ocorrerá em https://github.com/Storyyeller/enjarify.
Enjarify é uma ferramenta para traduzir bytecode Dalvik para bytecode Java equivalente. Isso permite que ferramentas de análise Java analisem aplicativos Android.
Enjarify é uma aplicação pura em Python 3, então você pode simplesmente clonar o repositório e executá-lo. Para executá-lo diretamente, assumindo que você está no diretório raiz do repositório, você pode simplesmente fazer
python3 -O -m enjarify.main yourapp.apk
Para uso normal, você provavelmente vai querer usar os scripts auxiliares e configurá-los no seu PATH.
Para conveniência, um script shell auxiliar é fornecido, enjarify.sh. Ele tentará usar PyPy se disponível, pois é mais rápido que CPython. Se você quiser ser capaz de chamar o Enjarify de qualquer lugar, pode criar um link simbólico a partir de algum lugar no seu PATH, como ~/bin. Para fazer isso, assumindo que você está dentro do diretório raiz do repositório,
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
Um script batch auxiliar, enjarify.bat, é fornecido. Para poder chamá-lo de qualquer lugar, basta adicionar o diretório raiz do repositório ao seu PATH. O script batch sempre invocará python3 como interpretador. Se você quiser usar PyPy, basta editar o script.
Assumindo que você configurou o script corretamente no seu PATH, pode chamá-lo de qualquer lugar apenas digitando enjarify, por exemplo
enjarify yourapp.apk
A forma mais básica de uso é especificar um arquivo apk ou dex como entrada. Se você especificar um apk multidex, o Enjarify traduzirá automaticamente todos os arquivos dex e produzirá os resultados em um único jar combinado. Se você especificar um arquivo dex, apenas esse arquivo dex será traduzido. Por exemplo, supondo que você extraiu manualmente os arquivos dex, você poderia fazer
enjarify classes2.dex
O arquivo de saída padrão é [inputname]-enjarify.jar no diretório atual. Para especificar o nome do arquivo de saída explicitamente, use a opção -o ou --output.
enjarify yourapp.apk -o yourapp.jar
Por padrão, o Enjarify se recusará a sobrescrever o arquivo de saída se ele já existir. Para sobrescrever a saída, use a opção -f ou --force.
Dex2jar é uma ferramenta mais antiga que também tenta traduzir Dalvik para bytecode Java. Ela funciona razoavelmente bem na maioria das vezes, mas muitos recursos obscuros ou casos extremos farão com que ela falhe ou até mesmo produza resultados incorretos silenciosamente. Em contraste, o Enjarify é projetado para funcionar em tantos casos quanto possível, mesmo para código onde o Dex2jar falharia. Entre outras coisas, o Enjarify lida corretamente com nomes de classe Unicode, constantes usadas como múltiplos tipos, casts implícitos, manipuladores de exceção saltando para o fluxo de controle normal, classes que referenciam muitas constantes, métodos muito longos, manipuladores de exceção após um manipulador catchall e valores iniciais estáticos do tipo errado.
Enjarify atualmente não traduz metadados opcionais como atributos de arquivo fonte, números de linha e anotações.
O Enjarify se esforça para traduzir com sucesso o maior número possível de classes, mas existem alguns casos potenciais onde simplesmente não é possível devido a limitações no Android, Java ou ambos. Felizmente, isso só acontece em circunstâncias forjadas, então não deve ser um problema na prática.
PyPy é muito mais rápido que CPython. Para instalar o PyPy, veja http://pypy.org/. Certifique-se de obter o PyPy3 em vez do PyPy normal. O script wrapper do Linux usará automaticamente o comando pypy3 se disponível. No Windows, você precisará editar o script wrapper você mesmo.
Por padrão, o Enjarify executa otimizações no bytecode que o tornam mais legível para humanos (propagação de cópia, remoção de valores não utilizados, etc.). Se você não precisar disso, pode acelerar as coisas desativando as otimizações com a opção --fast. Observe que, no caso muito raro de uma classe ser grande demais para caber em um classfile sem otimização, o Enjarify tentará automaticamente novamente com todas as otimizações ativadas, portanto, essa opção não afeta o número de classes que são traduzidas com sucesso.
Este não é um produto oficial do Google (experimental ou não), é apenas um código que pertence ao Google.