Amigo學習(一)解決使用中遇到的問題
寫在開頭
上一篇博文中對比了當下比較熱門的熱修復框架,並看到了Tinker 框架Demo 的展現過程。Tinker 的開源時間較晚,功能和文件更加完善。但不能對四大元件進行熱更也是比較遺憾。不過我們發現另一個熱修復開源框架Amigo,比起其他熱修復框架,Amigo 可實現四大元件的新增。不過它也是有一些不足之處。
本文主要對 Amigo 的整合使用、實現過程和各模組大致功能做學習和簡要總結。
優點:
- 支援四大元件熱更;
- 整合簡單,開發透明。
缺點:
- 整包替換,消耗較大;
使用及避坑
筆者這裡是直接下載工程到本地,匯入到 Android Studio。
下載 –> 匯入 –> 執行
這一小節將簡述原始碼編譯過程中遇到的問題和解決辦法。
Q1. Connot resolve symbol ‘Amigo’
不能解析符號’Amigo’,看一下 app 的 build.gradle 檔案。
dependencies {
compile project(":amigo-lib")
...
引用了的啊~ 奇怪了
排查……
發現 github 上作者對這個問題進行過修復,不過我這裡還是出現了。具體情況查了很久不知所以。
那就換個思路解決吧。
單獨編譯 Amigo-lib ,會生成 aar 包。
Terminal –> gradlew :amigo-lib:assembleDebug
dependencies {
// compile project(":amigo-lib")
compile (name:'amigo-lib-debug', ext:'aar')
...
將 aar 拷貝到 app moudle 的 libs 中,在 build.gradle 新增引用。再編譯,就不會報錯了。
不過,編譯沒問題了,一執行 APP 就崩潰。
Q2. testCoverageEnable
NoClassDefFoundError,這應該是沒找到這個類的定義而報錯,那這個 Lorg/jacoco… 是個啥?
Java程式碼覆蓋率庫 —— 用來測試程式碼覆蓋情況。
看一下 amigo-lib 的 build.gradle 檔案,在 debug 才會啟用。而我們編譯就是用的 assembleDebug.
buildTypes {
debug {
debuggable true
// testCoverageEnabled = true
}
}
既然它與熱修復無關,這裡不深究,遮蔽它就好了。
Q3. Host/A.java
這個個問題就觸及到我的知識盲區了,如果有大佬知道原因的,煩請告知。
main 中的類 DevActivity.java 引用 host 中的類 A.java 編譯報錯。
解決方案:從 host 中複製一份到 main 中…
Q4. assemblePatch
成功執行安裝後,這是主包。還需要生成補丁包,使用 assemblePatch。
task preparePatch(dependsOn: "assemblePatch") << {
deletePatchApk()
runCmd("adb push ${getPatchApk()} /sdcard/${getPatchApkName()}")
}
這裡會將 patchApk 用 adb 通過資料線傳送到手機儲存空間中。不過筆者的 adb 工具沒有成功,需手動拷貝到手機儲存中。
再次啟動執行即可~
寫在後頭
Amigo 在 Github 上的人氣看起來不如其他熱更框架,不過筆者認為 Amigo 應該在站在巨人的肩膀上,集成了其他框架的一些優點,補充了不足。
在國內全民熱更的大環境下,Amigo 的作者對其也是報有很大的希望,在 wiki 中如是說:
HotFix只是作為Amigo feature的一小塊,其實Amigo真正要解決的是Android APP動態更新的問題。
不過要想成為商業級的框架,還需要一些努力吧。