微信热更新方案实践
Groovy Java
Latest commit e7903c6 Jul 21, 2016 @zzz40500 修正 :空指针异常
Permalink
Failed to load latest commit information.
.idea 上传自定义dx文件 Jul 18, 2016
app 加入demo Jul 17, 2016
buildSrc 上传自定义dx文件 Jul 18, 2016
demo 加入demo Jul 17, 2016
gradle/wrapper frist commit Jul 10, 2016
library 上传自定义dx文件 Jul 18, 2016
plugin 修正 :空指针异常 Jul 21, 2016
screenshot 上传 img Jul 18, 2016
.gitignore frist commit Jul 10, 2016
README.md Update README.md Jul 21, 2016
build.gradle frist commit Jul 10, 2016
gradle.properties frist commit Jul 10, 2016
gradlew frist commit Jul 10, 2016
gradlew.bat frist commit Jul 10, 2016
settings.gradle 0.1 版本更新 Jul 17, 2016

README.md

Tinker_imitator.png

原理: 微信热更新方案

简单的讲: 增量更新
Tinker_imitator地址

  电脑:mac  
  编译工具:as & intellj  
  gradle版本 com.android.tools.build:gradle:2.1.2  
  android版本:6.0

准备动作:

1. 安装bsdiff:

mac 端命令:

 brew install bsdiff

linux端命令:

brew install bsdiff

Windows:
使用cygwin安装
然后将bsdiff 安装的位置写入local.properties
Paste_Image.png
mac 端不写.默认为/usr/local/bin/bsdiff
linux 和Windows要写.

注意 我只测试了mac 的使用.

2. 安装ide插件.

Tinker-Plugin地址
安装方式:这篇文章第2种方式.

3. 编译运行.

这里暂时不支持使用instant run 的情况. 所以你要关闭instant run
关闭方式:自行google|bing
第一次编译:
第一次运行
编译完成会产生几个文件:

产生的文件.png
然后修改代码:
打补丁包:

补丁包运行.png
会有下列产物:

patch产物.png
patchclasses.dex 是生成的patch dex. 如果你连接手机的话,ide插件会帮你push 到手机的/sdcard/hot/中
classes和class2 分别对应apk 中的classes.dex和classes2.dex.
log 是运行日志. 你可以直接使用日志中的命令执行,而不使用我提供的插件

查看效果:

方式一: app 重启
方式二: 点击app 的内部的热修复按钮.

4. 不足:

  1. 热修复. 需要重启
  2. 只是代码级别的热修复. 不支持资源的替换.修改代码的时候不能新增资源id.
  3. 如果改变了两个dex里面的东西的话,那么占得内存就有点大了

5. todo:

  1. 签名验证;
  2. gradle配置热修复
  3. 支持instant run
  4. 包裹dex.而不是直接传递dex;
  5. patch版本控制;
  6. 部分情况下不用重启app就能生效;
  7. 更智能的dex管理;
  8. 安全模式.防止因为错误的patch导致的app启动不起来;
  9. 更好的差分算法;
  10. 资源更新;

6. 尾巴

最近阿宅开了个QQ实践群(568863373),欢迎大家进来玩耍,也可以关注我们的公众号:魔都三帅

Paste_Image.png

特别感谢:
https://github.com/jasonross/Nuwa
https://github.com/ceabie/DexKnifePlugin
https://github.com/brok1n/androidBsdiffUpdate