andfix 热补丁修复
背景:
我们知道Android在发布新版本后如果发现某个方法有bug时native app是不能像webapp让用户无感知的实现更新代码的,我们必须要提醒用户下载新版本;在这种情况下我们就会希望有一种方法可以实现app的在线热修复;
很多大牛都提到过多种热修复的方法:
1. https://github.com/alibaba/AndFix
2. https://github.com/alibaba/dexposed
3. https://github.com/jasonross/Nuwa
4. https://github.com/bunnyblue/DroidFix
5. https://github.com/dodola/HotFix
他们的原理都来自于安卓App热补丁动态修复技术介绍,以及Android dex分包方案;有兴趣的朋友大家都去看看吧;
第一个和第二个都是Alibaba的开源框架,其他的我也没怎么了解,哈哈哈。。。
这里主要说下AndFix的使用方式,及具体的demo,很多原理性的东西大家自己去看,我可不能误人子弟啊。。。。。
andfix具体使用(androidstudio)
eclipse的朋友可以下载项目然后引用就可以了(类似于方法1)
一:两种引用方式:
- 从https://github.com/alibaba/AndFix下载andfix项目,新建Androidstudio项目将andfix作为 module引用就可以
- 在build.gradle文件中引用
compile ‘com.alipay.euler:andfix:0.3.1’
二:导入so文件
建立jniLibs文件夹将相应的so文件导入进去如图:
三:代码实现
- 在application中初始化:
package com.android.shub.andfixtest;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.util.Log;
import com.alipay.euler.andfix.patch.PatchManager;
import java.io.IOException;
/**
* Created by shubing on 2016/3/15.
*/
public class MyApplication extends Application {
private PatchManager mPatchManager;
private static final String APATCH_PATH = "/output.apatch";
private static final String DIR = "apatch";//补丁文件夹
@Override
public void onCreate() {
super.onCreate();
mPatchManager = new PatchManager(this);
mPatchManager.init("1.0");
mPatchManager.loadPatch();
String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
Log.e("测试hotFix-------->", "补丁文件领:“" + patchFileString + "”");
try {
//添加下载的补丁包路径
mPatchManager.addPatch(patchFileString);
//加载完补丁后删除补丁,否则有新补丁将不会生效哦
mPatchManager.removeAllPatch();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取应用信息
*
* @param context
* @return
*/
public static PackageInfo getPackageInfo(Context context) {
PackageInfo packageInfo = null;
try {
packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return packageInfo;
}
}
MainActivity就简单了,就两个toast方法,原先的包就一个toast方法,修改后增加一个toast,先后生成两个apk
package com.android.shub.andfixtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showToast();
// showToastNew();
}
private void showToast() {
Toast.makeText(this, "第一个TOAST", Toast.LENGTH_SHORT).show();
}
private void showToastNew() {
Toast.makeText(this, "第二个TOAST!", Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
四:生成补丁包
用apkpatch 工具对以上两个新老apk生成补丁包;apkpatch下载点这里
githtb上也是有的,我这里把它传上去了,下载完解压,打开cmd命令行,cd到apkpatch.bat所在的目录:
具体命令可以参考github上,这里我引用下来:
apkpatch -f ‘新apk路径’ -t‘ 旧apk的路径’ -o ‘生成的补丁包的输出目录’ -k‘ 打包签名的keystore文件路径’ -p ‘签名文件密码’ -a‘ keystore别名’ -e ’keyStore entry的密码‘
(输命令的时候单引号不要哦!!)
命令输好后执行就生成了相应的补丁包了,将补丁包重命名成MyApplication中定义的output.apatch放到MyApplication中指定好的路径下就可以了
注意:Application的oncreate方法、xml绑定的方法、构造方法不能修复
总结:
至此andfix的使用就全部完了,用起来还是挺简单的,原理还是值得深究
demo下载地址:http://download.csdn.net/detail/shubing521/9512028