Android Bugly 热更新详解,腾讯微信Tinker的开源方案
2017-12-19 15:49
489 查看
最近项目要集成一个修复功能,一开始参考别的博客来配置,一直提示基准包配置是否正常,怎么调也是这样,后面直接把全部配置直接删除掉,根据官方Demo来配置一下就正常了,再次记录下。下次在集成就只要翻开博客,就方便配置了,虽然搜索有博客说明,但是还是自己做个记录,下次在配置,看看博客就知道怎么配置了,不用在花那么多时间去试错。
集成的是Bugly Android热更新功能,在此我只是记住自己的方式,不一定适合所有人,所以可以参考,具体可以去参考官方文档点击打开链接,
为什么使用Bugly热更新?
无需关注Tinker是如何合成补丁的
无需自己搭建补丁管理后台
无需考虑后台下发补丁策略的任何事情
无需考虑补丁下载合成的时机,处理后台下发的策略
我们提供了更加方便集成Tinker的方式
我们通过HTTPS及签名校验等机制保障补丁下发的安全性
丰富的下发维度控制,有效控制补丁影响范围
我们提供了应用升级一站式解决方案
工程根目录下“build.gradle”文件中添加:
gradle配置
在app module的“build.gradle”文件中添加(示例配置):
在app module的“build.gradle”文件中添加:
tinker-support.gradle内容如下所示(示例配置):
注:您需要在同级目录下创建tinker-support.gradle这个文件。
在AndroidMainfest.xml中进行以下配置:
1. 权限配置
2. Activity配置
为了避免混淆SDK,在Proguard混淆文件中增加以下配置:
如果你使用了support-v4包,你还需要配置以下混淆规则:
至此配置就完成了,接下来的使用参照官方的一步步来就是了,
大家如果想测试验证热更新能力,请仔细查看以下文档:
热更新使用参考
集成的是Bugly Android热更新功能,在此我只是记住自己的方式,不一定适合所有人,所以可以参考,具体可以去参考官方文档点击打开链接,
为什么使用Bugly热更新?
无需关注Tinker是如何合成补丁的
无需自己搭建补丁管理后台
无需考虑后台下发补丁策略的任何事情
无需考虑补丁下载合成的时机,处理后台下发的策略
我们提供了更加方便集成Tinker的方式
我们通过HTTPS及签名校验等机制保障补丁下发的安全性
丰富的下发维度控制,有效控制补丁影响范围
我们提供了应用升级一站式解决方案
第一步:添加插件依赖
工程根目录下“build.gradle”文件中添加:buildscript { repositories { jcenter() } dependencies { // tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4 classpath "com.tencent.bugly:tinker-support:1.0.8" } }
第二步:集成SDK
gradle配置在app module的“build.gradle”文件中添加(示例配置):
android { defaultConfig { ndk { //设置支持的SO库架构 abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' } } } dependencies { compile "com.android.support:multidex:1.0.1" // 多dex配置 //注释掉原有bugly的仓库 //compile 'com.tencent.bugly:crashreport:latest.release'//其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.3.2 compile 'com.tencent.bugly:crashreport_upgrade:1.3.1' compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0 }
在app module的“build.gradle”文件中添加:
// 依赖插件脚本 apply from: 'tinker-support.gradle'
tinker-support.gradle内容如下所示(示例配置):
注:您需要在同级目录下创建tinker-support.gradle这个文件。
apply plugin: 'com.tencent.bugly.tinker-support' def bakPath = file("${buildDir}/bakApk/") /** * 此处填写每次构建生成的基准包目录 */ def baseApkDir = "app-1218-18-05-49" /** * 对于插件各参数的详细解析请参考 */ tinkerSupport { // 开启tinker-support插件,默认值true enable = true // 自动生成tinkerId, 你无须关注tinkerId,默认为false autoGenerateTinkerId = true // 指定归档目录,默认值当前module的子目录tinker autoBackupApkDir = "${bakPath}" // 是否启用覆盖tinkerPatch配置功能,默认值false // 开启后tinkerPatch配置不生效,即无需添加tinkerPatch overrideTinkerPatchConfiguration = true // 编译补丁包时,必需指定基线版本的apk,默认值为空 // 如果为空,则表示不是进行补丁包的编译 // @{link tinkerPatch.oldApk } baseApk = "${bakPath}/${baseApkDir}/app-release.apk" // baseApk = "${bakPath}/${baseApkDir}/app-debug.apk" // 对应tinker插件applyMapping baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt" // baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-debug-mapping.txt" // 对应tinker插件applyResourceMapping baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt" // baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-debug-R.txt" // 构建基准包跟补丁包都要修改tinkerId,主要用于区分 // tinkerId = "1.0.0-base" // 打多渠道补丁时指定目录 // buildAllFlavorsDir = "${bakPath}/${baseApkDir}" // 是否使用加固模式,默认为false isProtectedApp = true // 是否采用反射Application的方式集成,无须改造Application enableProxyApplication = true // 支持新增Activity supportHotplugComponent = true } /** * 一般来说,我们无需对下面的参数做任何的修改 * 对于各参数的详细介绍请参考: * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97 */ tinkerPatch { tinkerEnable = true ignoreWarning = false useSign = false 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 = "base-2.0.1" } }
第三步:初始化SDK
enableProxyApplication = true 的情况
注:无须你改造Application,主要是为了降低接入成本,我们插件会动态替换AndroidMinifest文件中的Application为我们定义好用于反射真实Application的类(需要您接入SDK
1.2.2版本 和 插件版本
1.0.3以上)。
/** * 自定义的applition */ public class MainApplication extends Application { @Override public void onCreate() { super.onCreate(); setStrictMode(); // 设置是否开启热更新能力,默认为true Beta.enableHotfix = true; // 设置是否自动下载补丁 Beta.canAutoDownloadPatch = true; // 设置是否提示用户重启 Beta.canNotifyUserRestart = true; // 设置是否自动合成补丁 Beta.canAutoPatch = true; /** * 全量升级状态回调 */ Beta.upgradeStateListener = new UpgradeStateListener() { @Override public void onUpgradeFailed(boolean b) { } @Override public void onUpgradeSuccess(boolean b) { } @Override public void onUpgradeNoVersion(boolean b) { Toast.makeText(getApplicationContext(), "最新版本", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrading(boolean b) { Toast.makeText(getApplicationContext(), "onUpgrading", Toast.LENGTH_SHORT).show(); } @Override public void onDownloadCompleted(boolean b) { } }; /** * 补丁回调接口,可以监听补丁接收、下载、合成的回调 */ Beta.betaPatchListener = new BetaPatchListener() { @Override public void onPatchReceived(String patchFileUrl) { Toast.makeText(getApplicationContext(), patchFileUrl, Toast.LENGTH_SHORT).show(); } @Override public void onDownloadReceived(long savedLength, long totalLength) { Toast.makeText(getApplicationContext(), String.format(Locale.getDefault(), "%s %d%%", Beta.strNotificationDownloading, (int) (totalLength == 0 ? 0 : savedLength * 100 / totalLength)), Toast.LENGTH_SHORT).show(); } @Override public void onDownloadSuccess(String patchFilePath) { Toast.makeText(getApplicationContext(), patchFilePath, Toast.LENGTH_SHORT).show(); // Beta.applyDownloadedPatch(); } @Override public void onDownloadFailure(String msg) { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } @Override public void onApplySuccess(String msg) { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } @Override public void onApplyFailure(String msg) { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } @Override public void onPatchRollback() { Toast.makeText(getApplicationContext(), "onPatchRollback", Toast.LENGTH_SHORT).show(); } }; long start = System.currentTimeMillis(); // 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId,调试时将第三个参数设置为true Bugly.init(this, "808e8f8759", true); long end = System.currentTimeMillis(); Log.e("init time--->", end - start + "ms"); } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // you must install multiDex whatever tinker is installed! MultiDex.install(base); // 安装tinker Beta.installTinker(); } @TargetApi(9) protected void setStrictMode() { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); StrictMod d907 e.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build()); } }
第四步:AndroidManifest.xml配置
在AndroidMainfest.xml中进行以下配置:1. 权限配置
<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" />
2. Activity配置
<activity android:name="com.tencent.bugly.beta.ui.BetaActivity" android:configChanges="keyboardHidden|orientation|screenSize|locale" android:theme="@android:style/Theme.Translucent" />
第五步:混淆配置
为了避免混淆SDK,在Proguard混淆文件中增加以下配置:-dontwarn com.tencent.bugly.** -keep public class com.tencent.bugly.**{*;}
如果你使用了support-v4包,你还需要配置以下混淆规则:
-keep class android.support.**{*;}
至此配置就完成了,接下来的使用参照官方的一步步来就是了,
使用范例
大家如果想测试验证热更新能力,请仔细查看以下文档:热更新使用参考
相关文章推荐
- 微信Android热更新Tinker使用详解(星空武哥)
- 微信Android热更新Tinker使用详解(by 星空武哥)
- Tinker详解 -- 微信Android 热补丁方案
- 微信开源的Android热补丁框架 Tinker
- 腾讯开源手游热更新方案Xlua尝鲜(一)
- (4.2.5) 【android开源组件】SwipeListView 详解 实现微信,QQ等滑动删除效果
- Android 热修复,微信开源框架tinker的接入,就是这么简单
- Tinker -- 微信Android热补丁方案 接入指南
- Android热更新开源项目Tinker集成实践总结
- 腾讯开源手游热更新方案,Unity3D下的Lua编程
- Android热更新之微信Tinker集成(接入Bugly热更新)
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
- Android 热更新 Bugly(Tinker)接入
- Android热更新开源项目Tinker集成实践总结
- Android热更新开源项目Tinker源码解析系列之一:Dex热更新
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
- Tinker -- 微信Android热补丁方案 自定义扩展
- Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
- 关于使用腾讯 Bugly 平台 Tinker开源热修复框架的 项目集成
- Android热更新:微信Tinker框架的接入与测试