美文网首页
NDK 增量更新

NDK 增量更新

作者: Kingsley_Wu | 来源:发表于2017-09-19 01:10 被阅读42次

    处理流程:

    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文件

    • 注:
      模拟器:x86 & x86_64
      真机: armeabi & armeabi-v7a & armeabi-v8a ...
    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行
    • 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
    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
    • xxx 为在代码中写的xxx System.loadLibrary("xxx");
    • xxx_xxx_xxx_xxx.c 为前面生成的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);
    

    相关文章

      网友评论

          本文标题:NDK 增量更新

          本文链接:https://www.haomeiwen.com/subject/mcdisxtx.html