SDKHotfix(SDK 熱修復(fù)工具包)是一款讓 SDK 開發(fā)者能快速賦予 SDK 熱修復(fù)的能力.
SDKHotfix(SDK 熱修復(fù)工具包)特點
5 分鐘即可讓你的 SDK 擁有熱修復(fù)的能力
節(jié)省踩坑和開發(fā)成本
hook and create Gradle Task
Kotlin + groovy
熱修復(fù)
非對稱加密+對稱加密
擴展美團 Robust 開源庫,使其具有其他熱更庫不具備的補丁回滾功能
數(shù)據(jù)和監(jiān)控思維
優(yōu)點
無兼容問題
實時生效
修復(fù)成功率高達99.9%
在用戶規(guī)模千萬級別的app中驗證過,可信賴
支持補丁異常自動失效,不用再擔(dān)心補丁造成crash啦~
待改進
在編譯階段插件侵入了產(chǎn)品代碼,對運行效率、方法數(shù)、包體積還是產(chǎn)生了一些副作用。(可指定某些class無需插入方法,減少插樁數(shù))
so和資源的替換目前暫未實現(xiàn)
對于只有字段訪問的函數(shù)無法直接修復(fù),可通過調(diào)用處間接修復(fù)
上傳GradleTask尚未在MAC環(huán)境下測試
上傳的補丁支持按包名存檔
要商用的小伙伴要注意,建議換成自己的后端接口或自己續(xù)費一個bmob應(yīng)用,因為bmob云函數(shù)服務(wù)超過40天需要收費,所以本項目需要定期更新應(yīng)用秘鑰。
使用方法
1. 添加配置和開關(guān)
1.1 在項目gradle.properties中添加開關(guān)和配置
# 接入第一步:添加配置和開關(guān)
# Application模式,Robust需要是Application才能插入代碼和打補丁
isAppModule=false
# Application模式下開啟這個就可以打補丁
isPatchModule=false
# 你的業(yè)務(wù)sdk的包名
sdkPackageName=com.feelschaotic.samplesdk
# 是否開啟混淆,一般情況下sdk默認不混淆
isProguard=false
# 業(yè)務(wù)sdk版本號,請保持三位,且無后綴,且在打包前就要確定好版本,確保版本打在包中
SDK_VERSION=0.0.1
# 業(yè)務(wù)sdk的upload_artifact_id
SDK_ARTIFACT_ID=MY-SAMPLES-SDK
1.2 在 sdk build.gradle 中加入配置 替換原有的 apply plugin: 'com.android.library'
//注意!!一定要放在文件最前面
// apply plugin表示該項目會使用指定的插件,sdk對應(yīng)的是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 配置混淆
復(fù)制粘貼配置到 sdk build.gradle
android {
buildTypes {
innerTest {
//...
matchingFallbacks = ['debug', 'release']
}
release {
signingConfig signingConfigs.release
minifyEnabled isProguard.toBoolean()//此處取的isProguard就是1.1在項目`gradle.properties`中添加的isProguard開關(guān)
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'
}
}
}
}
復(fù)制粘貼示例sdk的lib-proguard-rules.pro到業(yè)務(wù)SDK module目錄下,修改文件中的包名
接著配置好sdk自己的混淆規(guī)則
android {
defaultConfig {
consumerProguardFiles 'lib-proguard-rules.pro'
}
}
2. 導(dǎo)庫
在 sdk 的 build.gradle 中引入庫
implementation 'com.github.feelschaotic:SDKHotFix:XX-RELEASE'
XX為最新SDK版本號,例如implementation 'com.github.feelschaotic:SDKHotFix:1.3-RELEASE'
注:最新版本見README標(biāo)志
在根項目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. 復(fù)制示例項目的腳本和文件
4.1 復(fù)制 MainActivity.java 到 sdk module 的 java\包名 目錄下(目的是為了application打包配置不報錯)
4.2 復(fù)制 debug 和 release 2 個文件夾到 main 目錄下,修改里面的 AndroidManifest.xml,更改為你自己業(yè)務(wù)SDK的包名
<manifest package="${packageName}"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
4.3 復(fù)制 robust.xml 到sdk module 根目錄,更改下包名
4.4 復(fù)制 packPlugin.gradle 到項目的根目錄
5. 初始化熱更庫
val config: HotfixConfig = HotfixConfig.Builder().debug(true)
.appVersion(BuildConfig.VERSION_NAME)
.packageName(BuildConfig.APPLICATION_ID)
.build()
HotfixManager.init(application, config)
6. 添加權(quán)限
<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.**
- PC官方版
- 安卓官方手機版
- IOS官方手機版