Tinker 热更新的使用

栏目: Android · 发布时间: 7年前

内容简介:step 5:在 TinkerPatch 平台中添加 app,并获取 appkey,填入到 tinkerpatch.gradle 中对于的 appkey 参数中
  • Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。

较为具体的技术实现过程

Step 1: 添加 gradle 依赖

  1. 在项目的 build.gradle 中添加 tinker-patch-gradle-plugin的依赖
    buildscript {
        dependencies {
            // TinkerPatch 插件
            classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.2"
        }
    }
    复制代码
  2. 然后在app的gradle文件app/build.gradle,我们需要添加tinker的库依赖以及apply tinker的gradle插件
    dependencies {
    // TinkerPatch SDK 依赖
    compile 'com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.9.1'
    }
    复制代码
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'
复制代码

Step 2:设置 TinkerPatch 相关的配置

  • 为了简单方便,我们将 TinkerPatch 的相关配置都发在 tinkerpatch.gradle 中,创建他 TinkerPatch.gradle 文件之后,在 app.gradle 中使用该文件(apply from: 'tinkerpatch.gradle'),TinkerPatch.gradle 的参数如下:
apply plugin: 'tinkerpatch-support'

/**
 * TODO: 请按自己的需求修改为适应自己工程的参数
 */
def bakPath = file("build/backupApk/")
def baseInfo = "app-1.0.2-1120-17-20-01"
def variantName = "release"

/**
 * 对于插件各参数的详细解析请参考
 * http://tinkerpatch.com/Docs/SDK
 */
tinkerpatchSupport {
    /** 可以在debug的时候关闭 tinkerPatch, isRelease() 可以判断BuildType是否为Release **/
    tinkerEnable = true
    // 是否反射实现一键接入
    reflectApplication = true
    /**
     * 是否开启加固模式,只能在APK将要进行加固时使用,否则会patch失败。
     * 如果只在某个渠道使用了加固,可使用多flavors配置
     **/
    protectedApp = true
    /**
     * 实验功能
     * 补丁是否支持新增 Activity (新增Activity的exported属性必须为false)
     **/
    supportComponent = true

    autoBackupApkPath = "${bakPath}"

    appKey = "d5d1c96215a04b5c"

    /** 注意: 若发布新的全量包, appVersion一定要更新 **/
    /** Tinker 使用 appVersion 作为 TinkerId, 我们需要保证每个发布出去的基础安装包的 appVersion 都不一样。 **/
    appVersion = "1.0.2"

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

    /** 基准包的文件路径, 对应 tinker 插件中的 oldApk 参数;编译补丁包时,必需指定基准版本的 apk,默认值为空,则表示不是进行补丁包的编译。
     */
    baseApkFile = "${pathPrefix}/${name}.apk"
    baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
    baseResourceRFile = "${pathPrefix}/${name}-R.txt"

    /**
     * (可选)重命名备份文件的格式化字符串,默认为'${appName}-${variantName}'
     *
     * Available vars:
     * 1. projectName
     * 2. appName
     * 3. packageName
     * 4. buildType
     * 5. versionName
     * 6. versionCode
     * 7. buildTime
     * 8. fileSHA1
     * 9. flavorName
     * 10. variantName
     *
     * default value: '${appName}-${variantName}'
     * Note: plz use single-quotation wrapping this format string
     */
    // 格式化命名备份文件 这里请使用单引号
    backupFileNameFormat = '${appName}-${variantName}'

    /**
     *  若有编译多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
    }
}

import java.util.regex.Matcher
import java.util.regex.Pattern

/**
 * 如果只想在Release中打开tinker,可以把tinkerEnable赋值为这个函数的return
 * @return 是否为release
 */
def isRelease() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;
    if (tskReqStr.contains("assemble")) {
        println tskReqStr
        pattern = Pattern.compile("assemble(\\w*)(Release|Debug)")
    } else {
        pattern = Pattern.compile("generate(\\w*)(Release|Debug)")
    }
    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find()) {
        String task = matcher.group(0).toLowerCase()
        println("[BuildType] Current task: " + task)
        return task.contains("release")
    } else {
        println "[BuildType] NO MATCH FOUND"
        return true;
    }
}

复制代码
  • 重要参数
参数 作用
tinkerEnable 是否开启热更新
reflectApplication 是否反射实现一键接入
supportComponent 是否支持新增 activity
protectedApp 是否开启应用加固(360 加固或者乐固)
appKey 在 TinkerPatch 平台 申请的 appkey
appVersion 若发布新的全量包, appVersion一定要更新
autoBackupApkPath 自动备份文件的路径

step 3:reflectApplication = true

  • 为了更方便的使用,我们选择使用 reflectApplication = true 的模式,这种模式我们不用为了接入 tinker 而改造我们的 Application 类。
public class SampleApplication extends Application {

    ...

    @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();
    }

    ...
复制代码

step 4:运行 assembleRelease task(生成基准包 -- 发布到应用商店)

  • 运行 assembleRelease task 构建基准包(请在发布前确保更新tinkerpatchSupport中的appVersion),tinkerPatch会基于你填入的autoBackupApkPath自动备份基础包信息到相应的文件夹,包含:apk文件、R.txt文件和mapping.txt文件 (注:mapping.txt是proguard的产物,如果你没有开启proguard则不会有这个文件)

    • 备份的路径
    Tinker 热更新的使用
    • 备份的文件
    Tinker 热更新的使用
  • 这个步骤是我们一般的情况下的打包操作,如我们发布到应用商店的版本名为:1.0.0,那么之后我们发布补丁的话,我们都是要在这个 1.0.0 的版本之上生成补丁包的。

Tinker 热更新的使用

step 5:在 TinkerPatch 平台中添加 app,并获取 appkey,填入到 tinkerpatch.gradle 中对于的 appkey 参数中

  • 添加 app
Tinker 热更新的使用
  • 获取 appkey
Tinker 热更新的使用

step 6:发布到应用商店的版本出现 bug,想要发布补丁包

  • 运行 tinkerPatchRelease task 构建补丁包,补丁包将位于 build/outputs/tinkerPatch下,默认的情况下,补丁包为:patch_signed.apk

    • 执行 tinkerPatchRelease
    Tinker 热更新的使用
    • 执行 tinkerPatchRelease 之后,生成的补丁包路径
    Tinker 热更新的使用

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

构建之法(第二版)

构建之法(第二版)

邹欣 / 人民邮电出版社 / 2015-7 / 59

软件工程牵涉的范围很广, 同时也是一般院校的同学反映比较空洞乏味的课程。 但是软件工程的技术对于投身IT 产业的学生来说是非常重要的。作者邹欣有长达20年的一线软件开发经验,他利用业余时间在数所高校进行了长达6年的软件工程教学实践,总结出了在16周的时间内让同学们通过 “做中学 (Learning By Doing)” 掌握实用的软件工程技术的教学计划,并得到高校师生的积极反馈。在此基础上,作者对......一起来看看 《构建之法(第二版)》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具