Android 熱修復與外掛化 一
阿新 • • 發佈:2019-01-22
- 熱修復 : 支付寶、優酷、微信
- 剛釋出的應用就發現了比較嚴重的bug
- 有一些小的功能想即時推送給使用者去使用
- 外掛化 : 美團、淘寶、酷狗
- 解決應用越來越大所帶來的各種技術限制,方法數超過65535等
- 解決應用越來越大帶來的合作開發問題
- 使用這些熱門技術時踩的坑,程式碼及版本釋出的管理
一、dex/class深入講解
-
什麼是class 檔案
能夠被JVM識別,載入並執行的檔案格式 -
如何生成class檔案
- 通過IDE自動幫我們build
- 手動通過javac(java compiler)去生成class檔案
- 通過java命令去執行class檔案
- 通過IDE自動幫我們build
-
class檔案的作用
記錄一個類檔案的所有資訊 -
class檔案格式
- 一種8位位元組的二進位制流檔案
- 各個資料按順序緊密的排列,無間隙(減少class體積,載入更快)
- 每個類或介面都單獨佔據一個class檔案
弊端 : - class記憶體佔用大,不適合移動端
- 堆疊的載入模式,載入速度慢
- 檔案IO操作多,類查詢慢
-
什麼是dex檔案
能夠被DVM識別,載入並執行的檔案格式 -
如何生成一個dex檔案
- 通過IDE自動幫我們build生成
- 手動通過dx命令去生成dex檔案
- 手動執行dex檔案在手機
- dx --dex --output Hello.class
- adb push Hello.dex /storage/emulated/0
- adb shell
- dalvikvm -cp /sdcard/Hello.dex Hello
-
dex檔案的作用
記錄整個工程中所有類檔案的資訊,記住是整個工程 -
dex檔案格式詳解
- 一種八位位元組的二進位制流檔案
- 各個資料按順序緊密的排列,無間隙
- 整個應用中所有Java原始檔都放在一個dex中
-
兩者異同
- 本質都是一樣的,dex是從class檔案演變過來的
- class檔案存在許多冗餘資訊,dex會去除冗餘,並整合
二、jvm/dvm/art深入瞭解
- JVM結構
- Loading 類的資訊從檔案獲取並且載入到JVM的記憶體中
- Verifying 檢查讀入的結構是否符合JVM規範的描述
- Preparing 分配一個結構儲存類的資訊
- Resolving 把這個類的常量池中的所有符號引用改變成直接引用
- Initializing 執行靜態初始化程式,把靜態變數初始化成指定的值
- JVM記憶體管理
- java棧區
- 作用 :它存放的是Java方法執行時的所有資料
- 組成 : 由棧幀組成,一個棧幀代表一個方法的執行
- java 棧幀
- 每個方法從呼叫到執行完成就對應一個棧幀在虛擬機器棧中入棧到出棧
- 包含:區域性變量表、棧運算元、動態連結、方法出口
- 本地方法棧
- 作用:本地方法棧是專門為native方法服務的
- 方法區
- 儲存被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後等資料
- 堆區
- 作用:所有通過new建立的物件記憶體都在堆中分配
- 特點:是虛擬機器中最大的一塊記憶體,是GC要回收的部分
- java棧區
- 垃圾回收
- 垃圾收集演算法
- 引用記數演算法 jdk 1.2之前使用
- 可達性演算法 離散數學的圖論引用
- 垃圾回收演算法
- 標記-清除演算法
- 不需要物件的移動並且僅對不存活的物件處理,在存活物件比較多的情況下比較高效,但是記憶體碎片嚴重
- 複製演算法
- 存活物件少時比較高效,需要一塊記憶體作為交換空間來進行物件的移動
- 標記-整理演算法
- 標記-清除演算法基礎上進行物件的移動,成本高,解決了記憶體碎片
- 標記-清除演算法
- 垃圾收集演算法
- 觸發回收
- Java虛擬機器無法再為新的物件分配記憶體空間了
- 手動呼叫System.gc()方法,並不會立馬執行,它會等到合適的時機執行,加大了虛擬機器的壓力
- 低優先順序的GC執行緒,被執行時就會執行GC
- 總結
- Dalvik Vm 與 JVM 不同
- 執行的檔案不同,一個是class一個是dex
- 類載入系統與JVM區別較大
- 可以同時存在多個DVM
- Dalvik是基於暫存器的,而JVM是基於棧的
- ART 與 Dalvik 不同
- DVM使用JIT來將位元組碼轉換成機器碼,效率低
- ART採用了AOT預編譯技術,執行速度更快,在我們安裝的時候,就將位元組碼轉換成了本地機器碼,存在我們的儲存介質中
- ART會佔用更多的應用安裝時間和儲存空間
- Dalvik Vm 與 JVM 不同
三、class loader深入瞭解
- Java ClassLoader
- Android ClassLoader
- BootClassLoader 載入Android Framework層的一些位元組碼檔案
- PathClassLoader 載入我們已將安裝到系統中的APK檔案中的class檔案
- DexClassLoader 載入指定目錄中的class位元組碼檔案
- BaseDexClassLoader 父類
- Android中的動態載入難點
- 有許多元件類需要註冊才能使用
- 資源的動態載入很複雜
- Android程式執行需要一個上下文環境