Skip to content

SDK热修复SDK接入文档

乱 edited this page Nov 4, 2019 · 5 revisions

SDK热修复SDK接入文档

一、业务sdk接入规范

此规范是为了方便维护,减少踩坑,小伙伴可以酌情参考。

1. 分支管理

因为 Robust 的改动需要用注解来帮助 Robust 获得差异,所以制定分支管理规范,避免后续维护困难。

  1. 要求仅在 hotfix 分支上可以有 Robust 注解,如果 hotfix 分支合并到其他开发分支,需要手动把 Robust 注解去掉
  2. 约定一个版本只能下发一个补丁,如果想要修复多次,可以下发一个包含本版本之前的所有修复。

支持增量下发热修复补丁,但不推荐这么做!如果同时打补丁,修复范围冲突会导致最后一个补丁不生效,强烈推荐一个业务 SDK 版本一个补丁。

2. SDK 版本管理

补丁的匹配条件是包名 + 版本号,默认取业务 sdk 的包名 + uploadArchives 配置的 artifactId 作为唯一标识(毕竟会有多业务方接入 artifactId 各不相同的可能),uploadArchives 配置的version 为版本号。

  1. 要求 version 三位且格式固定为 X.X.X,不能有后缀(受后端限制,固定死3位)
  2. 需要先改好 version 再打包,再 uploadArchives,如果打完包再修改 version,会造成包内版本和 maven 上传版本不匹配的情况,具体步骤见SDK热修复使用文档。

二、接入步骤

接入中有任何问题可参考接入示例项目business_sdk

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.**