SDKHotfix(SDK 热修复工具包)

软件下载 安全检测通过

软件介绍

SDKHotfix(SDK 热修复工具包)是一款让 SDK 开发者能快速赋予 SDK 热修复的能力.

SDKHotfix(SDK 热修复工具包)特点

5 分钟即可让你的 SDK 拥有热修复的能力

节省踩坑和开发成本

hook and create Gradle Task

Kotlin + groovy

热修复

非对称加密+对称加密

扩展美团 Robust 开源库,使其具有其他热更库不具备的补丁回滚功能

数据和监控思维

优点

无兼容问题

实时生效

修复成功率高达99.9%

在用户规模千万级别的app中验证过,可信赖

支持补丁异常自动失效,不用再担心补丁造成crash啦~

待改进

在编译阶段插件侵入了产品代码,对运行效率、方法数、包体积还是产生了一些副作用。(可指定某些class无需插入方法,减少插桩数)

so和资源的替换目前暂未实现

对于只有字段访问的函数无法直接修复,可通过调用处间接修复

上传GradleTask尚未在MAC环境下测试

上传的补丁支持按包名存档

要商用的小伙伴要注意,建议换成自己的后端接口或自己续费一个bmob应用,因为bmob云函数服务超过40天需要收费,所以本项目需要定期更新应用秘钥。

使用方法

1. 添加配置和开关

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'
}
}

2. 导库

在 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 到项目的根目录

5. 初始化热更库

val config: HotfixConfig = HotfixConfig.Builder().debug(true)
.appVersion(BuildConfig.VERSION_NAME)
.packageName(BuildConfig.APPLICATION_ID)
.build()
HotfixManager.init(application, config)

6. 添加权限

<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" />

7. 加入混淆

-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**