做vr效果圖的網(wǎng)站seo優(yōu)化關(guān)鍵詞
Android 高級面試:插件化和熱修復(fù)相關(guān)
1、dex 和 class 文件結(jié)構(gòu)
class 是 JVM 可以執(zhí)行的文件類型,由 javac 編譯生成;dex 是 DVM 執(zhí)行的文件類型,由 dx 編譯生成。
class 文件結(jié)構(gòu)的特點:
- 是一種 8 位二進(jìn)制字節(jié)流文件;
- 各個數(shù)據(jù)按順序緊密的排列,無間隙;
- 每個類或者借口都單獨占據(jù)一個 class 文件;
class 文件的文件結(jié)構(gòu):
1. magic 加密字段
2. minor_version 支持最低版本的jdk
3. major_version 編譯使用的jdk版本
4. constant_pool_count 常量池的數(shù)量
5. cp_info constant_pool 常量池的結(jié)構(gòu)體,數(shù)量不定
6. access_flags 訪問級別
7. this_class 當(dāng)前類
8. super_class 父類
9. interfaces_count 類實現(xiàn)接口的數(shù)量
10. fields_count 類成員變量的數(shù)量
11. methods_count 類方法的數(shù)量
12. method_info methods 類方法的結(jié)構(gòu)體
13. attributes_count 類屬性的數(shù)量
14. attribute_info attributes 類屬性的結(jié)構(gòu)體
dex 文件的結(jié)構(gòu)的特點:
1. 是一種 8 位二進(jìn)制字節(jié)流文件;
2. 各個數(shù)據(jù)按順序緊密的排列,無間隙;
3. 一般情況下,整個應(yīng)用所有 java 源文件都放在一個 dex 文件中。
dex 的文件結(jié)構(gòu)分成 3 個區(qū):
1. 第一個區(qū)是 header,包括:1. header_item dex_header 這個結(jié)構(gòu)體,
2. 第二個區(qū)是索引區(qū),包括:1. string_id_list dex_string_ids(字符串索引2. type_id_list dex_type_ids(類型索引)3. proto_id_list dex_proto_ids(方法原型索引)4. field_id_list dex_field_ids(域索引)5. method_id_list dex_method_ids(方法索引)
3. 第三個區(qū)是數(shù)據(jù)區(qū),包括:1. class_def_item_list dex_class_defs(類的定義)2. data3. link_data(so)
兩者的主要區(qū)別:
- class 中只包含了一個 java 文件的信息,dex 中包含了多個 java 文件的的信息;
- dex 中包含了很多類的信息,它會把類的信息進(jìn)行拆分,然后把拆分后的信息分配到指定的索引區(qū)域中。比如方法索引區(qū)域就包含了所有類的方法的索引。
2、加固的原理
加固的過程分成幾個步驟:
- 要加固的 APK + 殼程序 dex 合成新的 dex;
- 然后用新合成的 dex 替換克 apk 中的 dex 得到新的 APK.
第一步的時候可以對 APK 進(jìn)行加密,然后在運(yùn)行時對 APK 進(jìn)行解密。合成新 APK 的本質(zhì)過程是對 dex 進(jìn)行拼接,將 APK 文件附加到 dex 文件后面。因為此時 dex 的信息已經(jīng)發(fā)生了變化,所以需要對 dex 的文件頭進(jìn)行修改,包括魔數(shù)、檢驗碼和 SHA-1 簽名的修改。本質(zhì)上拼接的過程可以通過讀取二進(jìn)制數(shù)組,然后通過數(shù)組拷貝將 APK 附加到 dex 末尾。
第二部就是一個打包的過程。不過這個過程會修改 Manifest 文件,將程序中的 Application 替換掉。替換后的 Application 會在程序啟動的時候?qū)⑽覀兊?APK 加載進(jìn)來。下面是 360 加固之后的 Manifest 文件:
加固的過程有些類似于插件化的流程,也是將 APK 解壓到磁盤之后,通過反射替換掉 AssertsManager,并將其指向我們解壓之后的資源的路徑。
360 加固的核心算法在 native 層實現(xiàn),里面針對不同的平臺提供了各種 so 庫,運(yùn)行時在 java 層判斷平臺版本,調(diào)用 so 庫。
3、熱修復(fù)的原理
根據(jù)修復(fù)的類型分成幾種:類的修復(fù),資源修復(fù)和 so 修復(fù)。
類的修復(fù):
4、插件化的原理
另外
有什么技術(shù)問題歡迎加我交流 qilebeaf
本人10多年大廠軟件開發(fā)經(jīng)驗,精通Android,Java,Python,前端等開發(fā),空余時間承接軟件開發(fā)設(shè)計、課程設(shè)計指導(dǎo)、解決疑難bug、AI大模型搭建,AI繪圖應(yīng)用等。
歡迎砸單