一、官方文档地址
二、集成的简单步骤
1. 去申请开发帐号啥的,和一般三方集成一个样
2. 在build.grale 文件添加: compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.3'
3. 在build.grale 文件添加:
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
4. 在AndroidManifest.xml清单配置:
<!--阿里热修复-->
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="你申请的" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="你申请的" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="你申请的" />
<!--阿里热修复-->
5. 在Application初始化
/**
* Application的基类
*/
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 分包放前面
MultiDex.install(this);
// 必须放这里。初始化,阿里的热修复
initFix();
}
/**
* 1. 初始化
*/
public void initFix() {
// initialize必须放在attachBaseContext最前面,
// 初始化代码直接写在Application类里面,切勿封装到其他类。
SophixManager.getInstance().setContext(this)
.setAppVersion(getVersionName(this))
.setAesKey(null)
.setEnableDebug(false)
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
// 补丁加载回调通知
if (code == PatchStatus.CODE_LOAD_SUCCESS) {
// 表明补丁加载成功
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
// 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀,以此加快应用补丁,详见1.3.2.3
} else {
// 其它错误信息, 查看PatchStatus类说明
}
}
}).initialize();
}
/**
* 获取应用程序版本名称信息
*/
private String getVersionName(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0);
return packageInfo.versionName;
} catch (Exception e) {
}
return "0.0.0";
}
}
三、配置好之后就可以加载补丁了
免费阈值.jpg- 接口调用免费数量有限,单个设备日均量只有20次,所以在处理一下,定义一个管理类来处理20条的问题。
四、定义阿里热修复的管理类
/**
* 阿里热修复加载补丁的管理类
*/
public class FixManager {
public static final String FIX_CONFIG = "FIX_CONFIG";
/**
* 加载的时间
*/
public static final String FIX_TIME = "FIX_TIME";
/**
* 加载的次数
*/
public static final String FIX_COUNT = "FIX_COUNT";
/**
* 2. 查询并加载补丁
*/
public static void queryAndLoadNewPatch(Context context) {
if (context == null) {
return;
}
// 这接口一天不能调用超过20次
SharedPreferences preferences
= context.getSharedPreferences(FIX_CONFIG, Context.MODE_PRIVATE);
String time = preferences.getString(FIX_TIME, "");
// 如果是没有缓存时间,说明是第一次调用
if (TextUtils.isEmpty(time)) {
// 将当前日期存起来
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
// 第一次去加载
loadFixPatch(preferences, date, 1);
} else {
// 就要对比时间了
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
String currentTime = getTime(date);
// 如果日期相等,就要判断加载的次数
int count = preferences.getInt(FIX_COUNT, 1);
// 同一天调用
if (time.equals(currentTime)) {
// 限制次数,如果超出范围就不调用了
if (count < 19) {
count++;
loadFixPatch(preferences, date, count);
}
} else {
// 去加载补丁,并将次数置为1
loadFixPatch(preferences, date, 1);
}
}
}
/**
* 加载补丁并记录次数
*/
private static void loadFixPatch(SharedPreferences preferences, Date date, int count) {
// 这个方法免费一天一个设备调用20次
SophixManager.getInstance().queryAndLoadNewPatch();
// 缓存日期和调用的次数
preferences.edit()
.putString(FIX_TIME, getTime(date))
.putInt(FIX_COUNT, count)
.commit();
}
/**
* 按年月日的时间来缓存日期
*/
public static String getTime(Date date) {
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
return df.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
- 加载补丁的方法: SophixManager.getInstance().queryAndLoadNewPatch();
- 这方法如果同一天同一台设备超过免费数量20次,再调用是要收费的。
- 所以就写了一个管理来控制设备调用的数量,当天超过免费数量,明天再修复咯。
五、下载工具来生成补丁
- 注意事项:新APK的版本号和版本名称都不用改
六、把生成的补丁上传到阿里的管理后台
登录阿里的管理后台.jpg补丁管理.jpg
- 注意事项:添加版本以版本名称来命名。
- 注意AS Instant Run问题,如果Instant Run不关,初始化有时会报错:78 fail to clear cache。
- 添加好补丁版本就可以上传补丁了,然后打开有BUG的APP测试一下有没有修复BUG就行了。
七、注意事项
- 阿里Sophix热修复和支付宝支付的utdid会出现冲突
- 去官网下载一个没有utdid的支付宝支付的SDK即可
-
支付宝SDK官网下载地址
UTDID冲突.jpg
网友评论