【Android】Instant Run原理解析
1、研究主流的熱修復框架后,你會發現andfix和dexposed采用jni hook方法,不用重啟就能修復,而Nuwa的ClassLoader思路因為類被虛擬機加載后,不會重新加載,所以需要重啟。Instant Run是怎么實現不重啟加載的呢,難道也是jni hook?
2、Instant Run原理
一個插件一個庫,Instant Run用的是gradle plugin和instant-run.jar。
3、gradle plugin的兩個作用
(1)第一次運行,應用transform API修改字節碼。
step1:給所有的類添加$change字段,$change為IncrementalChange類型,IncrementalChange是個接口。
step2:修改類的全部方法(新的邏輯是:如果$change不為空,去調用$change的access$dispatch方法,參數為方法簽名字符串和方法參數數組,否則調用原邏輯。)
(2)后續運行,dx補丁類,生成補丁dex。
step1:被修改類對應的補丁類
補丁類,并不是你修改后的類,而是由gradle plugin自動生成,實現了IncrementalChange接口的類。
該類類名在原名后面添加$override,復制修改后類的大部分方法,實現IncrementalChange 接口的access$dispatch方法,該方法會根據傳遞過來的方法簽名,調用本類的同名方法。
只要把原類的$change字段設置為該類,那就會調用該類的access$dispatch方法,就會使用修改后的方法了。
step2:被修改類的記錄類
AppPatchesLoaderImpl記錄了所有被修改的類,也會被打進補丁dex。
4、instant-run.jar
設置原類的$change字段為補丁類
(1)AppPatchesLoaderImpl類不但記錄了全部被修改的類,還提供load方法支持設置被修改原類$change字段.
(2)當收到補丁通知時,新建一個DexClassLoader,去反射加載補丁dex中的AppPatchesLoaderImpl類,調用load方法即可,load方法中會去加載全部補丁類,并賦值給對應原類的$change。
以上主要是探究Instant Run處理代碼變化的思路,對資源變化沒有分析。
?
?
?
?
總結
以上是生活随笔為你收集整理的【Android】Instant Run原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金刚石切割丝的全球与中国市场2022-2
- 下一篇: GAN for Image-to-ima