java 实现 apk 拆分 合并 import java.io.File;import com.nothome.delta.Delta;import com.nothome.delta.GDiffPatcher;public class AndroidApkUtils {/** * 生成差分包:old_new.patch = diff(old.apk, new.apk) * * */ public static byte[]
import java.io.File;
import com.nothome.delta.Delta;
import com.nothome.delta.GDiffPatcher;
public class AndroidApkUtils {
/**
* 生成差分包:old_new.patch = diff(old.apk, new.apk)
*
* */
public static byte[] createPatch(byte source[], byte target[]) {
byte [] fs = null;
try {
Delta d = new Delta();
fs = d.compute(source, target);
}
catch (Exception e) {
e.printStackTrace();
}
return fs;
}
public static void createPatch(byte source[], byte target[], String patchPath, String patchName) {
try {
Delta d = new Delta();
byte [] fs = d.compute(source, target);
FileUtils.getFile(fs, patchPath, patchName);
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 合成差分包:new.apk = old.apk + old_new.patch
*
* */
public static File mergeFile(String source, String patch, String target) throws Exception {
GDiffPatcher patcher = new GDiffPatcher();
File deffFile = new File(patch);
File updatedFile = new File(target);
patcher.patch(new File(source), deffFile, updatedFile);
return updatedFile;
}
public static File mergeApk(String source, String patch, String target, String newApkMd5) throws Exception {
File updateFile = mergeFile(source, patch, target);
String ufpMd5 = FileMD5Utils.getFileMD5(updateFile);
System.out.println("服务端下发的md5:" + newApkMd5 + ",新合并后的apk MD5:" + ufpMd5);
if (ufpMd5 == null || !newApkMd5.equalsIgnoreCase(ufpMd5)) {
if (updateFile.exists()) {
updateFile.delete();
}
throw new Exception("MD5错误,不能成功合并!");
}
return updateFile;
}
}
