[解決済み] コードの縮小方法 - dexの65kメソッド制限
質問
多くのライブラリ プロジェクトに依存する、かなり大規模な Android アプリを持っています。Android コンパイラーは .dex ファイルごとに 65536 個のメソッドという制限を設けていますが、私はその数を超えつつあります。
メソッドの制限に当たった場合、基本的に 2 つのパスを選択できます (少なくとも私が知っている限り)。
1) コードを縮小する
2) 複数の dex ファイルをビルドする ( このブログの記事 )
私は両方を調べて、メソッド数がこれほど多くなる原因を見つけようとしました。Google Drive API は、12,000 を超える Guava 依存性で最も大きな塊を占めています。Drive API v2 のライブラリの合計は 23,000 以上に達します!
私の疑問は、どうしたらよいかということです。アプリの機能として Google Drive の統合を削除すべきでしょうか。API を縮小する方法はありますか (はい、私は proguard を使用しています)。複数の dex ルート (特にサードパーティの API を扱うのはかなり大変そうです) に行くべきでしょうか?
どのように解決するのですか?
Google はついに dex ファイルの 65K メソッド制限を超えるための回避策/修正策を実装したようです。
65Kの参照制限について
Android アプリケーション (APK) ファイルには Dalvik Executable (DEX) ファイルという形式の実行可能なバイトコード ファイルが含まれています。 ファイルには、アプリを実行するために使用されるコンパイルされたコードが含まれています。この Dalvik Executable の仕様は、1 つの DEX ファイル内で参照できるメソッドの総数を制限しています。 Dalvik Executableの仕様では、1つのDEXファイル内で参照できるメソッドの総数は65,536個に制限されており、これには Androidフレームワークのメソッド、ライブラリのメソッド、および独自のコードのメソッドを含む 制限されています。この制限を超えるには、アプリのビルドプロセスで複数のDEXを生成するように設定する必要があります。 ビルドプロセスで複数の DEX ファイルを生成するように設定する必要があります。 の構成が必要です。
Android 5.0 以前の Multidex サポート
Android 5.0 以前のプラットフォームのバージョンは、アプリコードの実行に Dalvik ランタイムを使用します。 を使用しています。デフォルトでは、Dalvik はアプリを APK あたり 1 つの classes.dex バイトコード ファイルに制限されています。この制限を回避するために を使用することができます。 マルチデックス サポート ライブラリ を使用します。 このライブラリは、アプリの主要な DEX ファイルの一部となり、追加の DEX ファイルとそのファイルに含まれるコードへのアクセスを管理します。 このライブラリは、アプリの主要な DEX ファイルの一部となり、追加の DEX ファイルとそのファイルに含まれるコードへのアクセスを管理します。
Android 5.0 以降の Multidex サポート
Android 5.0 以降では、ART と呼ばれるランタイムを使用しており、アプリケーションの APK ファイルから複数の dex ファイルの読み込みをネイティブでサポートしています。 アプリケーションの APK ファイルから複数の dex ファイルを読み込むことをサポートしています。ART はアプリケーションのインストール時にプリコンパイルを実行し classes(..N).dex ファイルをスキャンし、それらを 1 つの .oat ファイルにコンパイルして、Android デバイスで実行します。 Androidデバイスで実行されます。Android 5.0ランタイムの詳細については 5.0 ランタイムの詳細については ARTの紹介 .
ご覧ください。 65K以上のメソッドでアプリを作る
マルチデックスサポートライブラリ
このライブラリは、複数の Dalvik Executable (DEX) ファイルを持つアプリのビルドを このライブラリは、複数の Dalvik Executable (DEX) ファイルを持つアプリの構築をサポートします。65536 以上のメソッドを参照するアプリは 65536 以上のメソッドを参照するアプリは、multidex 構成を使用する必要があります。 multidex の使用に関する詳細については 655K 以上のメソッドを持つアプリケーションの構築 655Kメソッドを超えるアプリの構築 .
このライブラリは、Androidサポートライブラリをダウンロードした後、/extras/android/support/multidex/ディレクトリに配置されています。 ディレクトリにあります。この このライブラリには、ユーザーインターフェースのリソースは含まれていません。アプリケーション・プロジェクトに含めるには の説明に従って、アプリケーションプロジェクトにインクルードしてください。 ライブラリの追加 をリソースなしで追加します。
このライブラリのGradleビルドスクリプトの依存性識別子は次のとおりです。 は以下の通りです。
com.android.support:multidex:1.0.+ この依存関係の表記は、リリースバージョン1.0.0以上を指定します。 リリースバージョン 1.0.0 以降を指定します。
proguard を積極的に使用し、依存関係を見直すことで、65K メソッドの制限に当たることを回避する必要があります。
関連
-
[解決済み] dexの実行ができない:メソッドIDが[0, 0xffff]にない:65536
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] ViewPagerのアイテムを強制的に再インスタンス化する方法 [重複].
-
[解決済み] これはどういうことですか?失敗 [INSTALL_FAILED_CONTAINER_ERROR]?
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] アンドロイドでシェイクを検出するには?
-
[解決済み] Androidの開発でGoogle Guavaライブラリを使うのは良いアイデアですか?
-
[解決済み] <string> XMLで改行やタブを作るには(eclipse/android)?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] dexの実行ができない:メソッドIDが[0, 0xffff]にない:65536
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] FragmentPagerAdapterのgetItemが呼び出されない
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] Android Lintが翻訳されていない文字列を訴えないようにする。
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
-
[解決済み] ViewPager2でスワイプを無効にするには?