開発者は、どのようなクラフトグリッド完全な力を把握するように見えますか?あなたはAPK薄い知識を理解する必要があります!

ビジネス、コードの複雑化によって、リソースは常に、あなたはまた、APPのサイズを大きくしている、増加しています。

ユーザーの観点からは、APPのメガバイトのすべてのターン数十の顔が非WIFIの例では、ダウンロードにはまだ躊躇している、何のダウンロードは、あなたは、ユーザーを失うことがあります。

企業レベルが関係しているから、トラフィックはお金である、APPのサイズを小さく、特に重要です。開発者の観点からは、このクラフトは若干グリッド完全な力となりますマスターしています。

ADOは、トピックを起動します。

それらのものの01 APK構造

自分自身を知っている、唯一の自分を知ることができます。私たちのために役立つアプリケーションのAPKの構造を理解します。APKファイルには、アプリケーションを構成するすべてのファイルを含むZIPアーカイブの組成、構成されています。これらのファイルは、Javaクラスファイル、リソースファイルとコンパイル済みのリソースを含むファイルが含まれます。

APKは、次のディレクトリが含まれています。

  • META-INF/:含まれていCERT.SFCERT.RSA署名ファイルおよびMANIFEST.MFマニフェストファイル。
  • assets/:含まれていたアプリケーションを使用することができますAssetManagerアプリケーションリソースオブジェクト検索を。
  • res/:リソースにコンパイル含まれていませresources.arsc
  • lib/プロセッサ固有のソフトウェア層を含むコンパイルされたコード。このディレクトリには次のように、各プラットフォームのサブディレクトリが含まれているarmeabiarmeabi-v7aarm64-v8ax86x86_64、とmips
  • resources.arsc:コンパイルされたリソースを含みます。このファイルには含まれres/values/、すべてのXML設定のフォルダの内容を。XMLコンテンツを抽出するパッケージングツールは、バイナリフォーマットとコンテンツアーカイブにコンパイルされます。これは、言語文字列やスタイルだけでなく、直接に含まれresources.arsc、このような画像ファイルやレイアウトなどのコンテンツファイルパスを、。
  • classes.dex:のDalvik / ART仮想マシンに理解DEXファイル形式のクラスでコンパイルが含まれています。
  • AndroidManifest.xml:コアのAndroidマニフェストファイルが含まれています。文書には、アプリケーション名、バージョン、およびリファレンスライブラリへのアクセスを示しています。AndroidのXMLフォーマットを使用してバイナリファイル。

淘宝網の解凍後のAPPのファイルディレクトリを見てみましょう

一般的には、APK構造は、一般に比較的大きな部分であるclasses.dex、lib、res、assetsこれらのファイルやディレクトリの。だから、次は、これらの4つのケースについて説明します。

また、当社は、APK APKアナライザで分析することができます

02減少classes.dex

classes.dexは、すべてのJavaコードが含まれています。アプリケーションをコンパイルすると、Gradleのは、一つのファイルclasses.dexに.dexファイルとそれらのファイルへの.classファイルにあなたのすべてのモジュールを変換します。

Classes.dex単一のファイルには、64Kの方法について、保持することができます。あなたはこの制限に達した場合、あなたのプロジェクトにmultidexing有効にする必要があります。これは、メソッドの残りの部分を格納するための別のclasses1.dexファイルが作成されます。classes.dexは、ファイルの数によって決まりますので、メソッドを数えます。

第三のライブラリの使用を削減

頻繁な変更や事業の複雑化により、我々は時々我々は唯一の機能のごく一部を使用することができ、サードパーティLibarayを使用する傾向があり、この時の必要性を慎重に完全なリファレンスと見なされます。開発の面で私の経験から、達成するために自分自身を参照することを好むが、また、我々は、サードパーティのライブラリを導入する必要はありません。

Enumerationを避けます

アプリケーションの列挙には、classes.dexファイルサイズの1.0〜1.4 KB程度追加します。これらの追加はすぐに複雑なシステムまたは共有ライブラリに蓄積することができます。可能であれば、使用することを検討して@IntDef注釈を、変換のこのタイプは、タイプセーフな列挙のすべての利点を保持します。

使用ProGuardの

コード圧縮のためのbuild.gradleファイルから次のコードは、リリースビルドのために有効になります。

  android {
      buildTypes {
          release {
              minifyEnabled true
              proguardFiles getDefaultProguardFile('proguard-android.txt'),
                      'proguard-rules.pro'
          }
      }
      ...
  }

またminifyEnabled特性、ならびにProGuardのproguardFilesプロパティを定義するための規則で:

getDefaultProguardFile( 'ProGuardの-android.txt')メソッドは、ProGuardのAndroidのSDKツール/ ProGuardの/フォルダをデフォルト設定から取得することができます。
ヒント:さらに圧縮コードをしたいために、同じ場所に位置ProGuardの-アンドロイド-optimize.txtファイルを試してみてください。これは、ProGuardの同じルールを含むが、他の最適化分析は、さらなる小型化およびAPKのヘルプその速度を上げるを低減するために、バイトコード(内および方法)で行われます。

proguard-rules.proファイルは、カスタムProGuardのルールを追加するために使用されます。デフォルトでは、このファイルには、(次のbuild.gradleファイルへの)ルートディレクトリモジュールです。

ファイルの解像度で03最適化し、資産とリソース

余談

RES /生ポイントと同じの資産:

  1. パッケージ後の両方のディレクトリ内のファイルがそのままAPKパッケージに格納され、バイナリにコンパイルされることはありません。

RES /原資産との違い:

  1. res/raw直接R.raw.filenameあるリソースIDを使用してアクセスする場合のファイルは、R.javaファイルにマッピングされ、R.java、訪問の必要性AssetManagerクラスの時間にマッピングされることはありません、フォルダ、ファイル資産。
  2. res/rawディレクトリ構造を持っており、資産は、ディレクトリ資産の下にあるディレクトリ構造は、その後、フォルダを作成することができますすることができません。

異なる状況のために、異なる最適化戦略のためのリソースファイル。一般的に、解像度のための/ PNG形式のリソースで描画可能-hdpiを圧縮することができます。

画像のリソースの最適化戦略

圧縮フォーマット

使用TinyPngまたはGuetzliの圧縮。Guetzliの使用は、私の以前のブログ記事で見つけることができ書いマックGuetzliにGoogleの画像圧縮ツールを使用して

使用WEBPファイル形式

ポジショニングのAndroid 3.2(APIレベル13)以上で、あなたも使用することができますWEBPの代わりに、PNGまたはJPEGファイルを使用しての、イメージを作成するファイル形式を。WEBP非可逆圧縮形式(JPEGなど)や透明性(例えばPNGなど)が、JPEGまたはPNGよりも優れた圧縮を提供することができます。

アンドロイド4.0(APIレベル14)がWEBP非可逆圧縮フォーマットをサポートし、アンドロイド4.3(APIレベル18)はロスレス透明WEBPの画像をサポートするようになりました。

ルック:

わずか12%のPNG形式の高圧縮効率。サプライズは驚きではありません。

使用ベクタグラフィックス

あなたは、解像度に依存しないアイコンや他のスケーラブルなメディアを作成するために、ベクターグラフィックスを使用することができます。大幅にAPKのフットプリントを減らすことができ、これらのグラフィックスを使用してください。画像は、アンドロイドのベクトルとして表されるVectorDrawableのオブジェクト。VectorDrawableオブジェクト、100バイトのファイルは、画面サイズと一致して鮮明な画像を生成することができます。

しかし、システムは、各レンダリングするVectorDrawable大きな画像が画面上に表示されるように多くの時間を必要とするオブジェクトは、長い時間がかかります。したがって、唯一これらの画像は、ベクトルグラフィックスを使用する場合、小さなディスプレイと見なさ。

他の戦略

時々 、私たちは、このような変換が使用できるだけで全体の色の画像として、絵のために再利用することができますsetColorFiltertintそのように写真の束だフレームアニメーションの使用は、最小限に抑えます。

圧縮リソース

リソースの圧縮を有効にするには、真の意志shrinkResourcesへのセットは、ファイル属性をbuild.gradle。

  android {
      ...
      buildTypes {
          release {
              shrinkResources true
              minifyEnabled true
              proguardFiles getDefaultProguardFile('proguard-android.txt'),
                      'proguard-rules.pro'
          }
      }
  }

圧縮機は、定義されている現在のリソース値/フォルダのリソース(例えば、文字列、サイズ、スタイル、色)を除去しないであろう。ツール(AAPT)を包装Androidのリソースは、Gradleのプラグインのバージョンは、あらかじめ定義されたリソースを指定されていることができないためです。

同時に、我々はまた、保存することができますどのリソースを指定することができます。

例えば、以下のコードは、RES /生/用keep.xmlに格納されています。ファイルの構築は、APKにパッケージ化されることはありません。

  <?xml version="1.0" encoding="utf-8"?>
  <resources xmlns:tools="http://schemas.android.com/tools"
      tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
      tools:discard="@layout/unused2" />

resourcesこれは、次のプロパティがあります。

  tools:keep 指出哪些资源会保留
  tools:discard 指定哪些资源需要剔除
  tools:shrinkMode 资源压缩模式,有两种取值strict和safe,默认为safe

safeそして、strict最適化戦略:

安全は、単にセキュリティモードとして理解することができ、それは、コードを確認するためにあらゆる努力がリソースを保持するために使用することができる回避の実行時エラーを行います。

あなたのコードが呼び出すとResources.getIdentifier()あなたのコードが動的に生成されたクエリ文字列リソースの名前に基づいてされることを意味し、。あなたはこの呼び出しを実行すると、デフォルトのリソース圧縮機は守備の行動を取ることで、すべてのリソースは、フォーマットの一致する名前でタグ付けに使用されている可能性があり、削除することはできません。

  String name = String.format("img_%1d", angle + 1);
  res = getResources().getIdentifier(name, "drawable", getPackageName());

リソースマークIMG_の接頭辞が使用されています。

あなたが使用する必要があるので、strictモードでは、IMG_プレフィックス処理リソースは、使用していないtools:keepマニュアルを識別するために使用されています。

未使用の予備リソースを削除します

私たちは、異なる画面解像度に描画可能なリソースを適応させるだけでなく、などの異なる言語の文字列リソースに適応するよう、そのGoogleはAPKたちを与える国際化サポートを提供して知っているが、多くの場合、私たちはいくつかの指定された解像度と言語を必要としますリソースがすることができ、そしてこの時間は、私たちは、configureにresConfigsの方法を使用することができます。

  defaultConfig {
      // 对于国际化支持只打包中文资源,
      resConfigs "zh-rCN"
  }

リソースの最適化で04のlib

ここでは、SOファイルであるダイナミックリンクライブラリ、LIB主要な最適化戦略について話しています。あなたが開発経験をお持ちの場合はNDKは理解しやすいかもしれません。

異なる命令セットのケースをサポートするために、アプリケーションは、armeabi-v7a、SOファイルのx86のをarmeabi含まれていてもよいです。

現在主流モデルはarmeabi-v7a、及びarmeabi-v7a互換armeabiに支持されています。だから、一般的に、我々は唯一のABIをサポートすること開発armeabi-v7aを使用する必要があります。

いくつかのライブラリはSOダウンロードするためにネットワークを使用することができ、ユーザーの後に置か負担は、アプリケーションのインストールを完了しました。あなたがネットワークにロードすることができたためにSOファイル、特定のビジネスの状況を見てする必要があります。

余談では、見つからない場合は、ランタイムはSO、クラッシュへのアプリケーションの原因となります。

  java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null
  at java.lang.Runtime.loadLibrary(Runtime.java:365)
  at java.lang.System.loadLibrary(System.java:535)
  at com.your.app.NativeClass.<clinit>(Native.java:16)
  ... 63 more

  Caused by: java.lang.UnsatisfiedLinkError: Library stlport_shared not found
  at java.lang.Runtime.loadLibrary(Runtime.java:461)
  at java.lang.System.loadLibrary(System.java:557)
  at com.your.app.NativeClass.<clinit>(Native.java:16)
  ... 5 more

また、あなたは、オープンソースのプロジェクトを参照することができ、対処するための手段を持っているReLinker
私はそれについて析出なり、SOの追加の最適化を、私は私のGitHubを囲みます。https://github.com/Meng997998/AndroidJX

公開された168元の記事 ウォン称賛71 ビュー20000 +

おすすめ

転載: blog.csdn.net/Aerfa789/article/details/104540977