-
Notifications
You must be signed in to change notification settings - Fork 84
SDK热修复SDK接入文档
此规范是为了方便维护,减少踩坑,小伙伴可以酌情参考。
因为 Robust 的改动需要用注解来帮助 Robust 获得差异,所以制定分支管理规范,避免后续维护困难。
- 要求仅在 hotfix 分支上可以有 Robust 注解,如果 hotfix 分支合并到其他开发分支,需要手动把 Robust 注解去掉
- 约定一个版本只能下发一个补丁,如果想要修复多次,可以下发一个包含本版本之前的所有修复。
支持增量下发热修复补丁,但不推荐这么做!如果同时打补丁,修复范围冲突会导致最后一个补丁不生效,强烈推荐一个业务 SDK 版本一个补丁。
补丁的匹配条件是包名 + 版本号,默认取业务 sdk 的包名 + uploadArchives 配置的 artifactId 作为唯一标识(毕竟会有多业务方接入 artifactId 各不相同的可能),uploadArchives 配置的version 为版本号。
- 要求 version 三位且格式固定为 X.X.X,不能有后缀(受后端限制,固定死3位)
- 需要先改好 version 再打包,再 uploadArchives,如果打完包再修改 version,会造成包内版本和 maven 上传版本不匹配的情况,具体步骤见SDK热修复使用文档。
接入中有任何问题可参考接入示例项目business_sdk
1.1 在项目gradle.properties
中添加开关和配置
# 接入第一步:添加配置和开关
# Application模式,Robust需要是Application才能插入代码和打补丁
isAppModule=false
# Application模式下开启这个就可以打补丁
isPatchModule=false
# 你的业务sdk的包名
sdkPackageName=com.feelschaotic.samplesdk
# 是否开启混淆,一般情况下sdk默认不混淆
isProguard=false
# 业务sdk版本号,请保持三位,且无后缀,且在打包前就要确定好版本,确保版本打在包中
SDK_VERSION=0.0.1
# 业务sdk的upload_artifact_id
SDK_ARTIFACT_ID=MY-SAMPLES-SDK
1.2 在 sdk build.gradle 中加入配置 替换原有的 apply plugin: 'com.android.library'
//注意!!一定要放在文件最前面
// apply plugin表示该项目会使用指定的插件,sdk对应的是com.android.library
if (isAppModule.toBoolean()) {
apply plugin: 'com.android.application'
if (isPatchModule.toBoolean()) {
//制作补丁时将这个打开,auto-patch-plugin紧跟着com.android.application
apply plugin: 'auto-patch-plugin'
}
apply plugin: 'robust'
} else {
apply plugin: 'com.android.library'
}
apply from: rootProject.getRootDir().getAbsolutePath() + "/packPlugin.gradle"
1.3 加入 buildConfigField
// 视情况而定,如果你在初始化热更sdk时的传入的版本号有另外的取值方式,也可以不加此buildConfig
android {
defaultConfig {
buildConfigField "String", "SDK_VERSION", "\"${SDK_VERSION}\""
buildConfigField "String", "SDK_ARTIFACT_ID", "\"${SDK_ARTIFACT_ID}\""
}
}
1.4 在 sdk build.gradle 中配置签名
android {
// 签名的配置
signingConfigs {
debug {
}
// release版本的签名
release {
// 签名的一些信息
keyAlias 'key0'
keyPassword '123456'
storeFile file('./hotfix.jks')
storePassword '123456'
}
}
}
1.5 配置混淆
复制粘贴配置到 sdk build.gradle
android {
buildTypes {
innerTest {
//...
matchingFallbacks = ['debug', 'release']
}
release {
signingConfig signingConfigs.release
minifyEnabled isProguard.toBoolean()//此处取的isProguard就是1.1在项目`gradle.properties`中添加的isProguard开关
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
// Application和Library清单文件处理方式不同
if (isAppModule.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
}
复制粘贴示例sdk的lib-proguard-rules.pro
到业务SDK module目录下,修改文件中的包名
接着配置好sdk自己的混淆规则
android {
defaultConfig {
consumerProguardFiles 'lib-proguard-rules.pro'
}
}
在 sdk 的 build.gradle
中引入库
implementation 'com.github.feelschaotic:SDKHotFix:XX-RELEASE'
XX为最新SDK版本号,例如implementation 'com.github.feelschaotic:SDKHotFix:1.3-RELEASE'
注:最新版本见README标志
在根项目build.gradle中加入maven配置
repositories {
//接入第二步:增加maven配置
maven { url "https://mvnrepository.com/" }
}
...
allprojects {
repositories {
maven { url "https://mvnrepository.com/" }
}
}
再添加classpath配置
// Application模式下引入Robust脚本插件
if (isAppModule.toBoolean()) {
classpath 'com.github.feelschaotic:Robust.gradle-plugin:0.4.87.5-RELEASE'
classpath 'com.github.feelschaotic:Robust.auto-patch-plugin:0.4.87.5-RELEASE'
}
4. 复制示例项目的脚本和文件
4.1 复制 MainActivity.java 到 sdk module 的 java\包名 目录下(目的是为了application打包配置不报错)
4.2 复制 debug 和 release 2 个文件夹到 main 目录下,修改里面的 AndroidManifest.xml,更改为你自己业务SDK的包名
<manifest package="${packageName}"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
4.3 复制 robust.xml 到sdk module 根目录,更改下包名
4.4 复制 packPlugin.gradle 到项目的根目录
val config: HotfixConfig = HotfixConfig.Builder().debug(true)
.appVersion(BuildConfig.VERSION_NAME)
.packageName(BuildConfig.APPLICATION_ID)
.build()
HotfixManager.init(application, config)
<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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**