熱更新技術學習-補丁包方式(通過學習Qzone的熱修復框架總結)

簡介

Qzone熱修復技術是一個冷啓動修復方式,爲什麼是冷啓動呢,這需要根據它的實現原理來解析這個問題:

這種修復方式在於我們的代碼編譯成class文件之後,並打包成的dex文件的運行機制

理論部分:

目錄

簡介

理論部分:

 

1、修改有BUG的代碼

2、修改好代碼之後,把這個java文件編譯成.class文件

1)、可以使用編譯工具

2)、通過命令行工具,執行java命令進行編譯

3、打包,把修改好的.class文件打包成一個.dex包

4、加載dex包到用戶端(通過網絡去自己的服務器下載,測試的時候我們直接放入到手機裏面,通過程序去讀取)

5、(程序讀取)把dex包插入到dexPathList集合中,注意要插入到前面,一般插入到角標0位置

6、bug修復

 


我們都知道我們的虛擬機在執行我們的代碼的時候,是從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 

 

圖片。00001

2)jar轉換成dex

dx  --dex --output=patch.dex patch.jar

因爲所有的操作都在debug或者release下操作的,而我們直接指定的文件名 並沒有寫路徑,所以產生的文件都在當前目錄下,但這並不是我們必須在這兒操作的最重要的理由

4、加載dex包到用戶端(通過網絡去自己的服務器下載,測試的時候我們直接放入到手機裏面,通過程序去讀取)

5、(程序讀取)把dex包插入到dexPathList集合中,注意要插入到前面,一般插入到角標0位置

6、bug修復

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章