Apply Changes 是通過利用Android 8.0(API級別26)或更高版本中支持的 Android JVMTI(https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#bc1)技術(shù)。所以如果想使用Apply Changes有兩個條件:
Apk必須是debug包
必須在Android 8.0以上的手機上運行
Apply Changes按鈕在菜單欄上,在運行的右側(cè)新增兩個按鈕,如下圖
1,Apply Changes and Restart Activity:嘗試通過重新啟動活動但不重新啟動應(yīng)用程序來應(yīng)用資源和代碼更改。如果有代碼和資源的修改可以使用這個來使代碼和資源即時生效。
2,Apply Code Changes:嘗試僅應(yīng)用代碼更改而不重新啟動任何內(nèi)容。如果只有代碼修改,可以使用這個來使代碼生效。如果修改了代碼和資源,請使用“Apply Changes and Restart Activity ”。

架構(gòu)
接下來我們研究下ApplyChanges的實現(xiàn)原理。ApplyChanges的核心是要找出AndroidStudio構(gòu)建出來的apk和已經(jīng)安裝到手機設(shè)備apk的差異。找出差異后,然后將差異發(fā)送到手機上執(zhí)行差異合并。
Instant Run
1、Gradle版本是2.0.0以上? ? 2、minSdkVrsion設(shè)置到21以上。
熱修復(fù)
? ? Android Studio會監(jiān)聽在開發(fā)過程中哪個文件發(fā)生了改變,并且通過一個自定義的Gralde task來只對修改的class文件生成對應(yīng)的.dex文件。
這些新的.dex文件會通過Studio傳遞發(fā)布給應(yīng)用中運行的App Server。每次一個方法被調(diào)用時(不管在應(yīng)用中的任何地方),被注入到最初的class文件中的instrumentation都講去連接App Server來檢查它們是否有更新了。 如果有更新,執(zhí)行操作將被指派到新的充在的class文件,這樣就會執(zhí)行新修改的方法。
暖修復(fù)
冷修復(fù)
需要依賴Android Runtime能支持加載多個.dex文件,這是一個在ART中新增的功能,它只有在Android 5.0(API 21)以上的設(shè)備總才支持。
對于API 20一下的設(shè)備,他們?nèi)栽谑褂肈alvik虛擬機,Android Studio需要部署整個APK。
修復(fù)類型
熱修復(fù): 更改的內(nèi)容不需要重啟應(yīng)用甚至不需要重啟當前的activity就可以讓顯示內(nèi)容的改變,對于大部分通過方法內(nèi)容改變的更改都可以通過這種方式來修改。
暖修復(fù): 需要重啟activity才能讓改變生效,在改變資源時會通過該方式。
冷修復(fù): 應(yīng)用需要重啟(不是重新安裝)。對于一些方法方法結(jié)構(gòu)和實現(xiàn)等結(jié)構(gòu)性的改變需要通過該方式。
參考博文: