目录
一。我的开发环境
二。集成shiply热更新sdk
三。编写代码
1。创建一个CustomRFixLog类
2。创建一个MyApplication类
3。配置AndroidManifest.xml
4。创建一个新的Activity继承AbsRFixDevActivity 用于测试
四。登录shiply后台配置
1。创建项目
五。制作补丁
1。在app下的build.gradle添加代码
2。创建签名,配置签名
3。点击右边assembleRelease打包
4。获取app-release.apk和R.txt
5。添加一些测试代码
6。点击RFixBuildRelease
六。配置补丁
1。先点击热修设置,配置审核员,要不然后面发审不了
2。再返回,新建热修发布
3。创建成功后,并还未能正常使用,需要发布审核,点击详情进入
4。添加体验账号,为你初始化时配置的
5。发布审批
6。审批通过时,返回显示,灰度中,就表示完成了
七。测试app
1。安装旧版old.apk测试
2。运行测试
3。一些补丁升级原因
八。总结
一。我的开发环境
idea: Android Studio Chipmunk | 2021.2.1 Patch 2 August 3, 2022
jdk: 11
gradle: gradle-7.3.3-bin.zip
GAP: 7.2.2 (shiply目前只支持3.5~7.4)
二。集成shiply热更新sdk
文档地址:https://shiply.tds.qq.com/docs/doc?id=4010667110
提示(文档里前面集成shiplySDK步骤 我就不 教了,无非就是版本 兼容 问题,这里尤其注意 SDK 版本 和 GAP 版本,否则后面运行会报错,所以我建议用老版本IDEA去创建项目,新版结构改起来会头痛,因为androidX的相关框架版本也要改,如果你不接受不了 改版本,我建议 放弃 热更新 方案,因为 安卓 目前更新换代太快了,热更新 在版本兼容 问题 永远是 头痛问题,还是普通更新就行了,但是多学点东西不会吃亏,虽然目前不实用,但是说不定也能帮上点忙,此博客重点教一下大家如何制作补丁,因为文档里可能不是很清晰)
三。编写代码
1。创建一个CustomRFixLog类
代码如下
import com.tencent.rfix.loader.log.IRFixLog;
public class CustomRFixLog implements IRFixLog {
@Override
public void v(String s, String s1) {
}
@Override
public void d(String s, String s1) {
}
@Override
public void i(String s, String s1) {
}
@Override
public void w(String s, String s1) {
}
@Override
public void w(String s, String s1, Throwable throwable) {
}
@Override
public void e(String s, String s1) {
}
@Override
public void e(String s, String s1, Throwable throwable) {
}
}
2。创建一个MyApplication类
代码如下
import android.app.Application;
import android.content.Context;
import android.os.Build;
import com.tencent.rfix.anno.ApplicationProxy;
import com.tencent.rfix.entry.DefaultRFixApplicationLike;
import com.tencent.rfix.entry.RFixApplicationLike;
import com.tencent.rfix.lib.RFixInitializer;
import com.tencent.rfix.lib.RFixParams;
import com.tencent.rfix.loader.log.RFixLog;
@ApplicationProxy(application = ".SampleProxyApplication")
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 1. 初始化日志接口
RFixLog.setLogImpl(new CustomRFixLog());
// 2. 构造RFix业务参数
// appId和appKey在RFix发布平台注册应用时获得
final String appId = "...";
final String appKey = "...";
RFixParams params = new RFixParams(appId, appKey)
.setDeviceId("000000") // 设置业务使用的设备ID,方便进行数据统计(如:QIMEI等)
.setDeviceManufacturer(Build.MANUFACTURER) // 设置设备厂商,用于下发规则控制
.setDeviceModel(Build.MODEL) // 设置设备型号,用于下发规则控制
.setUserId("123456") // 设置用户ID,用于下发规则控制
.setCustomProperty("property1", "xxx");// 设置自定义属性,用于扩展下发规则控制
// 3. 初始化RFix组件
RFixApplicationLike applicationLike = DefaultRFixApplicationLike.createApplicationLike(this);
RFixInitializer.initialize(applicationLike, params);
}
}
3。配置AndroidManifest.xml
在AndroidManifest.xml里加上application标签下加android:name=".SampleProxyApplication",还要记得配置网络权限和读写权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4。创建一个新的Activity继承AbsRFixDevActivity 用于测试
四。登录shiply后台配置
1。创建项目
获取到app id和app key,填到MyApplication的RFixParams初始化里
五。制作补丁
1。在app下的build.gradle添加代码
// RFix插件
apply plugin: 'com.tencent.rfix'
// RFix插件的配置
RFixPatch {
// 补丁类型:Disable/Tinker
patchType = 'Tinker'
// 原始Apk
oldApks = ["${projectDir.absolutePath}/RFix/old.apk"]
// 修复Apk
newApks = ["${projectDir.absolutePath}/RFix/new.apk"]
// 补丁输出目录
outputFolder = "${projectDir.absolutePath}/RFix/"
buildConfig {
// 补丁唯一ID,用于识别补丁和版本是否匹配
patchId = new Date().format("MMddHHmmss")
// 原始Apk的混淆文件
applyMapping = "${projectDir.absolutePath}/RFix/mapping.txt"
applyResourceMapping = "${projectDir.absolutePath}/RFix/R.txt"
// 使用splits实现多架构编译时需要开启该功能,以确保每个Apk的PatchId不同
appendOutputNameToPatchId = true
// 开启多架构补丁包独立打包功能
enablePackageSeparate = false
// 应用是否开启了加固
isProtectedApp = false
}
}
提示 : 制作shiply热更新补丁 必须要有 签名
2。创建签名,配置签名
3。点击右边assembleRelease打包
会发现左边outputs下app-release.apk
4。获取app-release.apk和R.txt
把app-release.apk,copy到RFix文件夹里(RFix文件夹需要自己手动创建,放在项目的app目录里面),改名为old.apk,表示是旧的apk
还要把 intermediates下的 runtime_symbol_list 的 R.txt,这个也要放到RFix里
提示 (R.txt文件可能因为GAP版本不一样,不一定百分百在 runtime_symbol_list 文件夹里,可能在其他文件夹里;如果你混淆了,还要把mapping.xml放到RFix里,由于我没混淆,所以不用放mapping.xml)
5。添加一些测试代码
然后在继承AbsRFixDevActivity的Act添加一条日志输出,用于测试,然后再点击assembleRelease,把生成的app-release.apk,改名为new.apk放到RFix里,表示是修改好bug的新包
6。点击RFixBuildRelease
找到如图下,双击RFixBuildRelease,运行成功会在RFix下生成一个文件,里面有一个 已签名的 文件,就是我们要的补丁
六。配置补丁
1。先点击热修设置,配置审核员,要不然后面发审不了
2。再返回,新建热修发布
提示 (修复版本是版本名versionName,不是版本号)
3。创建成功后,并还未能正常使用,需要发布审核,点击详情进入
4。添加体验账号,为你初始化时配置的
5。发布审批
6。审批通过时,返回显示,灰度中,就表示完成了
七。测试app
1。安装旧版old.apk测试
可以用adb安装,进入RFix文件夹下,CMD命令 adb install old.apk
2。运行测试
点击请求配置,再点击重启应用,如果结果和我图运行效果差不多,表示成功。
并且刷新一下Android studio日志,看一下log是否输出前面打入的日志,如果输出,表示补丁升级成功
3。一些补丁升级原因
如果 补丁下载失败,请看是否有网络,或者网络权限
如果 补丁安装失败,请看是否版本名,应用名称,old的签名和new签名是否一致,UserId是否配置,appid是否配置成功。
如果下载成功,安装补丁失败,建议重新 走一遍 制作补丁流程,重新发布。(可能是缓存问题,或者R.txt缓存的原因,建议在没生成old.apk前,清理一下clear build,生成完后,copy到rfix里之后,在生成new.apk之前,把前面build里生成的apk删一下,保持一定不是缓存的apk,这样可以保持 流程的 严谨性。)
八。总结
此热更新框架优缺点也明显,优点我不说了,缺点有个很明显的问题就是 框架 版本兼容性问题,高版本SDK集成不了此框架,还有高GAP同样集成不了,导致创建项目的时候,要用老的项目结构 去 兼容,新版AS Gradle8.4.X 集成很麻烦,而且会有版本兼容问题,而且 也不 能 保障 安卓15 是否可以 热更新成功,还是要 手动去更新。