24

アプリケーションを Box、Dropbox、および Google Drive と統合しようとしています。これらの 3 つのサービスはすべて、多数のサードパーティ jar を必要とします。さらに、私のアプリケーションにはすでにいくつかのサードパーティの jar が必要です。Eclipse からアプリケーションを実行しようとすると、次のエラーが発生します。

dex を実行できません: メソッド ID が [0, 0xffff] にありません: 65536 Dalvik 形式への変換に失敗しました: dex を実行できません: メソッド ID が [0, 0xffff] にありません: 65536

アプリケーションのメソッドが多すぎるために、このエラーが発生したようです。これらのメソッドの大部分はサードパーティの jar からのものであると確信しているため、コードを単純化してこれを解決しようとするのは非現実的です。これら2つの提案をオンラインで見つけました。

  1. project.propertiesに追加dex.force.jumbo=trueします (そして adt バージョン 21 を使用します)。私はこれをしましたが、それでもエラーが発生します。

  2. http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.htmlで説明されているように、複数の dex ファイルを使用します。これが唯一の選択肢のようですが、私の場合にどのように適用されるかわかりません。問題は、Drive のようなサービスに依存関係が多すぎることです。この解決策では、依存関係を参照するときに変化形を使用するように Drive ソースを変更する必要はありませんか? (これは明らかにオプションではありません)。

  3. プロガードを使用して、未使用のコード/メソッドを縮小削除します。proguard を使用したアプリケーションのエクスポートは機能し、ドキュメント サービスの統合は 4.0 以上のデバイスで期待どおりに機能します。ただし、2.3 デバイスでテストすると、classnotfound エラーがスローされます。

というわけで、この件に関して何かアドバイスをいただければ幸いです。オプション 2 は私の場合の解決策ですか? 検討すべき別の解決策はありますか?

4

8 に答える 8

14

これらの 1 つ以上をメイン アプリのプラグインとして、ダウンロード可能な個別の APK の形式で開発することもできます。その APK は、メイン アプリが使用するコンポーネントを公開します。これらのサービスとの統合の性質がわからないため、それについてより具体的な推奨事項を作成することはできません。独自のsignatureレベルのカスタムを使用して<permission>、2 つのアプリ間の通信を保護します。また、おまけとして、サードパーティのライブラリを使用することで追加のパーミッションが必要になった場合、プラグイン APK でこれらのパーミッションのみが必要になるため、メインの APK を小さく保つことができます。

于 2013-03-19T20:09:16.193 に答える
7

***NEW**** 他の回答はすべて古くなっています。これが新しい修正です

Android 5.0 以降

Multi-dex サポートは自動的に含まれます。ドキュメントから:

Android 5.0 以降では、アプリケーション APK ファイルからの複数の dex ファイルの読み込みをネイティブにサポートする ART と呼ばれるランタイムを使用します。ART は、アプリケーションのインストール時に事前コンパイルを実行します。これは、classes(..N).dex ファイルをスキャンし、それらを Android デバイスで実行するために単一の .oat ファイルにコンパイルします。Android 5.0 ランタイムの詳細については、ART の紹介を参照してください。

Android 5.0未満

Android マルチデックス サポート ツールを Gradle ビルドに追加するだけです。

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}
于 2015-01-10T05:02:48.100 に答える
6

Dalvik VM は、dex ファイルごとに最大 65536 のメソッドを持つことができます。これは、バイトコード命令セットには 16 ビットを超えるメソッド番号を参照する方法がないためです (コメントで @danfuzz が指摘しているように)。

複数の dex ファイルを使用してこれを修正することは可能ですが、Facebookは問題を回避するためにアプリ内に展開できる別の修正を見つけました。

于 2013-03-19T19:18:07.970 に答える
5

vm/LinearAlloc.c を参照すると、次のコードが見つかります: (私の調査では、Android 2.3.3 で 5MiB、Android 4.0 以降で 8MiB)

#DEFAULT_MAX_LENGTH (5*1024*1024) を定義

...

LinearAllocHdr* pHdr;

...

pHdr->mapLength = DEFAULT_MAX_LENGTH;

「Facebook 修正」は、ネイティブ C ポインターを使用してこのメ​​モリを編集していると思われます。IMHO LinearAllocの問題とこのメソッドIDの問題は別のものです。

于 2013-07-10T02:50:13.533 に答える
1

65k メソッドの制限に達することに関する問題のほとんどは、アプリでの乳歯の Google Play サービスの使用に関連しています。最近では、それを使用するとより粒度が得られます。

このガイドに従って、必要なパーツのみを使用できます。おそらくこれで問題が解決し、いくつかの黒魔術のトリックを回避するか、multiDex を使用します。たとえば、アプリで Google マップのみが必要な場合 (そして、広告、ウォレット、Google Wear、アナリティクスなどを使用していない場合)、依存関係全体を使用すると、時間とスペースの無駄になります。そのように使用できます:

compile com.google.android.gms:play-services-base:6.5.87
compile com.google.android.gms:play-services-maps:6.5.87

このリンクで「パーツ」の全リストを読むことができます

于 2015-02-10T14:54:48.443 に答える
0

これは、特定のフォルダーの各 jar (および合計) 内のメソッドの数をカウントするために私が作成したスクリプトです

メソッドを数えたら、重いライブラリのリファクタリングと削除に集中できます。

于 2014-07-28T09:13:45.490 に答える