【发布时间】:2014-12-18 14:27:06
【问题描述】:
我试图弄清楚“编译资源”是什么意思。
为了理解这个问题我做了什么:
我已经阅读了很多关于这个主题的文章,但没有找到一个简单的答案。 我读过的最好的一篇是:How does the mapping between android resources and resources ID work?。
我是怎么理解的:
据我了解,当我们通过 ANT (Eclipse) 或 Gradle (AS) 编译项目时。 我们使用一个名为 aapt 的工具 - Android 资产打包工具,它: 用于为我们的每个资源生成唯一 ID,例如我们的布局、我们的样式等,并将它们存储在查找表中。然后它通过生成两个文件来持久化这个查找表:
- 它生成具有这些唯一 ID 的 R.java 文件,因此我们将能够在编译期间使用我们的 java 代码中的资源。
- 它生成resources.arsc 文件,可以在resources*.ap_ 文件中找到。
这个resources.arsc文件稍后会被apktool打包到apk中。
这种arsc文件格式是一种在运行时很容易被设备映射和解析的格式。
一个例子:
为了简单起见:假设我的activity_main.xml中有这个:
<TextView android:id="@+id/my_textView"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
我从我的 onCreate 中调用它:
findViewById(R.id.my_textView)
在我的 R.java 文件中我会看到:
public static final int my_textView=0x7f08003f;
Using: aapt dump resources on the generated apk 我可以看到它包含两行 my_textView: ec 资源 0x7f08003f com.example.lizi.liortest2:id/my_textView: flags=0x00000000 资源 0x7f08003f com.example.lizi.liortest2:id/my_textView: t=0x12 d=0x00000000 (s=0x0008 r=0x00)
我不明白的地方:
我原以为这个 resources.arsc 文件不仅包含资源 ID,还包含我为视图定义的所有属性,例如 android:layout_width="wrap_content"。
所以现在在运行时 VM 尝试运行 findViewById(R.id.my_textView)
它如何知道要获取哪个视图/要创建它的属性?
我简直无法理解它是如何工作的……这个查找表不应该也包含属性数据吗? 这个 0x7f08003f 数字是什么? (它应该代表一个稍后将映射到存储对象的物理内存的值吗?)
【问题讨论】:
标签: android resources r.java-file