1. ホーム
  2. android

[解決済み] コードの縮小方法 - dexの65kメソッド制限

2023-03-05 11:25:58

質問

多くのライブラリ プロジェクトに依存する、かなり大規模な 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 メソッドの制限に当たることを回避する必要があります。