27

私のチームと私は、別のチームから大規模な Android プロジェクトを継承しました。含まれているすべてのライブラリを含むアプリケーション全体には、約 35000 のメソッドがあると報告されています。これで、プロトコル バッファを使用する必要があるアプリに新しいサービスを実装するタスクができました。

問題は、必要なすべての .proto ファイルを含む生成された .jar ファイルが、別の 35000 メソッド、つまり 70000 メソッドを作成することです。ご存じないかもしれませんが、Android コンパイラには .dex ファイルごとに 65536 メソッドという制限があります。明らかにその制限を超えており、アプリをコンパイルしようとすると次のエラーが発生します。

Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

はい、おそらくアプリケーション アーキテクチャを再構築する必要がありますが、それには時間がかかります。そして今のところ、この問題を一時的に回避する解決策を見つけようとしています。

助言がありますか?

4

7 に答える 7

12

別の DEX ファイルを使用できます。これはあなたがそれを行う方法です:

http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

于 2013-03-16T01:15:34.660 に答える
7

Proguard ( http://developer.android.com/tools/help/proguard.html ) を有効にして、未使用のメソッドを削除します。protobuf ジェネレーターは、実際には使用されない数千のメソッドを作成します。

マイクロプロトバッファ ( https://code.google.com/p/micro-protobuf/ ) も役立つ場合があります。

于 2013-03-15T22:39:10.283 に答える
4

Square にも同様の問題があり、protobufs によって引き起こされるメソッド爆発に対処するためにWireを構築しました。彼らは 10,000 のメソッドを殺したと言います。

于 2013-11-01T16:57:53.523 に答える
4

6.5 より前のバージョンの Google Play サービスでは、API のパッケージ全体をアプリにコンパイルする必要がありました。場合によっては、これを行うと、アプリ内のメソッド (フレームワーク API、ライブラリ メソッド、および独自のコードを含む) の数を 65,536 の制限未満に抑えることがより困難になります。

バージョン 6.5 以降では、代わりに Google Play サービス API を選択してアプリにコンパイルできます。たとえば、Google Fit API と Android Wear API のみを含めるには、build.gradle ファイルの次の行を置き換えます。

compile 'com.google.android.gms:play-services:6.5.87'

これらの行で:

compile 'com.google.android.gms:play-services-fitness:6.5.87'
compile 'com.google.android.gms:play-services-wearable:6.5.87'

詳細については、ここをクリックしてください。

于 2015-02-27T08:32:23.607 に答える
1

これがプロトコル バッファの最初の使用である場合は、別の JavaME 実装を調べることができます。

サードパーティのアドオンにリストされている他のものがあります。それらのいずれも使用していませんが、サイズが小さく、標準プロトコル バッファによって作成されたすべてのメソッドが含まれていないようです。

于 2013-03-15T23:38:59.147 に答える
0

Eclipse を使用している場合、これが最も簡単な回避策です。ここをクリックしてください。

于 2016-07-11T06:29:48.600 に答える