10

複数の大きなサードパーティのjarファイル(Androidライブラリなど)を含む非常に大きなAndroidプロジェクトがあります。
Dexのメソッド制限の最大数に達したと思います(Eclipse経由でコンパイル):

[2012-11-18 02:28:45 - ファイル内を検索] Dx 処理 classes.dex...
[2012-11-18 02:28:48 - Dex ローダー] dex を実行できません: 新しいインデックス 66774 をマージできません非ジャンボ命令!
[2012-11-18 02:28:48 - ファイル内を検索] Dalvik 形式への変換に失敗しました: dex を実行できません: 新しいインデックス 66774 を非ジャンボ命令にマージできません!

したがって、SDK ツール 21 (プラットフォーム ツール 16) を利用して、メイン プロジェクトの project.properties を set に編集しましたdex.force.jumbo=true
APK の生成を許可するフラグ。しかし、私はそれを適切にインストールできませんでした(物理的およびエミュレーターの両方で)。dex オプティマイザーの障害があるようです:

11-18 20:11:05.338: I/PackageManager(103): dexopt を実行中: com.mypackage.myapp
11-18 20:11:08.577: E/dalvikvm(868): 順不同の method_idx: 0x2ae0 then 0x1
11-18 20:11:08.577: E/dalvikvm(868): アイテム 1544 @ オフセット 0xf7ae24
11-18 11-18 20:11:08.577: E/dalvikvm(868): セクション タイプ 2006 のスワップに失敗しました
11-18 20 :11:08.577: E/dalvikvm(868): エラー: バイト スワップ + 検証に失敗しました
11-18 20:11:08.597: E/dalvikvm(868): 最適化に失敗しました
11-18 20:11:08.597: W/installd( 39): DexInv: --- END '/data/app/com.mypackage.myapp-1.apk' --- status=0xff00、プロセスが失敗しました
11-18 20:11:08.597: E/installd(39): 「/data/dalvik-cache/data@app@com.mypackage.myapp-1.apk@classes.dex」で dexopt が失敗しました res = 65280
11-18 20:11:08.697: W/PackageManager(103): パッケージを /data/app/com.mypackage.myapp-1.apk にインストールできませんでした
11-18 20:11:09.018: D/dalvikvm( 103): GC_EXPLICIT は 1698K を解放し、17034K/19463K を 13% 解放し、7ms+135ms
11-18 20:11:09.068 を一時停止しました: D/AndroidRuntime(780): VM をシャットダウンしています

dex.force.jumbo意図されていない目的でフラグを使用しようとしていますか、それともこのエラーは予測できませんか?
もしそうなら、非常に多くのクラス/メソッドを含むプロジェクトを生成するためのより良い戦略はありますか?

4

2 に答える 2

8

64K メソッドの制限は、Dex 形式の制限です (メソッドの検索に 2 バイトを使用します)。
Nandeesh のコメントは、ジャンボはメソッドではなく文字列のみを解決することを指摘しています。

私が試した/考えた代替案
(気を引き締めてください、それらはすべて最悪です): 1. Do It Yourself - 最も太ったサードパーティのライブラリを捨てて、その機能の正確な部分を自分で書きます。これは、小さな機能のために多くのコードを含めていることに気付いたので、最終的に採用したアプローチです。
2. Dalvik でのカスタム クラスの読み込み- 別の Dex をコンパイルし、実行時に読み込みます。短所:面倒で、熟考が必要です。
3.コード プルーニング- 詳細なクラスの読み込みをオンにし、アプリを実行して、サード パーティのライブラリ、または実際には使用されていないライブラリの一部を削除してみてください。短所: クラスが動的にロードされるため、時間がかかり、エラーが発生しやすくなります。
4.分割して同意する- 別のプロセス (サービス) でサード パーティのライブラリをパッケージ化します。このサービスは、サード パーティのライブラリ機能を提供します。メイン プログラムからこのサービスの呼び出しを実行します。

Dalvikの初期の設計チームの一部として 、 640kの場合は誰にとっても十分であるはずです.または、地球上の2台ごとの電話にこれを搭載することは決してありません.

詳細を読みたい場合、または単に Google に負荷をかけたい場合は、次の欠陥を作成しました: http://code.google.com/p/android/issues/detail?id=40409

于 2013-01-27T21:13:02.930 に答える
0

私は同じ問題に遭遇しました。最後に、同じ名前の複数のメソッドが原因である可能性があることがわかりました。たとえば、 doSomething(List list); です。そしてdoSomething(リストリスト); コンパイラはエラーを表示しませんが、デバイスにインストールできません。したがって、同じ名前のメソッドを確認してください。

于 2013-05-25T12:39:58.947 に答える