阿里热修复AndFix的使用和注意事项
前言
这段时间项目的问题比较多,公司就有了热修复的想法,于是就测试了阿里和微信的,发现阿里的集成过程很便捷。于是就决定就用它啦。
1. 准备工作
1.1 浏览官方文档
点击查看AndFix文档
这边简单引用一些官方内容。
- AndFix is a solution to fix the bugs online instead of redistributing Android App.
译: AndFix解决在线修复bug,不用再去发布版本了。- AndFix supports Android version from 2.3 to 7.0, both ARM and X86 architecture, both Dalvik and ART runtime, both 32bit and 64bit.
译: AndFix支持安卓版本2.3到7.0,ARM,X86,Dalvik ,ART,32bit and 64bit。- The implementation principle of AndFix is method body’s replacing.
译: AndFix的实现原理是方法的替换- 总结
看到这里大家有清楚了修复的概念,方法的替换,前提是方法,也就是布局文件,实体类暂定,(估计不行)
1.2 工具下载
就在官方文档里边,找到这个。
2. 依赖
compile 'com.alipay.euler:andfix:0.5.0@aar'
3. 代码
简单描述一下代码,在Application 中做初始化,两个按钮,一个做打补丁,一个弹吐司,还有一个textview,做修改布局测试
public class MainApplication extends Application {
public static PatchManager mPatchManager;
@Override
public void onCreate() {
super.onCreate();
// 初始化patch管理类
mPatchManager = new PatchManager(this);
// 初始化patch版本,这边版本和当前版本一致
mPatchManager.init("1.0");
// 加载已经添加到PatchManager中的patch
mPatchManager.loadPatch();
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//添加patch,只需指定patch的路径即可,补丁会立即生效
String storageDir = Environment.getExternalStorageDirectory() + "/AndFix";
File dir = new File(storageDir);
if (!dir.exists()) {
dir.mkdir();
} else {
System.out.println(dir.getAbsolutePath());
}
String path = storageDir+"/fix.apatch";
try {
MainApplication.mPatchManager.addPatch(path);
} catch (IOException e) {
e.printStackTrace();
}
}
});
Button bt_toast = (Button) findViewById(R.id.toast);
bt_toast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"打补丁后",Toast.LENGTH_SHORT).show();
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.yp.andfixdemo.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hou!"/>
<Button
android:id="@+id/button"
android:text="补丁"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/toast"
android:text="toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
4. 生成补丁
操作说明:
- 安装好当前软件
- 生成apk文件,改名old.apk
- 修改toast内容,比如“修改前”,“修改后”
- 修改textview默认,比如qian,hou
- 生成apk文件,改名new.apk
- 做好这些就到之前下载的工具,解压zip文件
将两个apk,和打包用的keystore文件到放在里面
output文件就是我们后面生成的了
在当前位置打开命令行,输入apkpatch.bat -f new.apk -t old.apk -o output -k debug.keystore -p android -a androiddebugkey -e android
解释:对应文件夹中的文件,相信大家,已经很明白了,下面简单说明,
命令行apkpatch.bat
-f 最新的apk
-t 上次发布的apk
-o 生成文件位置
-k 项目用的keystore
-p keystore password(后三项可参考AS打包时Generate SignedApk)
-a key alias 别名
-e key password5.测试
正常的项目使用,当然会用到推送,或者登录实时请求网络等方式,强制打补丁,或者提示等方式啦。在这里为了验证,当然这个例子都是官方提供的,感觉也没什么问题。大概就是自己在Sd卡里建一个文件夹,把修改了名称的补丁,放在里面,然后打开旧版的Apk,点击补丁按钮,再点击Toast,发现内容变化了。但是TextView默认没有变化。在代码中写textView.setText(“变化”),这种方式也就能改变了。
6.测试结果
6.注意事项
凡事都要谨慎,打完补丁,也是需要先测试的,所以你会发现一些问题,为什么没效果,或者直接报错了。一般有几种可能,一个是上面操作中哪一步做错了,另一个就是不支持这么操作咯,注意热修复只修复方法,像数据库加个字段,就别想了,直接发布版本吧。修改界面,如果能代码实现,那也是没问题的。