簡介
Qzone熱修復技術是一個冷啓動修復方式,爲什麼是冷啓動呢,這需要根據它的實現原理來解析這個問題:
這種修復方式在於我們的代碼編譯成class文件之後,並打包成的dex文件的運行機制。
理論部分:
目錄
2、修改好代碼之後,把這個java文件編譯成.class文件
4、加載dex包到用戶端(通過網絡去自己的服務器下載,測試的時候我們直接放入到手機裏面,通過程序去讀取)
5、(程序讀取)把dex包插入到dexPathList集合中,注意要插入到前面,一般插入到角標0位置
我們都知道我們的虛擬機在執行我們的代碼的時候,是從dex包中獲取class文件進行讀取的,而一個apk不止有一個dex文件,
尋找class文件的時候,通過循環遍歷所有dex文件,找到了某個class,無論後面有沒有文件,循環都會中止,通過這個原理 我們可以使用插入補丁包的方式,把補丁dex包插入到dex集合最前面,這樣虛擬機在尋找之前出bug的文件之前,首先會找到這個補丁包下面的 我們已經修改過的class,原先的有bug的dex不會被執行到,問題也就解決了
理論是理論,實際的還需要實戰去操作,我們先說一下具體的操作流程:
1、修改有BUG的代碼
這一步,就是更改代碼,把有問題的java類裏面有問題的的代碼更改過來,無論幾個類
2、修改好代碼之後,把這個java文件編譯成.class文件
這一步也很簡單,
1)、可以使用編譯工具
build一下,然後在 項目➡️APP➡️build➡️intermediates➡️classes文件夾debug或者release中找到對應的已經編譯好的.class文件(在編譯工具的工具欄有一個 build 按鈕,點擊彈出列表找到build apk(s),點擊)
2)、通過命令行工具,執行java命令進行編譯
javac classpath/class1.java classpath/class2.java
(文件之間需要空一格,以便區分)
3、打包,把修改好的.class文件使用dx.bat工具打包成
dx.bat工具位於sdk目錄下的build-tools下(Android\sdk\build-tools\27.0.3)
打包命令:
dx --dex [--output=<file>] [<file>.class | <file>.{zip,jar,apk} | <directory>]
注意 如果提示 dx命令找不到。說明沒配置環境變量 要麼去配置環境變量或者去de .bat的目錄中去運行這個命令
我是先把.class文件打包成jar格式 然後在轉換成dex
提醒大家一句:我的打包jar跟轉換dex,都是在項目的debug或者release文件下操作的,(否則會引起java文件的路徑問題)
1)打包jar
jar cvf patch.jar com/jjf/hotfixdemo2/TextUtil.class com/jjf/hotfixdemo2/TextUtil.class com/jjf/hotfixdemo2/TextUtil.class
2)jar轉換成dex
dx --dex --output=patch.dex patch.jar
因爲所有的操作都在debug或者release下操作的,而我們直接指定的文件名 並沒有寫路徑,所以產生的文件都在當前目錄下,但這並不是我們必須在這兒操作的最重要的理由
4、加載dex包到用戶端(通過網絡去自己的服務器下載,測試的時候我們直接放入到手機裏面,通過程序去讀取)
5、(程序讀取)把dex包插入到dexPathList集合中,注意要插入到前面,一般插入到角標0位置
6、bug修復