APK構築プロセス

APK構築プロセス

ここに写真の説明を挿入

  1. aaptはリソースファイルをコンパイルしてR.javaを生成し、リソースファイルをパックします
  2. JavaコンパイラJavaコンパイラはJavaコードとaidlを.classファイルにコンパイルします
  3. dexツールは.classファイルを.dexファイルにコンパイルします
  4. apkbuilderは上記のファイルを.apkパッケージにパッケージ化します
  5. jarsignerがapkパッケージに署名します
  6. zipalignバイトコードの最適化

aapt / aapt2:Androidリソースパッケージングツール(build-tools / 27.0.2 / under Android sdk)フルネーム:Android Asses Packaging Tool
aidl:クロスプロセス通信用にAndroidインターフェイス記述言語を.javaファイルに変換するためのツール
javac:Javaコンパイル時
プロガード:コード難読化ツール
dx / d8:.classファイルをDavik VMが認識できる.dexファイルに変換します
。apkbuilder:apkパッケージを生成するパッケージ
jarsigner:署名ツール
zipalign:バイトコードアライメント最適化ツール

aapt

Androidリソースパッケージツール(build-tools / 27.0.2 / Android sdkの下)フルネーム:Android Asses Packaging Tool

リソースの統合

ここに写真の説明を挿入

リソースファイルのコンパイル

ここに写真の説明を挿入

resリソース
  • R.javaファイルを生成します。各非アセットリソースにID値を指定します。これは、ベッドクーラーの形式でR.javaファイルに定義されています。
  • これらのリソースの構成情報をIDで記述するresources.arscファイルを生成します。その内容は、リソースインデックステーブルと同等です。すべてのID値を含むデータセット。ファイル内で、特定のIDが文字列に対応する場合、ファイルには値が直接含まれます。IDに対応するリソースが特定のレイアウトまたは描画可能なリソースである場合、ファイルは対応するリソースのパスに格納されます。

R.javaの構造図は次のとおりです。
ここに写真の説明を挿入

R.String.appname = 0x7f0f0000;
0x7fはコンパイル中のリソースパッケージを
表し0fは文字列タイプを表し、この0fは静的ではなく、
0000は文字列番号を表します0000は最初の文字列です

resource.arscファイル(次のようにAndroid Studio Analyze apk関数を使用してresource.arscファイル構造を確認します。図から、resource.arscはリソースインデックステーブルであると結論付けることができます)
ここに写真の説明を挿入

AndroidManifestファイル

AndroidManifestファイルは、Androidアプリケーションのグローバル構成ファイル、パッケージ名、権限、さまざまなコンポーネント、バージョン番号などであり、バイナリxmlファイルとして編集されます。

資産

以下に示すように、apkに直接パッケージ化されます。

aidlファイルのコンパイル

aidl:Androidインターフェース定義言語

  • aidlツールは、インターフェイス定義ファイルを解析してから、対応するJavaコードインターフェイスプロバイダー呼び出しを生成します。プロジェクトでaidlファイルが使用されていない場合は、この手順をスキップできます。
  • 入力:プロジェクトのsrc / main / aidlディレクトリにあるaidlサフィックス付きのファイル。
  • 出力:ビルド/生成/ソース/ aidlにあるプロセス通信に使用できるC / S側のJavaコード
Javaソースコードのコンパイル
  • R.javaとaidlによって生成されたJavaファイル、およびプロジェクトのソースコードは、クラスファイルを生成するためにjavacでコンパイルされます。
  • 入力:javaソースコードフォルダー(aaptによって生成されたR.java、aidlによって生成されたJavaファイル、すでにBuildConfig.javaも含まれます)
  • 出力:gradleコンパイルの場合、生成されたクラスファイルはビルド/中間/クラスに保存されます。
プロガードコードの難読化
  • javacはコードのコンパイルを完了すると、通常、暗号化と同様にソースコードを難読化して、逆コンパイルの難易度を上げると同時に、コード名を短くしてコードのサイズを小さくします。
  • 入力:コンパイルされた.classファイル、難読化ルールの構成はproguard-rules.proです
  • 出力:難読化された.classファイル、難読化の前後のマッピングファイル。
DEXファイルに変換する
  • dxツールは、Androidシステム仮想マシンで実行できるclasses.dexファイルを生成します。dxは、クラスをDalvikバイトコードに変換し、定数プールを生成し、冗長データを排除します。
  • 入力:すべての.classファイル。
  • 出力:classes.dexファイル。
apkファイルをパッケージ化します
  • apkファイルはパッケージ化によって生成されます。古いapkbuilderスクリプトは破棄され、sdklib.jarのApkBuilderクラスを介してパッケージ化されました。
  • 入力:.ap_リソースパッケージファイル、classes.dexファイル、コンパイルされていないリソースファイル(アセットリソースなど)、libsおよびその他のファイル。
  • 出力:apkファイル
apkファイルに署名する
  • apkファイルに署名してから、デバイスにインストールします。
  • 入力:前の手順で生成された.apkファイルと署名ファイル(デバッグまたはリリースキーストア)。
  • 出力:署名後のapkファイル。
zipalignの最適化
  • Zipalignは、署名されたapkファイルに対してクラスアラインメント処理を実行するため、apk内のすべてのリソースファイルの開始オフセットは4バイトの整数倍になり、メモリマッピングを介してapkファイルにアクセスする際の速度が向上します。また、クラスがデバイスで実行されているときのメモリ消費量も削減されます。
  • 入力:署名されたapkファイル
  • 出力:整列された最適化されたapkファイル

APKの典型的なファイル

  • AndroidManifest.xmlプログラムのグローバル構成ファイル
  • classes.dexDalvikバイトコード
  • resources.arscリソースインデックステーブル
  • META-INFこのディレクトリには、署名情報が格納されます
  • resはこのディレクトリにリソースファイルを保存します
  • アセットこのディレクトリには、いくつかの構成ファイルまたはリソースファイルを格納できます

おすすめ

転載: blog.csdn.net/yanwenyuan0304/article/details/106337631