热修复之微信Tinker集成


Tinker的集成步骤比简单,但是坑特别多,稍不注意,就会导致打补丁包失败、补丁无法下发等问题,楼主在集成过程中也遇到这样的问题,现在总结下,前半部分介绍Tinker的集成步骤,按照官方文档一步一步来就可以了http://www.tinkerpatch.com/Docs/intro,后半部分介绍Tinker的一些列坑,以及下发步骤。

一、集成步骤

1、 添加 gradle 插件依赖

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.6"
    }
}

2、集成 TinkerPatch SDK

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.+'
    testImplementation 'junit:junit:4.12'
    compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.6")
}

3、配置 tinkerpatchSupport 参数

打开引入的 tinkerpatch.gradle 文件,配置申请的appkey,以及App版本号,位于/app/tinkerpatch.gradle目录下,如下,并将其在app的gradle中引入:apply from: 'tinkerpatch.gradle':

/**
 * 对于插件各参数的详细解析请参考
 * http://tinkerpatch.com/Docs/SDK
 */
tinkerpatchSupport {
    /** 可以在debug的时候关闭 tinkerPatch **/
    /** disable tinker的时候需要添加multiDexKeepProguardproguardFiles,
        这些配置文件本身由tinkerPatch的插件自动添加,当你disable后需要手动添加
        你可以copy本示例中的proguardRules.protinkerMultidexKeep.pro,
        需要你手动修改'tinker.sample.android.app'本示例的包名为你自己的包名, com.xxx前缀的包名不用修改
     **/
    tinkerEnable = true
    reflectApplication = true
    /**
     * 是否开启加固模式,只能在APK将要进行加固时使用,否则会patch失败。
     * 如果只在某个渠道使用了加固,可使用多flavors配置
     **/
    protectedApp = false
    /**
     * 实验功能
     * 补丁是否支持新增 Activity (新增Activityexported属性必须为false)
     **/
    supportComponent = true

    autoBackupApkPath = "${bakPath}"

    appKey = "660666666666666"

    /** 注意: 若发布新的全量包, appVersion一定要更新 **/
    appVersion = "7.0.0"

    def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/"
    def name = "${project.name}-${variantName}"

    baseApkFile = "${pathPrefix}/${name}.apk"
    baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
    baseResourceRFile = "${pathPrefix}/${name}-R.txt"

    /**
     *  若有编译多flavors需求, 可以参照: https://github.com/TinkerPatch/tinkerpatch-flavors-sample
     *  注意: 除非你不同的flavor代码是不一样的,不然建议采用zip comment或者文件方式生成渠道信息(相关工具:walle 或者 packer-ng     **/
}

/**
 * 用于用户在代码中判断tinkerPatch是否被使能
 */
android {
    defaultConfig {
        buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}"
    }
}

/**
 * 一般来说,我们无需对下面的参数做任何的修改
 * 对于各参数的详细介绍请参考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    ignoreWarning = false
    useSign = true
    dex {
        dexMode = "jar"
        pattern = ["classes*.dex"]
        loader = []
    }
    lib {
        pattern = ["lib/*/*.so"]
    }

    res {
        pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
        ignoreChange = []
        largeModSize = 100
    }

    packageConfig {
    }
    sevenZip {
        zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
//        path = "/usr/local/bin/7za"
    }
    buildConfig {
        keepDexApply = false
    }
}

4、初始化 TinkerPatch SDK

自定义Application,如MyApplication继承自Application,在Application里面进行初始化。

public class MyApplication extends Application {

    private ApplicationLike tinkerApplicationLike;

    @Override
    public void onCreate() {
        super.onCreate();
        // 我们可以从这里获得Tinker加载过程的信息
        tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();

        // 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDK
        TinkerPatch.init(tinkerApplicationLike)
                .reflectPatchLibrary()
                .setPatchRollbackOnScreenOff(true)
                .setPatchRestartOnSrceenOff(true)
                .setFetchPatchIntervalByHours(3);

        // 每隔3个小时(通过setFetchPatchIntervalByHours设置)去访问后台时候有更新,通过handler实现轮训的效果
        TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
    }
}

5、运行 tinkerPatchRelease task 构建补丁包,补丁包将位于 build/outputs/tinkerPatch下。

二、注意事项

1、tinkerpatch.gradle路径,tinkerpatch.gradle的内容复制官网或者上面的即可,但是路径一定要在项目的modle里面,不能写到根目录中,否则无法编译。

2、在app中引入tinkerpatch.gradle文件。需要:

apply from: 'tinkerpatch.gradle'

3、使用assembleRelease 构建基准包失败。如下:


gradle版本不存在,更换网络或者设置代理重试。

4、生成基准包

    使用assembleRelease打完包之后会生成:(注意这个包是含有bug的包,被修复的包,也称为基准包):


     会生成bakApk/app-7.0.0-0508-22-40-24/release文件夹,会有三个文件:app-release.apk,app-release-maping.txt,app-release-R.txt,如果没有app-release-mapping.txt则没有配置签名。

    现在看看刚才配置的信息:


    需要修改如下:

    def baseInfo = "app-7.0.0-0427-23-06-59",双引号里面的替换为生成的新的“app-7.0.0-0508-22-40-24”号码,一定要保证一致,否则无法生成基准包,这个很关键,其他的不用任何修改。

5、生成补丁包

    基准包是包含bug的包,补丁包则是bug被修复的包,在上述基准包的bug被修复完成之后,依据基准包生成补丁包。但是需要注意,基准包必须和补丁包包含的APPVision完全一致,否则下发的补丁包找不到修复的对象导致热修复失败。

    运行tinkerPatchRelease命令生成补丁包,在outpust/apk/tinkerPatch目录下会生成补丁文件,如下:

/

    其中patch_signed_7zip.apk就是要下发的补丁,至此补丁包完成。

三、补丁包下发    

1、注册http://www.tinkerpatch.com/平台账号,新增App:


2、添加App版本


    这个版本号一定要和打的补丁包、基准包保值一致,否则下发失败。

3、发布补丁

    在创建好的新的版本号中发布补丁,如下:


    其中补丁文件选中刚刚生成的patch_signed_7zip.apk,选中开发预览,再提交。然后再点击SDK下载,下载TinkerDebugTool.apk完成测试,大约十来分钟补丁就下发到手机,有bug版本的App就会被修复了,开发预览若没问题,再点选中全量下发即可。这样Tinker就集成完毕。


    github中的文档还是很粗略的,细节没介绍,坑比较多,很容易搞混了,在此把集成中遇到的问题总结下。最后来看看效果:

        

最后附上源码地址:https://download.csdn.net/download/yoonerloop/10411267点击打开链接



猜你喜欢

转载自blog.csdn.net/yoonerloop/article/details/80246265