NDK 增量更新

2017-09-19  本文已影响42人  Kingsley_Wu

处理流程:

  1. 将应用的旧版本Apk与新版本Apk做差分,得到差分包(更新补丁) xxx.datch;
  2. 在用户下载了差分包后,在手机端组合起来;
  3. 校验新合成的Apk文件是否完整,MD5或SHA1是否正确,正确则引导用户安装

工具

  1. 服务器端: 利用bsdiff得到差分包(更新补丁)
    cmd命令格式:
    file.../bsdiff 旧版本apk包 新版本apk包 差分包.patch
  2. 电脑:
    cmd命令格式:
    file.../bspatch 旧版本apk包 新版本apk包 差分包.patch
  3. 手机端: 利用JNI合成完整apk

1. 生成so文件

  1. 在GitHub找到SmartAppUpdates,在ApkPatchLibrary/jni 目录下获得c代码;
    https://github.com/cundong/SmartAppUpdates
  2. 在代码中定义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文件)

  1. 生成相应的c文件,把ApkPatchLibrary/jin目录下获得c文件进行修改:
    文件名称修改 com_cundong_utils_PatchUtils.c
    修改为 xxx_xxx_xxx_xxx.c
    需修改xxx_xxx_xxx_xxx .c文件夹内的
    18行
  1. 修改 Android.mk文件
    把:
    LOCAL_MODULE := ApkPatchLibrary
    LOCAL_SRC_FILES := com_cundong_utils_PatchUtils.c
    修改为:
    LOCAL_MODULE := xxx
    LOCAL_SRC_FILES := xxx_xxx_xxx_xxx.c
  1. 使用NDK生成so文件
    smd命令格式:
    file.../ndk-build

2. 使用JNI(Android Studio 2.3.3)

  1. 把xxx.so连同父文件夹复制到项目main目录下的jniLibs下 ,然后build项目;
image.png
  1. 把旧版本apk和差分包放到sd卡中:

  2. 现即可在项目中调用之前代码中的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);
上一篇 下一篇

猜你喜欢

热点阅读