记一次项目引入bugly热修复(基于微信tinker)与接入walle多渠道打包共存的方式

记一次项目引入bugly热修复(基于微信tinker)与接入walle多渠道打包共存的方式

bugly官方热更新指南

bugly官方接入使用详解

walle github地址

walle 原理

写在最前面

  1. bugly热更新基于微信开源的热修复框架tinker,bugly集成了tinker,并将自家的崩溃日志SDK一起集成进了升级SDK中,bugly提供了热更新管理后台。
  2. bugly提供的多渠道打包方式基于原始的productFlavors方式,会在最终dex中产生不同渠道的差异,因此会产生N多不同tinkId,因此对应tinkId打出补丁包的话也会产生N多。因此换用美团walle打包方式,在签名阶段将渠道信息写入。

首先先将bugly升级包中的Tinker引入

  1. app目录下添加 apply from: ‘tinker-support.gradle’ 将tinker的gradle进行分拆
  2. 依赖他们家升级包 compile ‘com.tencent.bugly:crashreport_upgrade:latest.release’

贴出代码,下面这些就已经可以了,我个人遇到的一些问题列举一下。

  1. def appName = “app-0210-15-36-17” 这引号里面的是你要去修复的生成版本时间文件夹(发版时候保存好,弄丢很刺激哦)
  2. 要生成补丁包的时候一定要更换 tinkerId = “joojia_tinker_patch”
新建tinker-support.gradle做gradle拆分
apply plugin: 'com.tencent.bugly.tinker-support'

def bakPath = file("${buildDir}/bakApk/")
//当你生成基准包的时候,请替换下面这行
//这行在打出补丁包的时候会制定你/build/bakApk目录下的apk文件,进行对比。
def appName = "app-0210-15-36-17"

/**
 * 对于插件各参数的详细解析请参考
 */
tinkerSupport {

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

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

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

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

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

    // 对应tinker插件applyResourceMapping
    baseApkResourceMapping = "${bakPath}/${appName}/app-release-R.txt"
//这个id在生成基准包和生成patch时候都要修改
    tinkerId = "joojia_tinker_patch"

    //构建多渠道打包时候使用
    buildAllFlavorsDir = "${bakPath}/${appName}"

    // 是否开启代理Application,设置之后无须改造Application,默认为false
    enableProxyApplication = true

}

接下来将walle多渠道打包接入

  1. app目录下gradle添加 apply plugin: ‘walle’,依赖插件 classpath ‘com.meituan.android.walle:plugin:1.0.4’
  2. 依赖包 compile ‘com.meituan.android.walle:library:1.0.4’
  3. 添加channel文件在app目录下,里面写你的渠道号
  4. app目录下gradle加段代码
walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 配置渠道文件列表,也可以通过channelList来配置
    channelFile = "./channel";
}

两者结合

  1. 首先 ./gradlew clean assembleRelease -PchannelFile=app/channel 会在BakApk先生成一个基准包,在output/channels目录下生成所有渠道包(千万注意你channel的目录)
  2. ./gradlew buildTinkerPatchRelease 生成一个补丁包基于上面那个基准包来生成即可,之后去bugly平台下发即可。
    原文作者:smallstrong
    原文地址: https://www.jianshu.com/p/2cd53c64e12f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞