AndFix简介
AndFix是一个Android App的在线热补丁框架。使用此框架,我们能够在不重复发版的情况下,在线修改App中的Bug。AndFix就是 “Android Hot-Fix”的缩写。
就目前来说,AndFix支持Android 2.3到6.0版本,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime。
AndFix 的补丁文件是以 .apatch 结尾的文件。
AndFix原理
AndFix的原理很简单。就是针对项目中原有方法的替换取代工作

而我们打一个在线的补丁包,也就有了如下的步骤逻辑:

AndFix 实例
Gradle依赖
dependencies {
compile 'com.alipay.euler:andfix:0.3.1@aar'
}
配置Gradle
由于是进行hot fix,所以生成patch的两个release apk是需要签名的,再次我们需要创建一个临时的签名。这里不讲如何生成安卓签名,生成好签名后,配置签名的到gradle文件中,下面是我建立的一个临时签名
signingConfigs {
debug {
storeFile file('./../test_ks.jks')
storePassword '123456'
keyAlias '123456'
keyPassword '123456'
}
}
代码部分(version1 apk)
在清单文件中添加sdcard的权限,因为apk需要访问patch文件。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
配置一个自定义的Application。
public class AppContext extends Application {
static AppContext instance;
public static AppContext getInstance() {
return instance;
}
PatchManager patchManager;
@Override
public void onCreate() {
super.onCreate();
instance = this;
patchManager = new PatchManager(this);
patchManager.init(BuildConfig.VERSION_NAME);
patchManager.loadPatch();
}
public PatchManager getPatchManager() {
return patchManager;
}
}
写一个界面代码
逻辑是这样的,当点击ActionButton的时候,会弹出一个Snackbar,点击Snackbar上的按钮,会弹出一个Toast。同时界面再启动的时候会在加载一个.apatch文件,如果文件存在,则会添加这个补丁文件。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
String path = "/mnt/sdcard/out.apatch";
if (new File(path).exists()) {
Log.e("Test", "have some patch");
try {
AppContext.getInstance().getPatchManager().addPatch(path);
} catch (Exception e) {
Log.e("Test", "Test", e);
}
} else {
Log.e("Test", "have no patch");
}
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", new View.OnClickListener() {
@Override
public void onClick(View v) {
showToast("11111");
}
}).show();
}
});
}
void showToast(String msg) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}
然后运行程序,会直接在手机上运行,然后我们找到项目的路径中找到app-debug.apk文件,复制出来命名为1.apk。
app/build/outputs/apk/app-debug.apk
代码部分(version2 apk)
修改刚刚界面中代码,修改如下,当点击ActionButton,直接弹出Toast。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
String path = "/mnt/sdcard/out.apatch";
if (new File(path).exists()) {
Log.e("Test", "have some patch");
try {
AppContext.getInstance().getPatchManager().addPatch(path);
} catch (Exception e) {
Log.e("Test", "Test", e);
}
} else {
Log.e("Test", "have no patch");
}
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showToast("2222");
}
});
}
void showToast(String msg) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}
同样运行程序后,复制运行过后的apk文件,命名为2.apk
生成.apatch文件
下载Apatch文件生成工具,然后解压缩,同时刚刚复制出来的2个apk文件,复制到同一个目录下面,还有相对应的签名文件。
运行下面的命令,即可生成一个apatch文件。
./apkpatch.sh -f 2.apk -t 1.apk -o ./ -k test_ks.jks -p 123456 -a 123456 -e 123456
工具的命令文档如下:
usage: apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***> -a,--alias <alias> keystore entry alias. -e,--epassword <***> keystore entry password. -f,--from <loc> new Apk file path. -k,--keystore <loc> keystore path. -n,--name <name> patch name. -o,--out <dir> output dir. -p,--kpassword <***> keystore password. -t,--to <loc> old Apk file path.
我这边生成的apatch文件如下:
2-df8a710835742d3b84c9d9e47ca7f8d2.apatch
重命名为out.apatch
验证
把手机上的运行的卸载,重新安装上1.apk,运行程序,然后通过命令导入out.apatch,再次运行1.apk,发现1.apk+apatch文件运行的效果和2.apk一样。
adb push out.apatch /mnt/sdcard/
总结
我这边只是简单运行了下AndFix,写了一个demo,考虑到实际项目中需求,可以在程序运行的时候,直接向服务器请求补丁文件,如果有文件需要更新,则下载文件,等到文件下载完成后,即可保证bug的修复。
原文来自: http://blog.youkuaiyun.com//guijiaoba/article/details/49936821
本文介绍AndFix热补丁框架的基本原理及其实现过程。AndFix能够实现在不重新发布应用的情况下修复Android App中的Bug。文章通过一个具体示例展示了如何在不同版本的apk之间生成补丁文件并应用这些补丁。
5023

被折叠的 条评论
为什么被折叠?



