增量更新小记

感觉还是有必要记一下。容易忘记的人。

增量更新不同于热修复,从字面意思就知道,他是在原有apk的基础上做一个增加的。常用于版本的迭代,他可以大大节省用户的流量。

and.....。

增量更新关键在于生成补丁包。(最难的这个已经有工具替我们实现了),然后就是将原来的apk和补丁包合成生成新的apk。

windows 系统下要获取bsdiff.exe 和bspatch.exe 还是比较麻烦的。(我是网上直接拿了两个已经生成好的可执行文件),当然生成补丁包还是放在服务端的,客户端要做的就是将服务端的补丁包下载下来,然后合成新的apk。

--------------------------------------------------分割----------------------------------------------------------

我这边就简单记入如何生成用于合成补丁的so 库。

1.studio 的ndk环境配置。(下载,配置环境变量)

2在 gradle.properties 中加入 android.useDeprecatedNdk=true

3.在新建的项目中新建一个包含native 方法的类。(build一下)

public class PatchUtils {
    static {
        System.loadLibrary("自定义库名");
    }
    public static native int patch(String oldApkPath, String newApkPath, String patchPath);
}

4.现在我们需要去生成一个.h文件,关联对应的native方法。(可以通过命令行,这边用另外一种)
在setting-->Tools-->External tool--> "+" 中配置两个命令。

5.1 javah($JdkPath$ 这个替代符可以在右侧insert macro... 进行选择。)

1499485207(1).jpg

5.2 ndk-build 的配置


1499485434(1).jpg

6 在main 目录下新建一个jni文件夹,然后右键含有native方法的类,选择External tool,执行javah命令(注意先Build),可以看到在jni 文件夹中生成了一个.h的头文件。

Paste_Image.png

接下来就是合成,(合成的关键还是用到原来bsdiff 工具中的c代码)我们可以直接拷贝过来用。将其中bzip2文件夹拷贝到jni中,留下文件夹中的.c .h文件。

Paste_Image.png

在拷贝bspatch.c,引入刚刚生成的.h文件并实现他的方法体。(将该c文件中的main方法修改为applypatch)。

JNIEXPORT jint JNICALL Java_com_yang_patchtest_PatchUtils_patch(JNIEnv *env,
                                                               jobject obj, jstring old, jstring new, jstring patch) {
    char * ch[4];
    ch[0] = "bspatch";
    ch[1] = (char*) ((*env)->GetStringUTFChars(env, old, 0));
    ch[2] = (char*) ((*env)->GetStringUTFChars(env, new, 0));
    ch[3] = (char*) ((*env)->GetStringUTFChars(env, patch, 0));
    
    int ret = applypatch(4, ch);
    
    (*env)->ReleaseStringUTFChars(env, old, ch[1]);
    (*env)->ReleaseStringUTFChars(env, new, ch[2]);
    (*env)->ReleaseStringUTFChars(env, patch, ch[3]);

    return ret;
}

创建android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE     := patchLib
LOCAL_SRC_FILES  := bspatch.c


include $(BUILD_SHARED_LIBRARY)
  1. 右键jni文件夹External tool 执行ndk-build 命令,可以看到在libs 中生成我们的so文件。而这些so库,即可用于我们客户端的补丁合成了。
Paste_Image.png

至此so库已经生成,那么我删掉jni文件夹,便可以直接调用上面的native方法生成新的apk。

-----------------------------------------------分割----------------------------------------------------------

那假如我想把上面生成好的so 库用到其他的app中呢:

我直接引用so 库的话是不行的(当然要是包名、类名以及方法名都一样的话,就不说了)

这个过程和上面也是有点类似。

1 .前面5步骤都是一样的。
2 .将需要的 so 文件以及对应的.h文件(可有可无,只要知道方法名即可) 拷贝到jni下的新建patches文件夹下。

Paste_Image.png

2 再新建一个.c文件。 调用的so 库中的方法

#include "patches/include/com_yang_patchtest_PatchUtils.h"
#include "com_yang_mypatch_PatchUtils.h"

JNIEXPORT jint JNICALL Java_com_yang_mypatch_PatchUtils_toPatch(JNIEnv *env,
                                                               jobject obj, jstring old, jstring new, jstring patch) {
    return Java_com_yang_patchtest_PatchUtils_patch(env,obj,old,new,patch);
}

3 创建android.mk 和application.mk

android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := patchLib
LOCAL_SRC_FILES := patches/libpatchLib.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/patches/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := mypatches
LOCAL_SRC_FILES := mytest.c
LOCAL_SHARED_LIBRARIES := patchLib
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

application.mk

APP_STL:=gnustl_static
APP_CPPFLAGS:=-frtti -fexceptions
APP_ABI := armeabi

一般开发中只需要armeabi即可,当然上面的so 库也是armeabi的。

4.执行前面讲过的ndk-build 命令可以看到生成2 个so 库。

Paste_Image.png

5.删掉jni文件夹,就可以直接使用so 了 (libs 要转到app 下一级,gradle 要指定jniLibs。android studio 默认是jniLibs)

关于mk文件的几个重要参数:

LOCAL_MODULE:模块名称。
LOCAL_SRC_FILES:参与编译的源文件
APP_ABI:cpu架构平台类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,272评论 25 709
  • 一、NDK产生的背景 Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于J...
    Ten_Minutes阅读 8,974评论 1 27
  • 1.概述 1.1.什么是应用增量更新 当我们要更新一个应用的时候,以前很多更新的做法是下载一个新版本去覆盖一个旧版...
    揚灵阅读 8,715评论 8 19
  • Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI...
    AlphaGL阅读 9,177评论 0 24
  • 慵懒的午后 泡一杯香茗 坐在树荫深处 静静的守着岁月 看云水流转、光影摇曳 随和风物语、时光倒流 让自己完全释放 ...
    翦梦阅读 2,498评论 10 12

友情链接更多精彩内容