2022-9-23: 弃坑吧哥们,发现 Bugly 热更有一个不可接受、自己也很难修复、官方团队也不处理的问题(链接)。打算换阿里云的热更方案(链接),看页面就感觉高端大气上档次,还有收费方案,应该差不到哪去吧。
按着腾讯官方的接入教程(地址)一步一步地来集成,应该是由于文档的版本太旧,或者是项目的 gradle 版本太高还是别的原因,最后还是失败了。后面找到了在 Github 上的另一篇较新的文章(地址),将 Demo 项目下载下来自己捣鼓了几天,终于调通了,成功集成最新版本(1.6.1)的 Bugly 热更模块。
本文旨在给安卓项目接入 Bugly 热更热功能提供参考,欢迎留言交流
集成后项目结构预览
(无须关注的已经马赛克掉)
接入前准备
- 克隆 Demo 项目(地址)到本地
- 你自己的安卓项目
一、项目(需要接入的那个)准备
调整项目配置
- 打开 project structure 面板
- 调整 Project 配置(更高版本的没去折腾了,有空的自行尝试)
- 调整 SDK 配置(得用1.8,不然会报错)
gradle.properties
在 project/gradle.properties (没有则自行创建)中添加
android.useAndroidX=true
android.enableJetifier=true
准备签名文件
在 app/keystore 中准备好签名文件(也可以从 Demo 项目中直接拷贝使用)
其他工具
- 安装 NDK (我装的是 21.1 和 21.4,我也不清楚最终用哪个)
- 安装 CMake (3.10)
二、添加插件依赖(需注意的会使用!!标出)
project/build.gradle
buildscript {
repositories {
// jcenter() !!这个注释掉
google()
// !!添加这3行
mavenCentral()
maven { url 'https://maven.aliyun.com/repository/spring-plugin/' }
maven { url 'https://jitpack.io' }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
// !!添加这个
// tinkersupport插件(1.0.3以上无须再配置tinker插件)
classpath 'com.tencent.bugly:tinker-support:1.2.3'
}
}
allprojects {
repositories {
// jcenter() !!这个注释掉
google()
// !!添加这3行
mavenCentral()
maven { url 'https://maven.aliyun.com/repository/spring-plugin/' }
maven { url 'https://jitpack.io' }
}
}
三、集成 SDK
app/build.gradle
apply plugin: 'com.android.application'
android {
...
// !!添加下面的
// 编译选项
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// recommend
dexOptions {
jumboMode = true
}
// 签名配置
signingConfigs {
release {
try {
// !!改为自己的签名配置
storeFile file("./keystore/release.keystore")
storePassword "testres"
keyAlias "testres"
keyPassword "testres"
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
debug {
storeFile file("./keystore/debug.keystore")
}
}
...
defaultConfig {
...
// !!添加下面的
// 开启multidex
multiDexEnabled true
externalNativeBuild {
cmake {
cppFlags ""
abiFilters 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'//,'armeabi'
}
}
ndk {
// 设置支持的SO库架构
abiFilters 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'//,'armeabi'
}
...
}
// !!添加下面的
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
repositories {
flatDir {
dirs 'libs'
}
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
// !!下面这些可对照着自己修改
sourceSets.main{
jniLibs.srcDir 'libs'
}
buildTypes {
release {
minifyEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.debug
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// implementation 'com.android.support:appcompat-v7:22.1.1' !!如有,注释掉
//noinspection GradleDependency
// !!添加下面这些
implementation 'com.google.android.material:material:1.0.0' // 注意版本不能改
// 多dex配置
implementation 'androidx.multidex:multidex:2.0.1'
// 远程仓库集成方式(推荐)
implementation 'com.tencent.bugly:crashreport_upgrade:1.6.1'
//1. 指定tinker依赖版本(注:应用升级1.3.5版本起,不再内置tinker)
//2.为了便于解答问题,这里的tinker版本建议跟随此处demo设置,如果微信更新了tinker版本,bugly会定期同步更新
implementation 'com.tencent.tinker:tinker-android-lib:1.9.14.24'
implementation 'com.tencent.bugly:nativecrashreport:3.9.2'
}
// !!添加依赖插件脚本
apply from: 'tinker-support.gradle'
在 app 目录下添加 tinker-support.gradle 配置
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
* 此处填写每次构建生成的基准包目录
*/
def baseApkDir = "app-0919-20-51-02"
/**
* 对于插件各参数的详细解析请参考,如果没有特殊需求下面的参数都可以不用更改;如果apk需要加固等可以参考具体描述设置参数
*/
tinkerSupport {
// 开启tinker-support插件,默认值true
enable = true
// 指定归档目录,默认值当前module的子目录tinker
autoBackupApkDir = "${bakPath}"
//建议设置true,用户就不用再自己管理tinkerId的命名,插件会为每一次构建的base包自动生成唯一的tinkerId,默认命名规则是versionname.versioncode_时间戳
//具体参考https://github.com/BuglyDevTeam/Bugly-Android-Demo/wiki/Tinker-ID%E8%AF%A5%E6%80%8E%E4%B9%88%E8%AE%BE%E7%BD%AE
autoGenerateTinkerId = true
//tinkerId必须保证唯一性,如果两个base包的tinkerid是一样的,并且都联网激活了,那么后续补丁上传到后台的时候会出现匹配错误
tinkerId = ""
// 是否启用覆盖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"
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
// 是否开启加固模式,默认为false
isProtectedApp = true
enableProxyApplication = false
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-debug.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-patch"
//applyMapping = "${bakPath}/${appName}/app-debug-mapping.txt" // 可选,设置mapping文件,建议保持旧apk的proguard混淆方式
//applyResourceMapping = "${bakPath}/${appName}/app-debug-R.txt" // 可选,设置R.txt文件,通过旧apk文件保持ResId的分配
}
}
c++ 相关的
从克隆下来的 Demo 项目中拷贝这些代码到 app 目录中
由于 NativeCrashJni 的包名改了,所以 native-lib.cpp 中的代码也得做相应的改动:
四、初始化 SDK
按官方教程做就好,就不重复了(地址)
五、AndroidManifest.xml配置
下面是官方教程截图(注意红字部分):
所以 AndroidManifest.xml 要做的修改,上一步已经完成(修改 application.android:name)。
六、混淆配置
也是按官方教程配置就好(地址)
至此,接入已经全部完成,如果项目没报错想继续验证热更功能的话,可以跟着官方教程来做(地址),我试过是OK的。