
Dalvikバイトコード(DEX/APK)を同等のJavaバイトコードに変換し、Java解析ツールがエッジケースに対して高い正確性でAndroidアプリケーションを処理できるようにします。
注:このリポジトリは古くなっている可能性があります。今後の開発は https://github.com/Storyyeller/enjarify で行われます。
Enjarifyは、Dalvikバイトコードを等価なJavaバイトコードに変換するツールです。これにより、Java解析ツールでAndroidアプリケーションを解析できるようになります。
Enjarifyは純粋なPython 3アプリケーションなので、git cloneしてそのまま実行できます。リポジトリのトップディレクトリにいると仮定して、直接実行するには次のようにします。
python3 -O -m enjarify.main yourapp.apk
通常の使用では、ラッパースクリプトを使用してパスに設定することをお勧めします。
便利なように、ラッパーシェルスクリプトenjarify.shが用意されています。このスクリプトは、CPythonよりも高速なPypyが利用可能な場合はそれを使用しようとします。Enjarifyをどこからでも呼び出せるようにするには、PATH上の任意の場所(例:~/bin)にシンボリックリンクを作成します。これを行うには、リポジトリのトップレベルにいることを前提として、
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
ラッパーバッチスクリプトenjarify.batが用意されています。どこからでも呼び出せるようにするには、リポジトリのルートディレクトリをPATHに追加してください。バッチスクリプトは常にpython3をインタプリタとして呼び出します。pypyを使用したい場合は、スクリプトを編集してください。
スクリプトを正しくパスに設定していれば、次のように enjarify と入力するだけでどこからでも呼び出せます。
enjarify yourapp.apk
最も基本的な使い方は、入力としてapkファイルまたはdexファイルを指定することです。マルチデックスapkを指定すると、Enjarifyは自動的にすべてのdexファイルを変換し、結果を1つの結合されたjarに出力します。dexファイルを指定した場合、そのdexファイルのみが変換されます。例えば、手動でdexファイルを抽出したと仮定すると、次のようにできます。
enjarify classes2.dex
デフォルトの出力ファイルは、カレントディレクトリ内の[inputname]-enjarify.jarです。出力ファイル名を明示的に指定するには、-oまたは--outputオプションを指定します。
enjarify yourapp.apk -o yourapp.jar
デフォルトでは、Enjarifyは出力ファイルが既に存在する場合、上書きを拒否します。出力を上書きするには、-fまたは--forceオプションを指定します。
Dex2jarは、DalvikをJavaバイトコードに変換しようとする古いツールです。ほとんどの場合に妥当に動作しますが、多くの難解な機能やエッジケースでは失敗したり、誤った結果を静かに出力したりすることがあります。対照的に、Enjarifyは、Dex2jarが失敗するようなコードでも可能な限り多くのケースで動作するように設計されています。特に、EnjarifyはUnicodeクラス名、複数の型として使用される定数、暗黙的なキャスト、通常の制御フローにジャンプする例外ハンドラ、過剰な定数を参照するクラス、非常に長いメソッド、catchallハンドラの後の例外ハンドラ、間違った型の静的初期値を正しく処理します。
Enjarifyは現在、ソースファイル属性、行番号、アノテーションなどのオプションメタデータを変換しません。
Enjarifyは可能な限り多くのクラスを正常に変換しようと努力していますが、Android、Java、またはその両方の制限により、単純に不可能なケースがいくつかあります。幸い、これは人為的な状況でのみ発生するため、実際には問題になりません。
PyPyはCPythonよりもはるかに高速です。PyPyをインストールするには、http://pypy.org/ を参照してください。通常のPyPyではなくPyPy3を入手してください。Linuxラッパースクリプトは、利用可能な場合は自動的にpypy3コマンドを使用します。Windowsでは、自分でラッパースクリプトを編集する必要があります。
デフォルトでは、Enjarifyはバイトコードに対して最適化(コピー伝播、未使用値の削除など)を実行し、人間が読みやすくします。これが不要な場合は、--fastオプションで最適化を無効にすることで高速化できます。非常にまれなケースとして、最適化なしではクラスファイルに収まらないほど大きなクラスがある場合、Enjarifyは自動的にすべての最適化を有効にして再試行するため、このオプションは正常に変換されるクラスの数に影響を与えません。
これはGoogleの公式製品(実験的かどうかにかかわらず)ではなく、たまたまGoogleが所有しているコードです。