[解決済み] アンドロイドのリソースとリソースIDのマッピングはどのように行われるのですか?
質問
Android では、このように R.id.XXX .
AFAIK では、リソースはバイナリ形式にコンパイルされていますが、このマッピングロジックは、ボンネットの中でどのように動作しているのでしょうか?
たぶん はこのように動作します。
例えば layout1.xml というのがありますが、私たちは
<Button android:id="@+id/button1" >
で、AAPTはこれをR.javaで生成します。
public static final int button1=0x7f05000b;
を指定すると *.apk が生成されると ボタン1 を "0x7f05000b" に置き換えてください。
このように、呼び出すと
findViewById(R.id.button1);
IDは0x7f05000bのような数字ですが、基本的にはまだIDに基づいて検索を行っています。
ありがとうございます。
追加
私が本当に知りたいのは、リソースIDがどのようにリソースコンテンツにパースされるのか、ということです。言い換えれば、Android ランタイムは、リソース ID を唯一の手がかりとして、どのようにリソース コンテンツを見つけるのでしょうか。
たとえば、描画可能な画像はどのようにしてリソース ID で見つけられるのでしょうか?あるいは、文字列の値はどのようにしてリソースIDで見つけられるのでしょうか?
どのように解決するのですか?
ビルド時に aapt ツールは、あなたが定義したすべてのリソース (個別のファイルまたはファイル内の明示的な定義) を収集し、リソース ID をそれらに割り振ります。
リソース ID は 32 ビットの数字で、次のような形式です。PPTTNNNN。 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 です。
次に、"drawable" があるので、これには TT == 2 が与えられます。 このタイプの最初の名前は "icon" なので、NNNN == 1 が与えられます。 最終的なリソース ID は 0x7f020001 です。
最後に、別の "layout" が表示され、先ほどと同様に TT == 1 となります。 これは新しい名前 "listitem" を持つので、次の値 NNNN == 2 を取得します。 最終的なリソース ID は 0x7f010002 です。
aapt はデフォルトで、ビルド間でこれらの識別子を同じにすることを試みないことに注意してください。 リソースが変更されるたびに、それらはすべて新しい識別子を取得することができます。 ビルドされるたびに、新しい R.java が現在の識別子で作成され、コードが正しい値を取得するようになります。 このため、リソースの識別子を、アプリの異なるビルド間で使用できる場所に永続化させてはいけません。
リソースがコンパイルされ識別子が割り当てられると、apt はソースコード用の R.java ファイルと、リソース名、識別子、および値をすべて含む "resources.arsc" というバイナリファイルを生成します (別のファイルから来るリソースについては、値は .apk のそのファイルへのパスとなります)。
apk 内の resources.arsc ファイルの要約は、 "aapt dump resources <path-to-apk>" コマンドで取得することができます。
バイナリリソーステーブルのフォーマットは、ここのリソースデータ構造用のヘッダーファイルで文書化されています。
デバイス上のリソーステーブルを読み込むための完全な実装はこちらです。
https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp
関連
-
[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
[解決済み] TextViewでテキストを水平・垂直方向にセンタリングするには?
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] Androidアプリケーションのアクティビティ間でデータを受け渡すにはどうすればよいですか?
-
[解決済み] match_parentとfill_parentの違いは何ですか?
-
[解決済み】「px」、「dip」、「dp」、「sp」の違いは?
-
[解決済み] Android StudioからADBを手動で再起動する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] Eclipseでのandroid:configChangesでのAdmobエラー
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] wrap_contentでRelativeLayoutがフルスクリーンになってしまう
-
[解決済み] データベースでリサイクルビューを使用する
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] Gradleでビルドタイプを使用し、ContentProviderを使用する同じアプリを1つのデバイスで実行する。