热修复Tinker简单接入

废话不多说,现在网上有很多关于Tinker接入的文章
推荐:http://blog.csdn.net/lmj623565791/article/details/54882693 张鸿洋的博客
本篇文章主要说一下自己在接入过程中的心得

一、Gradle方式接入:
1.项目的build.gradle 下引入依赖:

dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.7')
    }

2、app module的build.gradle中,添加tinker的库依赖以及apply tinker的gradle插件

dependencies {
    //可选,用于生成application类
    provided('com.tencent.tinker:tinker-android-anno:1.7.7')
    //tinker的核心库
    compile('com.tencent.tinker:tinker-android-lib:1.7.7')
}

3.继承ApplicationLike类,注意@DefaultLifeCycle注解中设置Application的名称,并且AndroidManifest.xml中引用该Application

@DefaultLifeCycle(application = "com.ider.testview.SampleApplication",
        flags = ShareConstants.TINKER_ENABLE_ALL,
        loadVerifyFlag = false)
public class SimpleApplicationLike extends ApplicationLike {
    // 此处省略构造方法
    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);

    }
    @Override
    public void onCreate() {
        super.onCreate();
        TinkerInstaller.install(this);
    }
}

4.编辑app/build.gradle

apply plugin: 'com.tencent.tinker.patch'
tinkerPatch {
    // 有问题的apk地址
    oldApk = "D://app-debug.apk"
    ignoreWarning = false
    useSign = true
    buildConfig {
        tinkerId = "1.0"
    }
    dex {
        dexMode = "jar"
        pattern = ["class*.dex", "assets/secondary-dex-?.jar"]
        loader = ["com.tencent.tinker.loader.*", "com.ider.testview.SampleApplication"]
    }
    lib{
        pattern = ["lib/armeabi/*.so", "lib/arm64-v8a/*.so", "lib/armeabi-v7a/*.so", "lib/mips/*.so", "lib/mips64/*.so", "lib/x86/*.so", "lib/x86_64/*.so"]
    }
    res {
        pattern = ["res/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
        largeModSize = 100
    }
    sevenZip {
        zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
    }

}

5.

此处注意:

  • 注意环境变量中gradle版本,如果使用2.2.0+的插件版本,那么gradle版本要使用2.14.1,并且java版本要为jdk1.8,环境变量中JAVA_HOME和JRE_HOME都要设置为1.8的,否则无法通过gradle编译

  • useSign = true。设为false时,不对差分包进行签名,会导致差分包与基准包签名不同,无法更新

  • oldApk: 设置oldApk的路径,不要设置为AndroidStudio自动生成apk的路径。gradle在制作差分包时,先对更新后的代码进行编译生成新的apk,会替换掉oldApk,导致newApk和oldApk完全相同,从而生成错误的差分包,无法更新
  • tinker_id是用来标记基础包的,一定要相同。在编译oldApk时,会自动读取tinkerId并将此id写入AndroidManifest.xml
    (路径app\build\intermediates\tinker_intermediates\AndroidManifest.xml)中,例如tinkerid =1.0, AndroidManifest.xml中会新增一条
<meta-data android:name="TINKER_ID" android:value="tinker_id_1.0"/>

应用做的版本升级,但是没有更新tinkerID,会导致新版本加载旧版本的补丁。
- 接上面tinkerID继续,如果基础版本是tinkerID=1.0,发布一个tinkerPatch的tinkerID=2.0,那么2.0会保存在package_mete.xml的NEW_TINKER_ID中,此值并没有被用到,注意此时TINKER_ID依然为1.0,并没有因为打上patch而变为2.0。你依然可以在tinkerid=1.0的oldApk上继续发布3.0的patch,更新成功后NEW_TINKER_ID变为3.0, 而TINKER_ID依然是1.0。即:基于同一个基础包的修复patch可多次发布
Demo地址 : https://github.com/ericzhaowei/testtinker.git

二、命令行方式接入
1、1,2,3步相同
2、第4步省略,改为配置tinker_config.xml,tinker_config.xml中要修改应用Application的完整包名。
3、AndroidManifest.xml中手动设置thinkerId

<meta-data
            android:name="TINKER_ID"
            android:value="tinker_id_1.0" />

使用如下命令进行差分包生成:

java -jar tinker-patch-cli-1.7.7.jar -old old.apk -new new.apk -config tinker_config.xml -out output

具体Demo参考鸿洋博客底部的Demo:
http://blog.csdn.net/lmj623565791/article/details/54882693

参考:http://blog.csdn.net/a750457103/article/details/52815096

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值