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工程)的所有類文件的信息。