Andoridのパフォーマンスの最適化(4)APKをスリム化する方法

1はじめに

私たちの日常の開発プロセスでは、バージョンの反復、アプリケーションモジュールまたは機能の増加、古いコードの冗長性、さまざまなクールな効果の追加、画像用の高解像度携帯電話の要件、画像の不当な使用、および第三者の虐待ライブラリ、およびその他の理由により、アプリケーションインストールパッケージのApkファイルは徐々に大きくなっています。現在の携帯電話のトラフィック価格は過去数年ほど高くなく、WiFiカバレッジ環境はますます高まっていますが、携帯電話のパフォーマンスとストレージスペースは以前ほど厳しくなく、インストールパッケージに数Mを追加することは大きな問題ではありませんが、これらは、この問題を無視できる理由ではありません。インストールパッケージが大きすぎる場合は、通常の機能のアプリケーションについて考えてください。これは、競合製品と比較してユーザーの選択に影響を与え、不利になります。パッケージは、ダウンロード時間、インストール時間、占有時間にも比例します。大量、大きな画像、多数の画像も、アプリケーション自体のメモリ使用量を引き起こす可能性があります。したがって、痛みやかゆみを伴うように見える数Mのサイズは、実際には、製品体験が追求すべき最適化でもあります。今日のこの記事では、アプリケーションのインストールパッケージが大きくなる原因となる状況と解決策を見てみましょう。

2どこから始めるか

Apkファイルは実際にはzipパッケージなので、内部ファイル構造を表示できます。一般に、Apkパッケージの構造は次の図に示されています。

主に次のファイルが含まれています。

アセットに                            は、dbデータベースファイル、フォントライブラリ、Json / Xml構成など、コンパイルできないリソースファイルが含まれています。

libが                                   依存するさまざまなABIタイプのSOファイル

res                                  XML、画像、オーディオなどのコンパイル済みリソースファイル

classes.dexに                   は、メソッドの数が65525を超えるかどうかに応じて、1つ以上の、記述されたJavaコードのコンパイル済みクラスファイルが含まれます。

Resource.arsc             コンパイルされたリソースマッピング関係の構成情報。リソースインデックステーブルと同等

META-INF                     は署名関連情報を保存します

AndroidManifest.xmlは   、アプリ情報と4つのコンポーネント情報のマニフェストファイルを構成するために使用されます

したがって、Apkをスリム化したいのですが、実際には非常に単純な文で、Javaソースコードとリソースファイルから始め、コードとリソースを削除し、コードとリソースをリファクタリングし、コードとリソースを圧縮する必要があります。

3痩身プログラム

3.1コードサイズを縮小する

アプリケーション内のコードはシンプルでシンプルな場合があり、コードの量はインストールパッケージのサイズに影響を与えません。また、アプリケーションが大量のメモリを占有する原因にもなります。これまで)。コード量の削減は、次の側面から開始できます。

カット機能

カット機能は、コード量を削減する最も直接的な方法です。ユーザーデータを確認して、うまく機能しない機能、傷やかゆみを起こさない機能を切り刻むことができます。機能よりもアプリを使用する方が良いでしょう。

古いコードを削除

不要な機能を削除したくない場合は、コードバージョン管理ツールを使用して後で取得するか、削除する前にバックアップを作成できます。

サードパーティのライブラリの誤用を避ける

サードパーティのライブラリは使いやすく、高速ですが、両刃のナイフでもあります。単純なロジックは自分で開発できるため、他者が作成したライブラリにできるだけ依存しないようにする必要があります。これも個人の成長につながります。そして、時々、それは多くの場合、小さなロジックを使用してヘビー級のライブラリーを参照したいためであり、それは損失ではありません。

一般的なコード抽出

機能開発後にコードをリファクタリングする習慣を身につけます。コードの冗長性を減らすために、公開コードをできるだけ再利用します。美しいコードを書くことは、すべての開発者が常に追求する目標であるはずです。

Android Lintツールを使用する

Android Lintツールを使用して、インポート、変数、メソッド、クラスなどの未​​使用のコードを削除します。以下にAndroid Lintの使い方を紹介します。

3.2リソースを整理する

リソースは、アプリケーションおよび大規模なインストールパッケージのメモリ使用量が最も多い直接的な原因であるため、リソースの合理的な使用に直面する必要があります。リソースを整理する方法を見てみましょう。

リソース画像を圧縮する

画像の圧縮は最も直接的な方法ですが、現在、https://tinypng.comを使用して画像を圧縮する方法が一般的で、効果は依然として非常に優れています。さらに、それが止まる前に人間の目が歪みを見ることができるまで、それは繰り返し繰り返し押されなければなりません。

できるだけ少ない写真を使用する

必要に応じて、比較的単純なグラデーションの色やグラフィックだけが必要な場合もあります。その場合、ビットマップを使用する代わりに、Androidが提供するDrawableを使用できます。多くの場合、Drawableはビューの背景として使用されます。通常、XMLで定義されます。または、自分で定義したビューのonDrawで描画することもできます。これは、メモリとスペースの両方を節約するためです。画像を使用する必要がある場合は、最小サイズの画像を使用できるか、.9の画像を使用できるかを最初に検討する必要があります。

画像の再利用

方向の異なる画像しかない場合は、1つしか使用できず、次にRotateDrawableを使用して次のように回転します。 

Android Lintツールを使用する

Android Lintツールを使用すると、文字列、色、ドローアブルなど、役に立たない重複したリソースを見つけることもできます。以下にAndroid Lintの使い方を紹介します。

画像効果を簡略化する

画像の色が多ければ多いほど、画像ファイルは大きくなります。許容範囲内で、一部の画像効果(エッジグローやグラデーション効果の削除など)を少し単純化できます。

不透明な画像を使用してみてください

透明効果のある画像は、チャネルが透明であるため、非透明画像よりも大きくなります。背景色がはっきりせず、さまざまな背景の用途がある場合は、背景色を透明にせずに直接塗りつぶすことを検討できます。

フレームアニメーション変換

次の画像は、待機に使用される菊のアニメーションです。元々はフレームアニメーションを使用して実装されていましたが、これには16枚の画像が必要です。

実際、同じ効果をアニメーション+ファンマスクに変更して実現することができます。このようにして、14枚の写真を保存でき、保存できるスペースは10倍になります。

画像モザイク多重化

画像は、ステッチ方法を使用してコードのように再利用することもでき、大きな画像の使用を減らすだけでなく、次のように後で拡張することもできます。

一部のリソースの曇り

初めて使用されないライブラリや構成と同様に、フィルタリングしてクラウド化し、適切なタイミングでプルダウンすることを検討できます。

フォントライブラリを活用する

一般的に使用されるいくつかのモノクロアイコンは、ベクターグラフィックスに変換され、フォントライブラリの形式で提供されると見なすことができます。

3.3パッキングと圧縮

Gradleによる痩身

minifyEnable

Gradleはコード難読化メカニズムを提供します。これを有効にするにはminifyEnable = true使用します。コードの難読化は非常に便利な機能であり、Apkパッケージのサイズを小さくするだけでなく、逆コンパイルする人がソースコードロジックを理解しにくくなり、分析が難しくなります。通常、リリースモードでコンパイルされたバージョンは、難読化機能を開始します。

shrinkResources

Gradleは、未使用のリソースを自動的にクリーンアップし、shrinkResources = trueを有効にする構成を提供しますこの構成はminifyEnableと組み合わせて使用​​する必要があります。これは、役に立たないコードがクリーンアップされた後、いくつかの役に立たないコードによって参照されるリソースがクリーンアップされる可能性があるためです。

同じ問題がminifyEnableshrinkResourcesを使用する場合に存在します。つまり、コードでリフレクションが使用されている場合、Android Gradleはそれを区別できないため、ターゲットクラスのコードを反映できず、参照されたリソースが誤ってクリーンアップされるため、キープホワイトリストの設定に注意してください。

resConfigs

GradleのResConfigsはPraductFlavor {}のメソッドに属しています。これにより、パッケージにヒットするリソースのタイプを構成できます。

Gradleの詳細については、以前のGradleシリーズの記事「Android Gradleの使用法の詳細な説明(3)Android Gradleプラグイン構成の詳細な説明」を参照してください

AndResGuard はリソースを混乱させる

AndResGuardは、リソースを混乱させるパッケージツールです。resources.arscファイルを変更することで、Apkパッケージのリソースファイルパスを難読化し(res / drawable / welcome.pngをr / s / a.pngに混同するなど)、Apkパッケージのサイズを縮小する目的も達成できます。使い方はとても簡単で、Gradleで設定する必要があります。詳細な手順については、以前のGradleシリーズの記事「Android Gradleの詳細な使用方法(8)AndResGuardを使用してAPKパッケージリソースを難読化する」を参照してください

3.4プラグイン

独立したモジュール機能として使用されるのは、アプリケーションで初めてではありません。プラグインを検討することができます。プラグインに関する関連知識については、以前のプラグインシリーズの記事「Androidプラグインの原則と実践」を参照してください

Android Lintを使用してアプリをスリムにする4つのステップ

Android Lintは、Android SDKが提供する静的コード検出ツールです。そのソースコードはAndroid SDK Tools 16以降のバージョンに統合されています。プロジェクトディレクトリの./gradlew lintコマンドから呼び出すか、Android Studioの[Analyze]-> [Inspect Code]パスからLint検査を呼び出すことができます。これにより、プロジェクトの問題をチェックし、より標準化された方法でアプリを開発することができます。たとえば、次のような問題が検出されます。

  1. レイアウトのパフォーマンス、たとえば、役に立たないレイアウト、ネストが多すぎる、レイアウトが多すぎる
  2. 国際化の問題、xmlファイルにハードコーディングがありますか
  3. 未使用のリソースとコード
  4. 一貫性のない配列サイズ
  5. アイコンの問題(アイコンの重複、サイズの誤りなど)
  6. 使いやすさの問題
  7. 考えられるバグ
  8. 待って

ここで作成者は、以下に示すように、プロジェクトでlintを使用してテストレポートを生成します。減量の適用に関しては、当面は以下の5つの主要な問題にのみ焦点を当てる必要があります。

質問1:Android> Lint> Performanceを展開すると、画像、XML、文字列、色、スタイルなど、役に立たないリソースを表すUnused resourcesアイテムがあります。

質問2:Android> Lint>使いやすさ>拡張後のアイコンに2つの項目があります:異なる名前の重複したアイコンと、さまざまな構成で同じビットマップそれらは異なる名前を表しますが、同じ画像(MD5はまったく同じ画像ですが、複数の画像があります)と異なる仕様は2つの同じ画像を使用します(たとえば、同じ画像がhdpiとxhdpiで使用されています)。

質問3:宣言>展開後の冗長性には、空のメソッドと未使用の宣言という2つの項目があります。これらは、変数、メソッド、クラスなど、空のメソッドと未使用の宣言をそれぞれ表します。

質問4:インポートが展開された後、未使用のインポート項目があります。これは、役に立たないインポートを意味します。

           

質問5:XMLが拡張された後、未使用のXMLスキーマ宣言を示す未使用のXMLスキーマ宣言項目があります。

上記の5つの主要な問題は、一般的に、可能な限り解決した後に減量の影響を見ることができます。特に、Android Lintを繰り返し実行して数回検出することをお勧めします。これは、役に立たないコードを削除してから検出すると、それに関連付けられているリソースが検出される可能性があるためです。

 

 

元の記事を106件公開 37 件を賞賛 80,000回

おすすめ

転載: blog.csdn.net/lyz_zyx/article/details/85841675