之前有跟踪考察过这种热修复技术,这段时间阿里公测了HotFix 特此写这篇集成文档。
第一步 登陆阿里百川 创建应用
第二步 创建项目 引用代码库
当然也可以引用官方jar包,我这里直接引用远程库了。
dependencies {
compile 'com.alibaba.sdk.android.plugins:alisdk-hotfix:1.0.0.3'
compile 'com.alibaba.sdk.android.plugins.jar:alisdk-utdid:0.0.1'
}
第三步 AndroidManifest.xml 中添加配置信息
在“application”节点下添加如下配置:
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="your-app-secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="your-rsa-secret" />
添加权限
<! -- 网络权限 -->
<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.READ_EXTERNAL_STORAGE"/>
画红线的地方替换你的信息。由于现在hotfix是属于公测期间所以需要你申请公测资格
申请完之后就可以在hotfix后台看到你的信息了 比如:appId res密钥 secret信息等
第四步 在你的Application中添加hotfix代码
这个地方不过多介绍了 mAppId需要替换
public class MainApp extends Application {
private String mAppVersion;
private String mAppId = "你的APPID";
@Override
public void onCreate() {
super.onCreate();
try {
mAppVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), ).versionName;
} catch (Exception e) {
this.mAppVersion = "1.0.0";
}
HotFixManager hotFixManager = HotFixManager.getInstance().initialize(this, mAppVersion, mAppId, new NewPatchListener() {
@Override
public void handlePatch(int i) {
Toast.makeText(MainApp.this, "请重启应用进行更新", Toast.LENGTH_LONG).show();
}
});
hotFixManager.queryNewHotPatch();
}
}
第五步 修改代码
打补丁之前的错误代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private int s = ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_hot_fix_test).setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_hot_fix_test:
int i = / s;
Log.w("wzh", "" + i);
Toast.makeText(this, "修复成功", Toast.LENGTH_SHORT).show();
break;
}
}
}
修复bug之后的代码
package com.cehome.hotfixtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private int s = ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_hot_fix_test).setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_hot_fix_test:
if (s == ) {
s = ;
}
int i = / s;
Log.w("wzh", "" + i);
Toast.makeText(this, "修复成功", Toast.LENGTH_SHORT).show();
break;
}
}
}
HotFix要求在原来的代码上编码,注意不要新增Field也不要新增方法,只需要在原来的方法里边修改逻辑解决掉问题即可,例如:
修改前的方法:
public void A(Object a) {
...
a.getXXX();//a对象可能为空,而造成线上crash
}
修改后的方法:
public void A(Object a) {
...
if (a != null) {
a.getXXX();
}
}
将修改后的工程打包apk与修复前apk使用patch工具即可生成patch。
首先,需要声明的是,patch是针对客户端某个版本的,patch需要和版本绑定。
举个例子:
新上线的版本1.0发现了一个bug,表示为bug1
修复一个bug以后基于1.0版本产生patch1,修复1.0版本bug1
过不久又发现一个bug,表示为bug2
此时要在修复bug1的基础上再修复bug2,修复后的APK中应包含bug1和bug2,然后在基于1.0版本产生patch2,去替换之前的patch1。
也就是说,同一个版本中的最新patch总是包含该版本所有的bug修复。客户端一个版本只能对应一个patch。
当你选择升级应用时,当然也必须包含该之前所有的bug修复代码。
第六步 打补丁
java -jar alisdk-hotfix-android-pack-tools.jar PATCH srcAPK fixedAPK outPatch signInfo outLog
参数说明:
srcAPK:填写本地的原始APK(有问题的APK)的本地路径,如果文件找不到会报错
fixedAPK:已经修复过该问题的APK
outPatch:输出patch的路径
signInfo:本地的签名配置属性文件,可选,不输入或者不正确则不做签名
outLog:输出日志的目录,可以不填写,默认为控制台输出
这是我截图:
我的目录结构:
第七步 上传补丁
先打开hotfix后台创建一个版本信息
创建完版本信息之后,点击查看详情上传补丁信息。
上传完补丁之后会看到二维码用测试工具先测试补丁是否可用。
第八部 测试补丁
先下载补丁测试工具 补丁测试工具
先连接应用 然后扫补丁二维码。
如果有任何问题可以加入叮叮群 咨询官方人员
代码混淆
#HotFix
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
-keep class com.alipay.euler.andfix.**{
*;
}
-keep class com.taobao.hotfix.aidl.**{*;}
-keep class com.ta.utdid2.device.**{*;}
-keep class com.taobao.hotfix.HotFixManager{
public *;
}
文档支持更新中。。。
hotfix现在处于公测中,可能还有一些问题。也在持续关注中
官网地址:http://baichuan.taobao.com//product/hotfix.htm?spm=a3c0d.7662652.1998907851.8.JNLdp3