使用Tinker进行热更新

为什么使用Tinker

  • 大家都知到线上的项目,最怕的事情是出了bug,这就意味这得重新发版本,这一直以来就是很头疼的事情,所以增量更新是一个必然的趋势,在用户没有感知的情况修复bug,也不用加班赶着上新版本,剩余的时间好处很多,老司机都懂!


    使用Tinker进行热更新_第1张图片

Tinker的介绍

  • 废话不说先上地址
    Tinker
  • Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新
  • 建议大家使用gradle的接入方式,一来可以很方便的集成,二来版本更新的时候只需要修改gradle配置文件,但是还是不建议项目初期就导入这个东西,可以在项目上线后在接入,目前Tinker不支持Instant Run,需要在Setting中取消Enable Instant Runx选项,下面是接入的方法
  1. 在项目的[build.gradle]中,添加tinker-patch-gradle-plugin的依赖
buildscript {
    dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.11')
    }
}
  1. 然后在app的gradle文件[app/build.gradle]我们需要添加tinker的库依赖以apply tinker的gradle插件
dependencies {
    //可选,用于生成application类 
    provided('com.tencent.tinker:tinker-android-anno:1.7.11')
    //tinker的核心库
    compile('com.tencent.tinker:tinker-android-lib:1.7.11') 
}
...
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'
  1. 配置好这些之后我们可以下载官方的demo找到 build.gradle文件,从build.gradle 的第127行开始复制粘贴到自己的app/build.gradle文件中
  def bakPath = file("${buildDir}/bakApk/")......

4.注意配置apk路径

  ext {
    //for some reason, you may want to ignore tinkerBuild, such as instant run debug build?
    tinkerEnabled = true
    //for normal build
    //旧版本apk路径配置
    tinkerOldApkPath = "${bakPath}/app-debug-xxxx-14-05-21.apk"
    //用于混淆,没有混淆可以不管
    tinkerApplyMappingPath = "${bakPath}/app-debug-xxxx-14-05-21-mapping.txt"
    //旧版本apk R文件
    tinkerApplyResourcePath = "${bakPath}/app-debug-xxxx-14-05-21-R.txt"

    //only use for build all flavor, if not, just ignore this field
    tinkerBuildFlavorDirectory = "${bakPath}/app-debug-xxxx-14-05-21"
}

5.新建自己的Application

  • 继承DefaultApplicationLike 并重写onBaseContextAttached ,框架会自动生成所需要的application

  • 打开自己的AndroidManifest.xml 在application 节点下配置android:name=”xxx.xxx.xxx.xxxApplication”

  • 由于我们的项目已有自己的Application,为了避免改动可以将项目中的Application 继承TinkerApplication(此时onCreate方法会报错),去掉onCreate方法,将onCreate方法中的初始化操作单独抽一个init方法出来,再合适的时机进行调用,例如MainActivity,这样我们其他引用Application的地方都不需要改动。

  • 接下来就很简单了,在as右边找到Gradle projects下的Tinkerr然后build

  • 这时我们打开 app/build/output发现多了一个tinkerPatch 文件夹,其中patch_signed_7zip.apk 就是我们的补丁文件

  • 接下在合适的时候加载补丁,就可以实现热更新!
    重要重要重要,如果要打补丁包,不要直接提交修复BUG后的代码 一定要先保存一个基准包(这里的基准包其实就是指你的线上发版的包,可以建立一个包来专门保存这些apk文件)

Tinker目前存在的问题

1.Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
2.由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
3.在Android N上,补丁对应用启动时间有轻微的影响;
4.不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
5.对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

你可能感兴趣的:(使用Tinker进行热更新)