web-dev-qa-db-ja.com

アプリのモジュール化後に参照されるメソッドの数が増える

AS:3.5.3; Android Gradleプラグイン:3.5.0; Gradle:5.6.2;

「app」モジュールをいくつかの小さなモジュールに分割した後、アプリで参照されるメソッドの数が大幅に増加することがわかりました。しかし、奇妙なことに、各クラスによる参照メソッドの追加は、Android Apk Analyzer Toolに記載されている合計よりも少ないです。

テストのために、WebActivity.classを「app」モジュールから「adapters」モジュールに移動し、参照されるメソッドの数が181メソッド増加しました。

要約する:

app/WebActivity =63546実際に参照されているメソッドですが、65394メソッドを示しています。 adapter/WebActivity =63543実際に参照されているメソッドですが、65575メソッドを示しています。

4つの新しいモジュールを追加/分割した後、「参照されたメソッドの数」が約10k増加しました

正確な問題は何ですか?

アプリのモジュール化によって、参照されるメソッドの数が大幅に増える可能性がある

以下は、私が撮った2つの異なるAPKのみのスクリーンショットです。WebActivityが「app」モジュールから「adapter」モジュールに移動し、181の参照メソッドが増加しています。

「app」モジュールのWebActivity enter image description here

WebActivityを「アダプター」モジュールに移動 enter image description here

スクリーンショットで、各クラスによる参照メソッドの追加(赤色でマーク)が、Apkアナライザーで与えられた合計と等しくないのはなぜですか?

16
Rohit Surwase

ソリューションが私の心の中でクリックしただけで、自分の質問に答えますが、これは試されていませんが、間違いなくまたはおそらくは機能します。 :) AFさんからの回答 は、最終的な解決策を見つけるのに非常に役立ちました。それはなぜですか?しかし、それを回避する方法やそれを改善する方法はありません。

これが元の/実際の参照メソッド数を取得する/-方法です-

アプリをモジュール化する方法に依存するのではなく、依存関係を追加する方法に依存します。 「実装」を使用して依存関係を追加すると、その依存関係はモジュールに対してプライベートのままとなり、他のモジュールはそれを使用できなくなります。そして、「api」を使用して同じ依存関係を追加すると(非推奨の「コンパイル」と同じ)、パブリックになり、他の依存モジュールがそれを使用できます。 マルチモジュールプロジェクトの各モジュールに依存関係を追加するために「実装」を使用しているため、各モジュールには必要な依存関係がすべて自己完結型としてあり、これが個別にコンパイルできる理由です。これにより、変更されたモジュールのみをコンパイルできるため、ビルド/コンパイル時間が短縮されます。 しかし、'implementation'を使用すると、参照されるメソッドの数が増えます重複する参照されるメソッドが非常に多くなるためです。

したがって、ビルド時間が問題ではないが、参照されるメソッドの数が問題である場合は、すべてのモジュールの依存関係ツリーを描画し、基本モジュールで「api」を使用して重複する依存関係を追加しないようにすることができます。このようにして、トップモジュールでもベースモジュールによって追加された依存関係を使用できます重複を回避します。これにより、ビルド時間が長くなることに注意してください。

デバッグとリリースビルドの依存関係を区別できれば、両方を達成できます'implementation'を使用してすべての依存関係をデバッグビルドに追加し、リリースビルドに必要な最適化された依存関係のみを 'api'を使用して追加します。この方法では、デバッグビルドが高速になり、リリースビルドが低速になります。

注:デバッグとリリースビルドに個別の依存関係を提供する方法を見つけたら、この回答を更新します。

2
Rohit Surwase

あなたの「com」パッケージのすべての違いがわかります。縮小されたクラスを正確に比較できます。最新のR8でビルドする場合、デフォルトで一部のコードを削除できます。一部のクラスをモジュール縮小プログラムに入れるとき、パブリッククラス/メソッドを削除できるかどうか、または別のモジュールで使用するためにとどまる必要があるかどうかはわかりません。 enter image description here

0