bugly自动更新我断断续续的集成了挺长时间吧,最后成功之后就想把集成的经验写出来,方便以后使用和分享吧。
1.首先你需要在工程根目录下"bulid.gradle"文件中添加:
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
// tinker gradle插件
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.5')
// tinkersupport插件
classpath "com.tencent.bugly:tinker-support:latest.release"
}
2.在app module的“build.gradle”文件中添加(示例配置):
dependencies {
compile "com.android.support:multidex:1.0.1" // 多dex配置
compile 'com.tencent.bugly:crashreport_upgrade:latest.release' // 升级SDK
}
在这里我的做法是将签名直接配置在里面:
// 签名配置
signingConfigs {
release {
try {
keyAlias '别名'
keyPassword '别名密码'
storeFile file('你项目的.jks文件地址')//例如C:/Users/byxpc60/Desktop/***/app/src/***.jks
storePassword 'store密码'
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
debug {
storeFile file("./keystore/debug.keystore")
}
}
buildTypes {
release {
minifyEnabled true//release下混淆代码
// 移除无用的resource文件
shrinkResources true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true//debug下混淆代码
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
3.在app module的“build.gradle”文件中添加:
// 依赖插件脚本
apply from: 'tinker-support.gradle'
4.在同级目录下创建tinker-support.gradle这个文件,并添加如下代码:
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
* 此处填写每次构建生成的基准包目录
*/
def baseApkDir = "app-0314-15-07-39"
/**
* 对于插件各参数的详细解析请参考
*/
tinkerSupport {
// 开启tinker-support插件,默认值true
enable = true
// tinkerEnable功能开关
tinkerEnable = 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 = "1.0.1-path"
// 打多渠道补丁时指定目录
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
enableProxyApplication = 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 = 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 = "base-2.0.1"
}
}
注意 在tinker-support.gradle中
我设置"enableProxyApplication = true",因为我的项目中有自定义的Application,所以我就设置为true.并且Application中代码如下
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//"900"为在bugly上面注册的项目的App_ID;
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();
}
}
5.配置provide
在res文件夹下创建xml子文件夹,在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/com.bugly.upgrade.demo/.beta/apk-->
<external-path name="beta_external_path" path="Download/"/>
<!--/storage/emulated/0/Android/data/com.bugly.upgrade.demo/files/apk/-->
<external-path name="beta_external_files_path" path="Android/data/"/>
</paths>
6.配置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" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2).Activity配置<activity
android:name="com.tencent.bugly.beta.ui.BetaActivity"
android:theme="@android:style/Theme.Translucent" />
3).FileProvider配置
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.***.***.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
在authorities中填写自己项目的报名,manifest最上面有的.
7.代码混淆
你肯定将你项目的代码混淆了,在proguard-rules.pro文件中添加:
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
如果你使用了support-v4包,你还需要配置以下混淆规则:
-keep class android.support.**{*;}
8.使用说明
1).首先先测试热更新功能的话你需要先将你项目中的一个代码修改一下,比如我将首页的名字改为"首页测试版本"
2).然后你需要编译基准包,首先先点击下方红框
然后点击下图红框中的assembleRelease生成基准包
这里需要注意在tinker-support.gradle中的tinkerId最好是一个唯一标识,例如git版本号、versionName等等,你需要对基线版本进行联网上报。
比如我在生成基准包是tinkerId为"1.0.1-base",双击之后编译成功后显示:
成功后会在build/outputs/bakApk路径下生成每次编译的基准包、混淆配置文件、资源Id文件,如下图所示:
然后去你的工程目录中将上图的apk安装到你的手机中,这样你启动apk后就会上报联网数据了
下一步为你需要将tinker-support.gradle中的baseApkDir = "app-0314-15-07-39"改为你自己生成基准包时的时间,并将tinkerId = "1.0.1-base"修改一下我是将其改为"1.0.1-path",不用和我一样我只是觉得这么修改方便.
然后双击下图的红框,生成release版本的补丁包
编译成功后显示
这时显示成功后我们去工程文件夹下的bulid/ouputs/path文件夹下查看我们的补丁包
其中的patch_signed_7zip文件就是我们需要上传的补丁包,在文件夹中显示为
然后我们去bugly官网上面上传我门的补丁包
首先点击设置按钮进入热更新详情页
这里面是我上传的一些测试补丁包
点击发布新补丁后将我们刚才生成的补丁包文件上传上去
点击选择文件按钮将我们生成的补丁包文件上传上去后,目标版本会自动显示,选择全量设备或开发设备,可以写一些备注,方便自己观看,效果图如下:
点击立即下发后,会弹出是否下发的提示框
点击确定后如下图
因为bugly热更新每次只有一个补丁生效所以之前的补丁就会显示下发停止,而最新的会显示下发中,这是你可能会等一会再重新启动项目后会发现已经更新完成了.
bugly是支持多渠道打包的,因为我的项目里不需要多渠道打包,所以要是有需要的话可以去官网查看多渠道打包方法.