主要有三种途径
一、QQ空间超级补丁技术(优先加载补丁内的class文件)
超级补丁技术基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。
目前,没有试用过,以后再说。
二、阿里andFix
优点:bug修复即时性。
补丁包采用差量技术,生成的PATCH体积小。
对应用无侵入,几乎无性能损耗。
缺点:不支持新增字段,以及修改<init>方法,也不支持对资源的替换。
由于厂商的自定义ROM,对少数机型暂不支持。(我的三星j3300就不支持)
首先 添加依赖
compile 'com.alipay.euler:andfix:0.3.1@aar'
(1)minifest.xml权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
(2)application里加载补丁
private static final String TAG = "euler";
private static final String APATCH_PATH = "/out.apatch";
static String DIR="apatch";
/**
* patch manager
*/
private PatchManager mPatchManager;
@Override
public void onCreate() {
super.onCreate();
// initialize
mPatchManager = new PatchManager(this);
String appversion=getPackageManager().getPackageInfo(getPackageName(),0).versionName;
mPatchManager.init(appversion);
mPatchManager.loadPatch();
try {
String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
File result = new File(patchFileString);
if(result.exists()){
mPatchManager.addPatch(patchFileString);
File f = new File(this.getFilesDir(),DIR + APATCH_PATH);
if (f.exists()) {
new File(patchFileString).delete();
}
}
} catch (IOException e) {
Log.e(TAG,"addPatch-->"+e.getMessage());
}
}
(3)生成补丁文件,下载apkpatch-1.0.3,将密钥和修改bug前后的两个包(new-app,old-app)放进去,cmd-进入文件夹路径,输入以下命令,生成output文件夹,打开找到.apatch文件,重命名成out.apatch,发送到手机上,先杀死进程,重新打开就好了。
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.