写在开头
上一篇博文中对比了当下比较热门的热修复框架,并看到了Tinker 框架Demo 的展现过程。Tinker 的开源时间较晚,功能和文档更加完善。但不能对四大组件进行热更也是比较遗憾。不过我们发现另一个热修复开源框架Amigo,比起其他热修复框架,Amigo 可实现四大组件的添加。不过它也是有一些不足之处。
本文主要对 Amigo 的集成使用、实现过程和各模块大致功能做学习和简要总结。
优点:
- 支持四大组件热更;
- 集成简单,开发透明。
缺点:
- 整包替换,消耗较大;
使用及避坑
官方使用文档:https://github.com/eleme/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动态更新的问题。
不过要想成为商业级的框架,还需要一些努力吧。
推荐阅读:Android 热修复 - 各框架原理学习及对比
Amigo 学习(二)类和资源是怎么热更的?
记录在此,仅为学习!
感谢您的阅读!欢迎指正!
欢迎加入 Android 技术交流群,群号:155495090