安卓集成腾讯bugly里的热更新

不爱写博客其实是有点苦逼的,因为有些东西不常用就容易模糊。
热更新技术在去年的时候就已经很火了,记录Tinker热更新,这里直接从bugly里面去集成,步骤比较简单,而且也不用后台配合,只要前端集成成功,在bugly里面上传补丁apk就ok。Tinker不支持立即生效,需要重启apk才可以生效,但功能大啊,支持类和资源文件的替换。其实和其他的几种热更新技术比较起来也是个有千秋,稳定就好。
为什么要用腾讯bugly, 因为简单,也不用注册直接用qq号登陆即可。而且里面还支持异常搜集和版本更新等等。可以去官网自行了解。

第一步:添加插件依赖
1、首先,第一步去腾讯bugly官网,用QQ号就直接可以登录,然后创建需要实现热更新的apk产品名,这个步骤非常简单。创建完成后,就开始看文档。我们就跟着文档去集成
版本号最好用release,
工程根目录下“build.gradle”文件中添加:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
        classpath "com.tencent.bugly:tinker-support:latest.release"
    }
}

第二步:集成SDK
2、添加依赖

 dependencies {

          compile "com.android.support:multidex:1.0.1" // 多dex配置
          compile 'com.tencent.bugly:crashreport_upgrade:latest.release' // 升级SDK
}

3、在gradle里面添加, 注意这个添加完先不要Sync Now,等第4步添加完在下载
在app module的“build.gradle”文件中添加:

// 依赖插件脚本
apply from: 'tinker-support.gradle'

4、这一步,我是在我的电脑找到工程的文件夹,然后在app文件目录里创建一个txt文本,然后更改后缀名就可以 了,创建完毕后,再次回到studio里面,就会出现tinker-support.gradle这个文件,
把这个拷贝到刚创建tinker-support.gradle这个文件里

apply plugin: 'com.tencent.bugly.tinker-support'

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

/**
 * 此处填写每次构建生成的基准包目录
 */
def baseApkDir = "app-0208-15-10-00"

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

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

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

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

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

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

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

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

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

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

}

/**
 * 一般来说,我们无需对下面的参数做任何的修改
 * 对于各参数的详细介绍请参考:
 * 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的分配
    }
}

以上几步添加完之后没有什么问题就可以继续按照文档初始化SDK,文档上写的初始化SDK很详细,注意我这里写的3和4步,第4步做完,在Sync Now第3步添加的插件脚步

文档第三步,初始化SDK,创建自定义application,然后按照文档进行添加,别忘了在清单文件里注册application。
文档推荐的是enableProxyApplication = false 的情况 目的是为了更好的去兼容,但是这个不支持加固,其实配置混淆也是可以的,干嘛非得用第三方的加固,AndroidStudio配置混淆很简单,即使用了第三方加固,apk反编译虽然看到的类全是abcd这样的,但是资源文件包括布局照样可以看到,等下推荐一个反编译的工具。

第四步:AndroidManifest.xml配置以及添加权限 其他的更具需求添加


<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

安卓集成腾讯bugly里的热更新_第1张图片

第五步:混淆配置 (到这里如果按照文档配置添加,更换application里的appId,都没有问题,基本 上算是集成 成功了,剩下的还是需要看文档进行apk打基包, 和补丁包。集成不难,在apk管理上面比较 复杂一点,如果使用多渠道打包,那更需要悠着点去管理apk了)

-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}

//v4包

-keep class android.support.**{*;}

使用范例 (继续看文档)
大家如果想测试验证热更新能力,请仔细查看以下文档:
热更新使用范例

1、编译基准包
配置基准包的tinkerId
安卓集成腾讯bugly里的热更新_第2张图片
这里,当你打个基包用1.0.1-base 然后这个apk出现了bug,你在改这个1.0.1-path的补丁包。)

执行assembleRelease编译生成基准包: (如果执行assembleRelease打包的apk如果安装不了的话,说明没有签名打包,需要在gradle里面配置下就 可以打Release并且正常安装。如果打的是debug版的,不用配置)如果打release版本的包,最好在gradle里面配置下。

我是这样配置的

signingConfigs {
        release {
            keyAlias 'tinKer'
            keyPassword '000000'
            storeFile file('F:\\icon\\tinker.keystore')
            storePassword '000000'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            debuggable false    //这个也需要配置下,不然,直接运行不了,也就是说无法调试。
        }
    }

安卓集成腾讯bugly里的热更新_第3张图片
这个会在build/outputs/bakApk路径下生成每次编译的基准包、混淆配置文件、资源Id文件,如下图所示:
安卓集成腾讯bugly里的热更新_第4张图片
实际应用中,请注意保存线上发布版本的基准apk包、mapping文件、R.txt文件,如果线上版本有bug,就可以借助我们tinker-support插件进行补丁包的生成。(意思就是让 你保存下来,因为当你clear一下的时候,这些都会被删除的。如果用的时候在拷贝到目录里,就可以打补丁包了,切记apk的 管理)

到这里,如果打包和文档上一样,就说明配置没有问题了。接下来就是测试了。

测试:
1、先打个基包
2、先修改待修复apk路径、mapping文件路径、resId文件路径
3、在打补丁包( 一定要先执行第2步,在打补丁包)。
4、将补丁包上传到平台 (这些步骤文档上的图片很清晰)
这个只是普通的打包,多渠道打包文档也有提供。按照文档去集成,注意点细节就不会有问题

最后附上集成的demo地址 : githup地址

你可能感兴趣的:(安卓)