线上产品接入bugly热更新

2022-03-08 16:49 阅读 353 次 评论 0 条

摘要

Tinker热更新补丁能够执行成功,依赖基准包中的TINKER_ID和补丁包的TINKER_ID一致。基准包的TINKER_ID可以在打包后的apk文件解压后AndroidManifest.xml中找到,如下图:

查看补丁包TINKER_ID

From表示补丁包是基于当前TINKER_ID打包的,补丁包的TINKER_ID表示当前打包的设计

稳定版

 buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath "com.tencent.bugly:tinker-support:1.2.0"
    }
}
dependencies {
    // 多dex配置
    implementation 'androidx.multidex:multidex:2.0.0'
    // 集成Bugly热更新aar(本地集成使用方式)
    //implementation(name: 'bugly_crashreport_upgrade-1.5.0', ext: 'aar')
    // 远程仓库集成方式(推荐)
    implementation 'com.tencent.bugly:crashreport_upgrade:1.5.0'
    //1. 指定tinker依赖版本(注:应用升级1.3.5版本起,不再内置tinker)
    //2.为了便于解答问题,这里的tinker版本建议跟随此处demo设置,如果微信更新了tinker版本,bugly会定期同步更新
    implementation 'com.tencent.tinker:tinker-android-lib:1.9.14.10'
    implementation 'com.tencent.bugly:nativecrashreport:latest.release'
}
apply plugin: 'com.tencent.bugly.tinker-support'

def bakPath = file("${buildDir}/outputs/apk/")

/**
 * 此处填写每次构建生成的基准包目录
 */
def fav_pre="ipad_wx"
def ver_nam=rootProject.ext.ver_nam
def tinker_id="patch_${ver_nam}_"+releaseTime()
def baseApkDir = "app-0308-16-21-10"
def releaseTime() {
    return new Date().format("MM-dd-HH-mm-ss", TimeZone.getTimeZone("GMT+08:00"))
}
/**
 * 对于插件各参数的详细解析请参考
 */
tinkerSupport {

    // 开启tinker-support插件,默认值true
    enable = true

    // 指定归档目录,默认值当前module的子目录tinker
    autoBackupApkDir = "${bakPath}"

    // 是否启用覆盖tinkerPatch配置功能,默认值false
    // 开启后tinkerPatch配置不生效,即无需添加tinkerPatch
    overrideTinkerPatchConfiguration = true

    // 编译补丁包时,必需指定基线版本的apk,默认值为空
    // 如果为空,则表示不是进行补丁包的编译
    // @{link tinkerPatch.oldApk }
    baseApk = "${bakPath}/${baseApkDir}/${fav_pre}/app-release-${fav_pre}-v${ver_nam}.apk"

    // 对应tinker插件applyMapping
    //baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

    // 对应tinker插件applyResourceMapping
    //baseApkResourceMapping = "${bakPath}/${baseApkDir}/${fav_pre}/app-${fav_pre}-release-R.txt"
    //baseApkResourceMapping = "${bakPath}/${baseApkDir}/${fav_pre}/app-${fav_pre}-release-R.txt"

    // 构建基准包和补丁包都要指定不同的tinkerId,并且必须保证唯一性
    //tinkerId = "${tinker_id}"
    //建议设置true,用户就不用再自己管理tinkerId的命名,插件会为每一次构建的base包自动生成唯一的tinkerId,默认命名规则是versionname.versioncode_时间戳
    //具体参考https://github.com/BuglyDevTeam/Bugly-Android-Demo/wiki/Tinker-ID%E8%AF%A5%E6%80%8E%E4%B9%88%E8%AE%BE%E7%BD%AE
    autoGenerateTinkerId = true
    //tinkerId必须保证唯一性,如果两个base包的tinkerid是一样的,并且都联网激活了,那么后续补丁上传到后台的时候会出现匹配错误
    tinkerId = "if autoGenerateTinkerId=true ,no need set here"

    // 构建多渠道补丁时使用
//     buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

    // 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
    // isProtectedApp = true

    // 是否开启反射Application模式
    enableProxyApplication = false

    // 是否支持新增非export的Activity(注意:设置为true才能修改AndroidManifest文件)
    supportHotplugComponent = true

}

/**
 * 一般来说,我们无需对下面的参数做任何的修改
 * 对于各参数的详细介绍请参考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    //oldApk ="${bakPath}/${appName}/app-release.apk"
    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
        //tinkerId = "1.0.1-base"
        //applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" //  可选,设置mapping文件,建议保持旧apk的proguard混淆方式
        //applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可选,设置R.txt文件,通过旧apk文件保持ResId的分配
    }
}

异常版

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
        classpath "com.tencent.bugly:tinker-support:1.1.5"
    }
}
      dependencies {
          compile "com.android.support:multidex:1.0.1" // 多dex配置
          //注释掉原有bugly的仓库
          //compile 'com.tencent.bugly:crashreport:latest.release'//其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.3.4
          compile 'com.tencent.bugly:crashreport_upgrade:1.3.6'
          // 指定tinker依赖版本(注:应用升级1.3.5版本起,不再内置tinker)
          compile 'com.tencent.tinker:tinker-android-lib:1.9.9'
          compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0
      }
apply plugin: 'com.tencent.bugly.tinker-support'

def bakPath = file("${buildDir}/outputs/apk/")

/**
 * 此处填写每次构建生成的基准包目录
 */
def fav_pre="ipad_wx"
def ver_nam=rootProject.ext.ver_nam
def tinker_id="patch_${ver_nam}_"+releaseTime()
def baseApkDir = "app-0308-16-21-10"
def releaseTime() {
    return new Date().format("MM-dd-HH-mm-ss", TimeZone.getTimeZone("GMT+08:00"))
}
/**
 * 对于插件各参数的详细解析请参考
 */
tinkerSupport {

    // 开启tinker-support插件,默认值true
    enable = true

    // 指定归档目录,默认值当前module的子目录tinker
    autoBackupApkDir = "${bakPath}"

    // 是否启用覆盖tinkerPatch配置功能,默认值false
    // 开启后tinkerPatch配置不生效,即无需添加tinkerPatch
    overrideTinkerPatchConfiguration = true

    // 编译补丁包时,必需指定基线版本的apk,默认值为空
    // 如果为空,则表示不是进行补丁包的编译
    // @{link tinkerPatch.oldApk }
    baseApk = "${bakPath}/${baseApkDir}/${fav_pre}/app-release-${fav_pre}-v${ver_nam}.apk"

    // 对应tinker插件applyMapping
    //baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

    // 对应tinker插件applyResourceMapping
    //baseApkResourceMapping = "${bakPath}/${baseApkDir}/${fav_pre}/app-${fav_pre}-release-R.txt"
    //baseApkResourceMapping = "${bakPath}/${baseApkDir}/${fav_pre}/app-${fav_pre}-release-R.txt"

    // 构建基准包和补丁包都要指定不同的tinkerId,并且必须保证唯一性
    //tinkerId = "${tinker_id}"

    // 构建多渠道补丁时使用
//     buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

    // 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
    // isProtectedApp = true

    // 是否开启反射Application模式
    enableProxyApplication = false

    // 是否支持新增非export的Activity(注意:设置为true才能修改AndroidManifest文件)
    supportHotplugComponent = true

}

/**
 * 一般来说,我们无需对下面的参数做任何的修改
 * 对于各参数的详细介绍请参考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    //oldApk ="${bakPath}/${appName}/app-release.apk"
    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
        //tinkerId = "1.0.1-base"
        //applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" //  可选,设置mapping文件,建议保持旧apk的proguard混淆方式
        //applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可选,设置R.txt文件,通过旧apk文件保持ResId的分配
    }
}

你可能感兴趣的文章

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ158#9359$239或公众号TeachCourse)
转载请注明出处: https://www.teachcourse.cn/2959.html ,谢谢支持!

资源分享

分类:Android 标签:,
关于接口的理解:源头,接口,终点 关于接口的理解:源头,接口,终
Android常用基本控件属性总结 Android常用基本控件属性总结
成员变量的隐藏和方法的重写 成员变量的隐藏和方法的重写
浅谈Eclipse插件ADT 浅谈Eclipse插件ADT