2013-03-15 6 views
27

私のチームと私は別のチームから大きなAndroidプロジェクトを継承しました。付属のライブラリを含むアプリケーション全体には、約35000のメソッドがあることが報告されています。ここで、プロトコルバッファを使用する必要があるアプリケーションに新しいサービスを実装する作業があります。64KメソッドのDalvikコンパイラ制限の問題を解決するにはどうすればよいですか?

問題は、必要なすべての.protoファイルを含む生成された.jarファイルが、もう1つの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 

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

提案がありますか?

+0

周りの最も簡単な作業ですアプリにはその多くの方法が含まれています(そして、そのうちのいくつかを取り除くことはできません)。ソリューションはおそらく、アプリケーションを組み立てることができる小さな部分に分割する必要があります別々のdexファイルに変換します。これを行う方法の例については、[this blogpost](http://android-developers.blogspot.se/2011/07/custom-class-loading-in-dalvik.html)を参照してください。 – Michael

+0

Facebookのチームは先日、この正確な問題に関するメッセージを投稿しました。 https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920 – Rawkode

+2

@Rawkode:Facebookの問題は、サイズが「LinearAlloc」が小さかったためでした。古いバージョンのAndroid(froyo、gingerbread)のバッファー。 64Kメソッド参照制限は、Dalvik命令自体に組み込まれています。 – fadden

答えて

12

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

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

+4

ここには、各jarのメソッド数をカウントするスクリプトhttps://gist.githubがあります。 com/toms972/c83504df2da1176a248a –

+1

リンクされたポストは少し古いです、それはAntベースのプロジェクトで複数のDEXファイルを読み込む方法を示しています。また、DexClassLoaderを直接使用しています。これは、android.support.multidexがサポートしており、サポートライブラリ(リビジョン21)で利用できるため、もはや不要なものです。 MultiDexをアプリに統合する方法の詳細は、https://www.contentful.com/blog/2014/10/30/android-and-the-dex-64k-methods-limit/ – woot

+0

@TomSuselに似ています。スクリプトを作成しました。小さな勾配のプラグインを書いて、あなたのメソッド数と各ビルドのどこから来るのかをより詳細に知ることができます - https://github.com/KeepSafe/dexcount-gradle-plugin – philipp

7

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

マイクロプロトバッファ(https://code.google.com/p/micro-protobuf/)も有用である。

+1

私はこのためにプロガードを使用していますEclipse内でデバッグ/実行コンフィグレーションビルドを有効にする方法がわかりません。これに関するヒント? –

+0

http://stackoverflow.com/questions/4732656/enabling-proguard-in-eclipse-for-androidなど、参考になる可能性のあるstackoverflowに関する記事があります。 – fadden

+4

この質問では、Eclipseでデバッグ/実行設定でproguardを使用しているとは言い切れません。 –

1

これはプロトコルバッファの最初の使用がある場合は、代替JavaMEのを見て可能性があり 実装すなわち

Third party add onsに記載されている他のものがあります。もしそれらのどれも使用していないのであれば、それは小さく見え、標準のプロトコルバッファによって作られたすべてのメソッドを持っているわけではありません。

1

我々は最近、大幅に生成されたメソッドの数を減らすのAndroidにNano Protobufsを追加しました。

+0

詳細については、意志? – icedwater

+0

はい、どうぞ... Nano Protobufsの使用を開始するために正確に何をしなければならないかについての詳細... –

4

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

4

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

バージョン6.5から、Google PlayサービスAPIをアプリに選択的にコンパイルすることができます。たとえば、Google FitとAndroid Wear APIのみを含めるには、ビルドの次の行を置き換えます。Gradleのファイル:これらの行で

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

:Eclipseを使用している場合は、あなたの場合はそれ以上の基準について

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

、あなたがhere

関連する問題