web-dev-qa-db-ja.com

64KメソッドのDalvikコンパイラーの制限に関する問題を解決するにはどうすればよいですか?

私のチームと私は、別のチームから大きな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

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

助言がありますか?

27
Ricardo Amaral

別のDEXファイルを使用できます。これがあなたのやり方です:

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

12
Udinic

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

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

7
fadden

Squareにも同様の問題があり、protobufsによるメソッドの爆発的増加に対処するために Wire を構築しました。彼らは10,000の方法を殺したと主張しています。

4
Abhay Buch

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

バージョン6.5以降では、代わりにGoogle PlayサービスAPIをアプリに選択的にコンパイルできます。たとえば、Google Fitと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'

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

4
akshay

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

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

1
Bruce Martin

最近、 Nano Protobufs をAndroidに追加しました。これにより、生成されるメソッドの数が大幅に削減されます。

1
Wink Saville

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

0
mboy