增量更新小记

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

增量更新不同于热修复,从字面意思就知道,他是在原有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架构平台类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

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