dx によって dex ファイルに変換される前に、コンパイルされたクラス ファイルをいじくり回すことに興味があります。Dalvik の公式ドキュメントと、DEX 形式と Class 形式の比較を少し調べました。実際の変換プロセス、class->dexに関する情報はあまり見つかりません。dx は、変換前にまずクラス ファイルを検証しますか? 単純にフィールドごと、メソッドごとに進み、命令のグループをよりコンパクトなグループにマージしますか? 任意の洞察をいただければ幸いです。
ありがとう。
dx によって dex ファイルに変換される前に、コンパイルされたクラス ファイルをいじくり回すことに興味があります。Dalvik の公式ドキュメントと、DEX 形式と Class 形式の比較を少し調べました。実際の変換プロセス、class->dexに関する情報はあまり見つかりません。dx は、変換前にまずクラス ファイルを検証しますか? 単純にフィールドごと、メソッドごとに進み、命令のグループをよりコンパクトなグループにマージしますか? 任意の洞察をいただければ幸いです。
ありがとう。
実行される方法でdx
は、通常、可能なすべての検証を行うのに十分な情報がありません。また、そうするように書かれているわけでもありません。特に、検証の一部は、あるクラスのコードが他のクラスのコードを参照する方法に関係しており、 をdx
実行すると、問題の「他のクラス」のコードが実際には利用できない可能性があります。たとえば、Android API レベル 6 に対してコードをコンパイルして、.dex
ファイルを生成できます。後で、API レベル 29 を実行するデバイスが出てきたら、その.dex
ファイルを実行してみることができます。ファイルがシステム上にあり、実行の準備が整ったときにのみ、システムは検証を実行するために必要なすべての情報を取得します。その時点で、.dex
システムで利用可能なファイルをファイルに保存し、そのファイルを承認 (検証に合格) または拒否 (検証に失敗) します。
簡単な例として、この.dex
ファイルは、API レベル 6 には存在していたが API レベル 29 で削除されたクラスまたはメソッドを参照している可能性があります。
しかし、明確にするために、@ JesusFrekeが言ったように、翻訳の仕事をするのに十分なファイルdx
を解析できる必要があります. .class
その層で問題が発生した場合、翻訳の失敗として報告されます。これは、文脈上、検証エラーとほぼ同等ですが、一般的にそのように表現されることはありません。
API の進化の可能性を無視しても、.class
検証されない を取り、それをファイル (a の一部) に変換することに成功し、ファイルが検証に失敗すること.dex
を観察することができます。.dex
これが役立つことを願っています!
私は dx 自体と変換プロセスについて dalvik バイトコードの場合ほど詳しくはありませんが、元の Java バイトコードの検証を見た記憶がありませんが、dx によって解析/理解されるのに十分な形式である必要があることは明らかです。 .
私が認識している変換プロセスに関するドキュメントはありません。これには、バイトコードをいくつかの中間形式 (ROP、SSA) に変換することが含まれ、効率的なレジスタ割り当てのためのロジックと中間形式の最適化が含まれています (私はそう思います)。
変換プロセスの詳細については、dx ソース自体 (/dalvik/dx) を確認することをお勧めします。