R文件:
当 Android 应用程序被编译,会自动生成一个 R 类,其中包含了所有 res/ 目录下资源的 ID。包括布局文件layout,资源文件,图片(values下所有文件)等。
在写java代码需要用这些资源的时候,你可以使用 R 类,通过子类+资源名或者直接使用资源 ID 来访问资源。
R.java文件是活动的Java文件,如MainActivity.java的和资源如strings.xml之间的胶水
class文件:
能够被JVM识别、加载并执行的文件格式
class文件的结构:
- 8位字节的二进制流文件
- 各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
- 每个类或者接口单独占据一个class文件,每个类单独管理,没有交叉
查看:使用010Editor可以查看class文件的详细信息(注意需要安装模板)
dex文件:
能够被DVM或者Art虚拟机执行并且加载的文件格式。
dex文件的结构:
- 8位字节的二进制流文件
- 各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
- 整个工程的类信息都存放在一个dex文件中(不考虑dex分包的情况下)
查看:使用010Editor
R.java文件中资源ID的含义:
资源:layout、string、drawable、raw、style、theme等等
这些资源都会被赋予独一无二的ID即资源索引来方便系统访问。这些资源索引由Android的工具AAPT(Android Asset Packing Tool)生成的八位十六进制整数型。
分配resource id的主要逻辑实现是在framework/base/tools/aapt/Resource.cpp 和 ResourceTable.cpp
这些资源会在编译过程中被打包进APK中(res文件夹)或者被打包成独立的资源APK包。
添加资源的命名规则:资源文件只能以小写字母和下划线做首字母,随后的名字中只能出现 [a-z0-9_.] 这些字符,否则R.java文件不会自动更新。
使用:
.java代码:R.xxx(类型).xxx(id)
XML代码:通过@xxx即可得到
重新编译生成R文件:
生成smali文件夹->生成R文件->编译R.java文件->生成的R文件的jar->生成 dex文件->生成smali文件->替换smali文件->编译apk,签名安装测试
class文件与dex文件的比较:
本质上都是一样的,都是二进制流文件格式,dex文件是从class文件演变而来的
class文件存在冗余信息,dex文件则去掉了冗余,并且整合了整个工程的类信息。
class文件的作用:class文件的作用是记录一个类文件的所有信息。
例如记住了当前类的引用this、父类super等等。class文件记录的信息往往比java文件多。
dex文件的作用:dex文件的作用是记录整个工程(通常是一个Android工程)的所有类文件的信息。