web-dev-qa-db-ja.com

Android ARTランタイムには、Dalvikと同じメソッド制限の制限がありますか?

Android ARTランタイムにはDalvikと同じメソッド制限の制限がありますか?現在、プライマリdexファイルには64kメソッドの制限があります。

42
ajma

この問題は、DalvikランタイムやDEXファイル形式ではなく、現在の Dalvik命令 のセットに問題があります。具体的には、次のようなさまざまなメソッド呼び出しメソッドです。

invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB

B: method reference index (16 bits)

DEXファイルでは非常に多くのメソッドを参照できますが、最初の65536のみを呼び出すことができます。これは、メソッド呼び出し命令で使用できるすべてのスペースだからです。

制限はメソッドの数参照であり、メソッドの数ではないことを指摘しておきます定義済み。 DEXファイルにいくつかのメソッドしかないが、それらが一緒に70,000の異なる外部定義メソッドを呼び出す場合、制限を超えることになります。

これを修正する1つの方法は、より広いメソッド参照を使用する追加の指示を追加することです。 「ジャンボオペコード」と呼ばれるアプローチが実装され、Android 4.0(ICS)でリリースされましたが、完全には実行されず、後で ツリーから削除 されました。 (ジャンボopsを参照する「dx」からのエラーメッセージ、または それらにつまずいた の開発者からのエラーメッセージが含まれる投稿を時々見ます。)

これは Facebook hack によって解決される問題ではないことに注意してください。これは、クラス/メソッド/フィールドのメタデータを保持するための固定サイズのバッファが原因です。メソッド固有の制限はありません。あなたはたくさんのフィールドを持つことでバッファを吹き飛ばすことができます。

ARTの現在の実装では、Dalvikと同じ一連の命令が処理されるため、状況は変わりません。

74
fadden

Anwar Ghuloumは this Android Developers Backstageエピソードで、近い将来にバイトコードを修正する予定はないと語った。
代わりに、Android Lから始まり、すべてのdexファイルを(APKから)単一のオートファイルに折りたたむことにより、multi-dexをネイティブでサポートします。

5
Alex Lipov