私はコードのパフォーマンスとパラメーターの調整について長い間読んでいます。確かに、Androidプログラムは私の焦点の1つです。
最初に、ソリューションの実現に役立つ基本的または最も重要な概念を紹介しましょう。
Androidの開発者は述べています
モジュールは個別に構築、テスト、デバッグできます
したがって、モジュールには独自のGradle&Dependenciesがあり、プロジェクトでそれを探索できますHierarchy Viewer
。
実際のところ、モジュール化ではメンテナンスが重要視されます。Performance Mattersとは異なり、モジュール化には次の重要な影響があります。
これは、明確にするためにプロットした図です。ご覧のとおり、ディスクリートモジュールを使用しているときに、メソッドAを呼び出すために、ディスクリートモジュール2N micro secs
がN micro secs
ない場合と比較しています。
この質問は、参照メソッドが継承の深さに関連するものを数えることをあなたに思い浮かびますか?
答えは次のとおりです。モジュール化を使用するとReferenced Methods.butが増加しますが、実際にはアプリのパフォーマンスに影響はなく、主な問題は、ほとんどの場合無視できる継承の深さです。
モジュール化における参照メソッドの増加は、各モジュールのGradleと依存関係によるものであることを強調します
アプリのモジュール化によって、参照されるメソッドの数が大幅に増加する方法を教えてください。
APKアナライザーに重要な参照メソッドに影響を与える条件
また、ソースコードがコンパイルされた後、縮小とコードの縮小はそれぞれDEXファイルの内容を大幅に変更する可能性があることにも注意してください。
上記の公式ステートメントに加えて、次のようなAPKアナライザーに影響を与える別の条件を追加したいと思います。
開発者はモジュール化でどれくらいの経験がありますか?
モジュール化は、建築(開発者)がどこにキッチン、どこにトイレ、どこにトイレがあるかを定義する家のようなものです。
建築物がトイレとキッチンを組み合わせることに決めた場合はどうなりますか?ええ、これは災害です。
これは、開発者があまり経験がない場合、モジュール化中に発生する可能性があります。
追加情報に加えて、OPの質問への回答
ここでコメントのopの質問に答えます
分離したGradleが参照されるメソッド数に追加されるのはなぜですか?個別の依存関係の場合、最終結果が単一のAPKである場合、「アプリ」での依存関係の重複は考えられず、機能モジュールが参照されるメソッドの数に追加することになります。
モジュールはビルド、テスト、デバッグできるため、独自のGradleとDependencyが必要です。
マルチモジュールプロジェクトがコンパイルされている間、コンパイラは.dex
以下を含むいくつかのファイルを生成します。
.dex
総統合の依存関係のためのファイル
- モジュール
.dex
s
依存関係.dex
ファイルはすべてのモジュールgradleの統合です
モジュールグラドルが最終的な参照方法数にどのように影響するか見てみましょう。
同じ結果の2つ APK
のs がありますが、参照されるメソッドの数が異なります。
どちらも空のアクティビティであり1.7k
、参照されるメソッドの数が非常に高く、その機能によって異なります。主な違いは、モジュールのGradleにあります。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}
別に構成されたもの
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0-alpha01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
}
それらは単なる空のアクティビティですが、Gradleの最小限の1.7k
違いが参照メソッド数の違いを引き起こしました。
そしてApp Gradleは
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation project(path: ':module')
}
主な懸念は、個別に参照されるメソッド数の追加が、Apkアナライザーでの参照されるメソッド総数と異なるのはなぜですか?
これはIDEフィルターであり、他には何もありません。確かに、.dex
ファイルのみを選択した場合、参照メソッド数は各行の参照されたメソッド数の合計に等しくなり.dex
ますが、ファイルを複数選択した場合、SUMと実際の数に違いが見られます。それらをフィルタリングします。
スクリーンショットで、複数の.dex
ファイルを選択してから、Analyzerフィルターの等価性を選択しました。
このプロジェクトでは、一元化されたdependency.gradleファイルを使用しているため、バージョンが異なる可能性はありません。それで、機能モジュールに依存関係とそのバージョンの同じ/正確なセットがある場合でも、参照されるメソッドの数が増えると思いますか?
理論的には、参照されるメソッドの数が増えることはありません。しかし、私はそれを説明したように、開発者の経験、高度に影響を与える最終的な結果。
Team Analyzerは、リリース前にパフォーマンスの問題をチェックして修正する必要があります
- プロガードルール
- 縮小されたリソース
- androidManifest.xml
- グラドル設定
次に、開発者エクスペリエンスとコード保守が最終結果にどのように影響するかを明確にしたいと思います。APKが一元化された依存関係を使用している場合でも
上記の例では、i'vは増加5.1k
数参照先のメソッドでEVEN IF私が持っていたの集中の依存関係を !!!!!
どのように可能ですか?
答えは:プロジェクトのディレクトリに役に立たない隠し.jar
ファイルを追加したところlibs
です。あなたが見ることができるのと同じくらい簡単に、私は最終結果に影響を与えました。
ご覧のように、開発者エクスペリエンスは最終結果に影響します。その結果、実際には、参照されたメソッドは増加する可能性がありますが、理論的にはそうではありません。
また、並列コンパイルを無効にして「app」モジュールのみをコンパイルしても、参照されるメソッドの数に違いがないのはなぜですか?'app'モジュールの依存関係のみが使用されていたので、減少しているはずですよね?
コンパイルは、参照されるメソッドcounts.itとは何の関係もありません。開発者がコンパイルしたいものに準拠しています。
結論
私は問題の周りのすべての可能性をカバーしました。実際、さまざまな状況から発生する可能性があり、このガイドラインを使用することで開発者は問題を修正できます。
- 参照メソッドが増加した理由と、場合によっては大幅に増加した理由を見つけていただければ幸いです。
- モジュールには、Gradle&Dependenciesとモジュール化増加モジュールがあります。したがって、これらのメソッド参照。
- モジュール化は、実際には無視できるほどのアプリのパフォーマンスに影響を与えますが、アプリのメンテナンスを大幅に改善します。
- モジュール化における開発者の経験も、最終結果に大きな影響を与えます。
重要な注意:ほとんどすべての記述は私の調査および研究です。実際、エラーや障害が発生する可能性があり、今後さらに多くの情報を追加するために更新されます。