處理流程:
- 將應用的舊版本Apk與新版本Apk做差分,得到差分包(更新補丁) xxx.datch;
- 在用戶下載了差分包后,在手機端組合起來;
- 校驗新合成的Apk文件是否完整,MD5或SHA1是否正確,正確則引導用戶安裝
工具
- 服務器端: 利用bsdiff得到差分包(更新補丁)
cmd命令格式:
file.../bsdiff 舊版本apk包 新版本apk包 差分包.patch - 電腦:
cmd命令格式:
file.../bspatch 舊版本apk包 新版本apk包 差分包.patch - 手機端: 利用JNI合成完整apk
1. 生成so文件
- 注:
模擬器:x86 & x86_64
真機: armeabi & armeabi-v7a & armeabi-v8a ...
- 在GitHub找到SmartAppUpdates,在ApkPatchLibrary/jni 目錄下獲得c代碼;
https://github.com/cundong/SmartAppUpdates - 在代碼中定義native方法,
public class PatchUtils {
static {
System.loadLibrary("xxx"); //加載生成的so文件
}
public static native int patch(String oldApkPath,String newApkPath,String patchPath);
}
通過javah命令生成相應的.h文件
cmd命令格式:file.../javah 包名.xxx (xxx需為.class文件)
- 生成相應的c文件,把ApkPatchLibrary/jin目錄下獲得c文件進行修改:
文件名稱修改 com_cundong_utils_PatchUtils.c
修改為 xxx_xxx_xxx_xxx.c
需修改xxx_xxx_xxx_xxx .c文件夾內的
18行
- include "com_cundong_utils_PatchUtils.h"
改為相對應的 include "xxx_xxx_xxx_xxx.h"
199行 - jint JNICALL Java_com_cundong_utils_PatchUtils_patch
改為xxx_xxx_xxx_xxx.h中15行中相對應的 jint JNICALL xxx_xxx_xxx_xxx_patch
- 修改 Android.mk文件
把:
LOCAL_MODULE := ApkPatchLibrary
LOCAL_SRC_FILES := com_cundong_utils_PatchUtils.c
修改為:
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := xxx_xxx_xxx_xxx.c
- xxx 為在代碼中寫的xxx System.loadLibrary("xxx");
- xxx_xxx_xxx_xxx.c 為前面生成的xxx_xxx_xxx_xxx.c文件名
- 使用NDK生成so文件
smd命令格式:
file.../ndk-build
2. 使用JNI(Android Studio 2.3.3)
- 把xxx.so連同父文件夾復制到項目main目錄下的jniLibs下 ,然后build項目;
image.png
把舊版本apk和差分包放到sd卡中:
現即可在項目中調用之前代碼中的native方法了
String oldApkPath = Environment.getExternalStorageDirectory()+"/patchdemo/patchdemo_1.apk";
String newApkPath = Environment.getExternalStorageDirectory()+"/patchdemo/patchdemo_2.apk";
String patchPath = Environment.getExternalStorageDirectory()+"/patchdemo/patchdemo.patch";
//result為0則為成功,否則為失敗
int result = PatchUtils.patch(oldApkPath,newApkPath,patchPath);