日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android】Instant Run原理解析

發布時間:2023/12/16 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。