这两天看了一下Android的热修复框架--bugly,亲自按照官网步骤实现了一下,感觉挺好的,除了部分机型会有点问题。
官网地址:https://bugly.qq.com/v2/index
下面是小米note3 Android8.1更新tinker版本后自动合成的图片
下面来看一下bugly能做什么?
1.异常上报统计,无需在引入其他的异常分析工具,可自动捕获上传异常日志,包括崩溃分析,ANR分析,错误分析等
2.运营统计,包括用户分析,渠道分析等
3.重点,应用升级,包括全量升级(App自动更新,可做大版本升级用),热更新(今天的实现,可以静默的修复一些小的bug)
下面来看一下热更新的实现(照官方文档来操作)
第一.进入Bugly官网并登陆(qq登陆)
第二.创建产品:鼠标移到右上角头像的地方,点击我的产品,点击创建产品,按照 “ * ”是必填项填完提交
第三.新建Android项目
第四.创建签名用的keystore
第五.根据官网进行配置
1.添加插件依赖,在Project的build.gradle增加 classpath "com.tencent.bugly:tinker-support:latest.release"
2.集成sdk,在App的build.gradle中添加自动引入
3.新建热更新gradle插件(可以按照以下方式创建,也可以复制app的build.gradle),和app的build.gradle在同一个目录(app目录)
4.修改热更新gradle插件内容,将官方文档的gradle插件的内容复制到这个文件,也可以参考官方文档自己配置
https://bugly.qq.com/docs/utility-tools/plugin-gradle-hotfix/?v=20180709165613
5.在app的gradle里面引入热更新gradle插件。apply from: 'tinker-support.gradle'
注意:这里会出现app:tinkerSupportProcessDebugManifest'的问题,意思是:
错误:任务':app:tinkerSupportProcessDebugManifest'的执行失败。>您应该设置自定义应用程序,否则您不能使用此 修补程序功能
解决:https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20180709165613,第三步初始化SDK,也是 我们机场热更新必须要做的一步
注意:还会遇到问题 app:validateSigningDebug,意思是:
错误:任务':app:validateSigningDebug'的执行失败。>未设置用于签名配置**的**库文件
解决:配置你的keystore
解决2:或者直接在App的build.gradle配置你的key的信息
第六.AndroidManifest.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" />
3. 配置FileProvider
注意:如果您想兼容Android N或者以上的设备,必须要在AndroidManifest.xml文件中配置FileProvider来访问共享路径的文件。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
如果你使用的第三方库也配置了同样的FileProvider, 可以通过继承FileProvider类来解决合并冲突的问题,示例如下:
<provider
android:name=".utils.BuglyFileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="name,authorities,exported,grantUriPermissions">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="name,resource"/>
</provider>
这里要注意一下,FileProvider类是在support-v4包中的,检查你的工程是否引入该类库。
在res目录新建xml文件夹,创建provider_paths.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->
<external-path name="beta_external_path" path="Download/"/>
<!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->
<external-path name="beta_external_files_path" path="Android/data/"/>
</paths>
这里配置的两个外部存储路径是升级SDK下载的文件可能存在的路径,一定要按照上面格式配置,不然可能会出现错误。
第七.混淆配置
为了避免混淆SDK,在Proguard混淆文件中增加以下配置:
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;} # tinker混淆规则
-dontwarn com.tencent.tinker.**
-keep class com.tencent.tinker.** { *; }
如果你使用了support-v4包,你还需要配置以下混淆规则:
-keep class android.support.**{*;}
第八.以上都配置完成后打基准包
将热更新gradle插件中的tinkerId换成你的唯一id,然后可按照下方式打包,然后在手机上运行(联网上报app),打包后的apk位置在目录app/build/bakApk/app-月日-时-分-秒目录下(如:app-0226-16-45-10)
第九.打补丁包,补丁包位置在app/build/outputs/patch目录下
1.修改tinker-support.gradle中的baseApkDir为基准包的路径:(否则会报错检测找不到基准包/上传补丁的时候匹配不到版本)
def baseApkDir = "app-0226-16-45-10"
2.修改tinkerId为你唯一的tinkerId,需要与基准包的thinkerId不相同
3.将补丁包中的 patch_signed_7zip.apk 文件传到bugly,然后手机重新打开app,即可自动修复
以上即完成了Bugly热更新,异常上报的集成。有几点注意点
1.将ApplicationLike中sdk初始化时候的APPID换成你产品的AppID(在bugly官网-产品中可以看到)
Bugly.init(getApplication(), "这里换成你的AppID", true);
2.目前发现小米note3手机和小米5手机不能自动合成补丁包,手动也不行
3.我的demo地址 TecentBuglyDemo.zip
如果有解决了这个问题的请分享你的方案,不胜感激!
2019-02-27补充:小米note3 Android8.1以上手机不能自动合成的问题解决,将tinker版本换到1.9.9就可以了,