Android熱修復之Tinker
前言
Tencent 開源 “Tinker–微信Android熱補丁方案” 已經很長時間了,無奈自己太懶了,一直沒有時間去嘗試一下。最近公司準備開新專案,我準備接入這個熱修復框架,這樣能夠及時去處理App中在使用過程產生的Bug問題,而不必為了處理一個Bug問題去更新一個新的版本。正式使用之前,自己先搞了一個Demo去嘗試。在使用的過程中也遇到的了很多問題,故記錄下來。廢話不多說,開幹。
接入指南
關於 Tinker 的介紹,以及與其它熱修復框架的比較,這裡就不多說了,不熟悉的可以檢視Github上Tinker的Wiki,官方有詳細解釋。下面是網址:https://github.com/Tencent/tinker/wiki
gradle接入
gradle是推薦的接入方式,在gradle外掛tinker-patch-gradle-plugin中我們幫你完成proguard、multiDex以及Manifest處理等工作。
新增依賴
首先在專案的build.gradle中,新增tinker-patch-gradle-plugin的依賴:
然後在app的build.gradle中,新增Tinker的庫依賴:
**注意:**TINKER_VERSION代表的是版本號,需要我們在gradle.properties檔案中新增。當我們專案中多次使用這個TINKER_VERSION版本號時,如果需要修改此版本號,那麼只需要修改gradle.properties的配置即可,簡單方便。
app/build.gradle檔案修改
完成上面兩步後,個人建議,將tinker中tinker-sample-android的app/build.gradle拷貝到自己專案中的app/build.geadle中。因為配置熱修復還是很麻煩的,需要你對gradle的知識有一定的瞭解,大牛可以隨意。即使是拷貝示例中的的內容,也是需要修改的。
修改tinkerId的值–否則會報錯:tinkerId is not set!!!(建議tinkerId的值與versionName一致即可)
將忽略警告設定為true:
配置簽名檔案:
API引入
接下來就是處理Application檔案,tinker建議編寫一個ApplicationLike的子類,你可以當成Application去使用,注意頂部的@DefaultLifeCycle(),其Application的屬性,會在編譯期生成一個SimpleTinkerInApplication類:
接著在清單檔案中配置編譯器生成的Application,以及新增對sd卡的讀寫許可權,因為在載入補丁包時,需要讀取補丁包。如果你是6.x以上的系統,自己新增上授權程式碼,或者手動在設定頁面開啟SDCard讀寫許可權。
<application
android:name=".SimpleTinkerInApplication"
...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然後我們在Activity中新增一個Load patch的Button,新增一個點選顯示Toast的按鈕。點選Load Patch按鈕時,載入補丁包,成功補丁包後會修改動態修改Toast顯示的內容。(注意:這裡只是測試,正式專案中建議參考官方示例,在Service中載入補丁包)
接著我們直接將專案執行到手機上,此時會生成Apk檔案,找到如下圖所示檔案:
patch生成
修改app/build.gradle檔案,如上圖所示。接著修改Toast要顯示的內容。使用tinkerPatchDebug生成差異包,也就是補丁包。可以使用命令,也可以使用android studio的工具,如圖:
下面就是生成差異包的位置,將該差異包匯入sd中,(該差異包名字可以自定義,只要對應即可)。
點選Load Patch按鈕,停留片刻,程式會自動退出。重新進入程式,點選顯示Toast的按鈕,就會發現Toast顯示的內容已改變。效果圖: