ビルド時に、aapt ツールは、定義したすべてのリソースを収集し (個別のファイルまたはファイル内の明示的な定義を使用)、それらにリソース ID を割り当てます。
リソース ID は、PPTTNNNN という形式の 32 ビットの数値です。PP はリソースのパッケージです。TT はリソースのタイプです。NNNN は、そのタイプのリソースの名前です。アプリケーション リソースの場合、PP は常に 0x7f です。
TT と NNNN の値は、aapt によって任意に割り当てられます。基本的に、新しいタイプごとに、次に使用可能な番号が割り当てられて使用されます (1 から始まります)。同様に、タイプの新しい名前ごとに、次に使用可能な番号が割り当てられ、使用されます (1 から始まります)。
したがって、これらのリソース ファイルが aapt によって次の順序で処理されるとします。
layout/main.xml
drawable/icon.xml
layout/listitem.xml
最初に表示されるタイプは「layout」であるため、TT == 1 が指定されます。そのタイプの最初の名前は「main」であるため、NNNN == 1 が指定されます。最終的なリソース ID は 0x7f010001 です。
次に、TT == 2 が与えられる「drawable」が表示されます。そのタイプの最初の名前は「icon」であるため、NNNN == 1 が取得されます。最終的なリソース ID は 0x7f020001 です。
最後に、以前と同様に TT == 1 を持つ別の「レイアウト」を確認します。これは新しい名前「listitem」を持つため、次の値 NNNN == 2 を取得します。最終的なリソース ID は 0x7f010002 です。
デフォルトでは、aapt はこれらの識別子をビルド間で同じに保つ試みを行わないことに注意してください。リソースが変更されるたびに、すべてのリソースが新しい識別子を取得できます。それらがビルドされるたびに、新しい R.java が現在の識別子で作成されるため、コードは正しい値を取得します。このため、アプリのさまざまなビルド間でリソース識別子を使用できる場所には、リソース識別子を保持しないでください。
リソースがコンパイルされ、識別子が割り当てられると、aapt はソース コード用の R.java ファイルと、すべてのリソース名、識別子、および値を含む "resources.arsc" というバイナリ ファイルを生成します (別のファイルからのリソースの場合)。 、それらの値は.apk内のそのファイルへのパスです)、実行時にデバイスで簡単にmmapおよび解析できる形式です。
コマンド「aapt dump resources <path-to-apk>」を使用して、apk 内の resources.arsc ファイルの概要を取得できます。
バイナリ リソース テーブルの形式は、次のリソース データ構造のヘッダー ファイルに記載されています。
https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/include/androidfw/ResourceTypes.h
デバイス上のリソース テーブルを読み取るための完全な実装は次のとおりです。
https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp