bspatch :http://www.daemonology.net/bsdiff/
bzip2: http://www.bzip.org/downloads.html
通过新旧apk通过哈夫曼算法对比,将不同之处生成.patch差分包,客户端下载差分包与旧版本的apk合并新的apk,进行安装。
第一步:创建native方法,javah生成头文件
/**
*
* @param oldApk 旧版apk
* @param newApk 新版apk
* @param patch 差分包路径
* @return
*/
public static native int bspatch(String oldApk, String newApk, String patch);
jni方法
JNIEXPORT jint JNICALL Java_com_xiukun_bspatch_BsPatchUtils_bspatch
(JNIEnv *env, jclass cls,
jstring old, jstring new, jstring patch){
int argc = 4;
char * argv[argc];
argv[0] = “bspatch”;//随意定义
argv[1] = (char*) ((*env)->GetStringUTFChars(env, old, 0));
argv[2] = (char*) ((*env)->GetStringUTFChars(env, new, 0));
argv[3] = (char*) ((*env)->GetStringUTFChars(env, patch, 0));
int ret = patchMethod(argc, argv);
(*env)->ReleaseStringUTFChars(env, old, argv[1]);
(*env)->ReleaseStringUTFChars(env, new, argv[2]);
(*env)->ReleaseStringUTFChars(env, patch, argv[3]);
return ret;
}
第二步:提取apk
public static String getApkPath(Context context){
Context applicationContext = context.getApplicationContext();
ApplicationInfo applicationInfo = applicationContext.getApplicationInfo();
String apkPath = applicationInfo.sourceDir;
return apkPath;
}
除非用户root删除了这个apk,不然都会提取到这个apk;
第三步:合并apk
File destApk = new File(Environment.getExternalStorageDirectory(), “dest.apk”);
File patch = new File(Environment.getExternalStorageDirectory(), “PATCH.patch”);
BsPatchUtils.bspatch(apkPath,destApk.getAbsolutePath(),patch.getAbsolutePath());
if (destApk.exists()){
ApkUtils.installApk(MainActivity.this,destApk.getAbsolutePath());
}else{
Toast.makeText(MainActivity.this, "apk文件不存在", Toast.LENGTH_SHORT).show();
}
到这里就完成了,差分包是在服务器端下载的,这里放在sd里模拟从服务器段下载过程。
源码:https://github.com/luXiuKun/bspatch
生成差分包工具:http://download.csdn.net/download/chedandehuiyi/9940599
使用:打开cmd, lxkdiff.exe 旧版apk名称 新版apk名称 差分包名称