
Traduce il bytecode Dalvik (DEX/APK) in bytecode Java equivalente, permettendo agli strumenti di analisi Java di elaborare applicazioni Android con alta correttezza per i casi limite.
Nota: Questo repository potrebbe essere obsoleto. Lo sviluppo futuro avverrà su https://github.com/Storyyeller/enjarify.
Enjarify è uno strumento per tradurre bytecode Dalvik in bytecode Java equivalente. Ciò consente agli strumenti di analisi Java di analizzare applicazioni Android.
Enjarify è un'applicazione puramente Python 3, quindi puoi semplicemente clonare il repository con git ed eseguirlo. Per eseguirlo direttamente, supponendo che tu sia nella directory principale del repository, puoi semplicemente digitare
python3 -O -m enjarify.main yourapp.apk
Per un uso normale, probabilmente vorrai utilizzare gli script wrapper e configurarlo nel tuo PATH.
Per comodità, viene fornito uno script shell wrapper, enjarify.sh. Questo tenterà di utilizzare Pypy se disponibile, poiché è più veloce di CPython. Se vuoi essere in grado di chiamare Enjarify da qualsiasi punto, puoi creare un collegamento simbolico da qualche parte nel tuo PATH, come ~/bin. Per fare ciò, supponendo che tu sia nella directory principale del repository,
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
Viene fornito uno script batch wrapper, enjarify.bat. Per poterlo chiamare da qualsiasi punto, aggiungi semplicemente la directory principale del repository al tuo PATH. Lo script batch invocherà sempre python3 come interprete. Se vuoi usare pypy, modifica lo script.
Supponendo che tu abbia configurato correttamente lo script nel tuo PATH, puoi chiamarlo da qualsiasi punto semplicemente digitando enjarify, ad es.
enjarify yourapp.apk
La forma più basilare di utilizzo è specificare un file apk o un file dex come input. Se specifichi un apk multidex, Enjarify tradurrà automaticamente tutti i file dex e restituirà i risultati in un unico jar combinato. Se specifichi un file dex, solo quel file dex verrà tradotto. Ad esempio, supponendo che tu abbia estratto manualmente i file dex, potresti fare
enjarify classes2.dex
Il file di output predefinito è [inputname]-enjarify.jar nella directory corrente. Per specificare esplicitamente il nome del file per l'output, passa l'opzione -o o --output.
enjarify yourapp.apk -o yourapp.jar
Per impostazione predefinita, Enjarify rifiuterà di sovrascrivere il file di output se esiste già. Per sovrascrivere l'output, passa l'opzione -f o --force.
Dex2jar è uno strumento più vecchio che tenta anch'esso di tradurre Dalvik in bytecode Java. Funziona abbastanza bene la maggior parte delle volte, ma molte caratteristiche oscure o casi limite possono causarne il fallimento o addirittura produrre risultati errati in modo silenzioso. Al contrario, Enjarify è progettato per funzionare nel maggior numero possibile di casi, anche per codice dove Dex2jar fallirebbe. Tra le altre cose, Enjarify gestisce correttamente nomi di classe Unicode, costanti utilizzate come tipi multipli, cast impliciti, gestori di eccezioni che saltano nel flusso di controllo normale, classi che fanno riferimento a troppe costanti, metodi molto lunghi, gestori di eccezioni dopo un gestore catchall e valori di inizializzazione statici del tipo sbagliato.
Enjarify attualmente non traduce metadati opzionali come attributi del file sorgente, numeri di riga e annotazioni.
Enjarify fa del suo meglio per tradurre con successo quante più classi possibile, ma ci sono alcuni casi potenziali in cui semplicemente non è possibile a causa di limitazioni in Android, Java o entrambi. Fortunatamente, questo accade solo in circostanze artificiose, quindi non dovrebbe essere un problema nella pratica.
PyPy è molto più veloce di CPython. Per installare PyPy, visita http://pypy.org/. Assicurati di ottenere PyPy3 anziché il PyPy normale. Lo script wrapper Linux utilizzerà automaticamente il comando pypy3 se disponibile. Su Windows, dovrai modificare tu stesso lo script wrapper.
Per impostazione predefinita, Enjarify esegue ottimizzazioni sul bytecode che lo rendono più leggibile per gli umani (propagazione delle copie, rimozione dei valori inutilizzati, ecc.). Se non ne hai bisogno, puoi accelerare le cose disabilitando le ottimizzazioni con l'opzione --fast. Nota che nel rarissimo caso in cui una classe sia troppo grande per entrare in un classfile senza ottimizzazione, Enjarify la ritenterà automaticamente con tutte le ottimizzazioni abilitate, quindi questa opzione non influisce sul numero di classi tradotte con successo.
Questo non è un prodotto ufficiale di Google (sperimentale o altro), è solo codice che è di proprietà di Google.