bugly热修复集成与踩坑总结

Elsa ·
更新时间:2024-11-13
· 945 次阅读

第一步添加依赖(project-->build:gradle)

dependencies { classpath 'com.android.tools.build:gradle:3.1.4' classpath "com.tencent.bugly:tinker-support:1.1.5" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } allprojects { repositories { google() jcenter() maven { url 'https://jitpack.io' } } }

第二步添加依赖(APP-->build:gradle)

// 依赖插件脚本 apply from: 'tinker-support.gradle' android--->defaultConfig下添加 ndk { // 设置支持的SO库架构 abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' } //dependencies implementation 'com.tencent.bugly:nativecrashreport:latest.release' implementation "com.android.support:multidex:1.0.3" // 多dex配置 implementation 'com.tencent.bugly:crashreport_upgrade:1.3.6' // 指定tinker依赖版本(注:应用升级1.3.5版本起,不再内置tinker) implementation 'com.tencent.tinker:tinker-android-lib:1.9.9'

第三步在app目录下手动创建 tinker-support.gradle

apply plugin: 'com.tencent.bugly.tinker-support' def bakPath = file("${buildDir}/bakApk/") /** * 此处填写每次构建生成的基准包目录 */ def baseApkDir = "app-0426-18-40-30" 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}" // 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持) // isProtectedApp = true // 是否开启反射Application模式 enableProxyApplication = true // 是否支持新增非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的分配 } }


第四步初始化SDK

1.enableProxyApplication = false 的情况

//复制到自己的包下 public class SampleApplication extends TinkerApplication { public SampleApplication() { super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",//xxx 为自己的包名 "com.tencent.tinker.loader.TinkerLoader", false); } //复制到自己的包下 public class SampleApplicationLike extends DefaultApplicationLike { public static final String TAG = "Tinker.SampleApplicationLike"; public SampleApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) { super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent); } @Override public void onCreate() { super.onCreate(); // 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId // 调试时,将第三个参数改为true Bugly.init(getApplication(), "900029763", false); } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Override public void onBaseContextAttached(Context base) { super.onBaseContextAttached(base); // you must install multiDex whatever tinker is installed! MultiDex.install(base); // 安装tinker // TinkerManager.installTinker(this); 替换成下面Bugly提供的方法 Beta.installTinker(this); } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) { getApplication().registerActivityLifecycleCallbacks(callbacks); } } }

2.enableProxyApplication = true的情况

public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId // 调试时,将第三个参数改为true Bugly.init(this, "900029763", false); } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // you must install multiDex whatever tinker is installed! MultiDex.install(base); // 安装tinker Beta.installTinker(); } }

第五步清单文件配置

在res目录新建xml文件夹,创建provider_paths.xml文件如下:

第六步混淆配置(proguard-rules.pro)

-dontwarn com.tencent.bugly.** -keep public class com.tencent.bugly.**{*;} # tinker混淆规则 -dontwarn com.tencent.tinker.** -keep class com.tencent.tinker.** { *; }

不要忘了keystore签名

signingConfigs { release { storeFile file("./keystore/teste.jks") storePassword "123456" keyAlias "teste" keyPassword "123456" } } buildTypes { release { minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }

第七步基准类打包(可在activity下,写个空指针错误,到时候用补丁包修复,也能在bugly崩溃页面查看到具体错误信息)

注:个别classpath 'com.android.tools.build:gradle:3.1.4'版本并不会出现assembleRelease,需要更换gradle版本

打包成功就会在此目录下出现三个文件

如果minifyEnablle设置为false,就不会有mapping文件

上报联网:把release包安装到正常能上网的手机上,安装运行(此处个别高版本不会初始化成功,最好找低版本手机运行)

第八步打补丁包

1.修改tinker-support.gradle文件,在bakApk目录下,最新出现的目录名改到baseApkDir = "app-0426-19-12-33",比如图片示例

2.基准包tinkerId = "base-1.0.1"---->>> 补丁包tinkerId = "pathch-1.0.1" 第一版基本大多这样命名,后期可根据项目版本命名

接下来就是打包如图

 打包完成 在outputs文件下找到7zip.apk,上传到bugly热更新官网上,如果上报不成功,可能是因为联网上报没成功,可以试试在不同手机运行,在再上传补丁包

  上传补丁包,大概七八分钟杀死程序重新打开,补丁包就会修复成功

个别手机并不能修复成功,我用的小米8 Android10系统,把程序设置为自启动才会修复成功,不过时灵时不灵,,期待bugly官方可以给出解决方案。

结束------bugly热修复官方使用指南:bugly热修复官方


作者:whyareusomw



bugly

需要 登录 后方可回复, 如果你还没有账号请 注册新账号