Android 带你实现增量更新

文章介绍了如何使用bsdiff和bspatch工具在Windows环境下生成和应用差异文件,以实现Android应用的增量更新,从而节省流量和缩短下载时间。通过将新旧APK文件对比生成差异文件,然后在用户端合并旧APK和差异文件,得到新的APK,实现更新。文章还详细讲述了在Android项目中集成bspatch的步骤,包括修改源码、配置CMakeLists.txt以及创建JNI方法。
摘要由CSDN通过智能技术生成

其实差分不仅可以用于应用增量更新,相反凡是下发的资源,其实都可以利用增量更新来节省流量,降低下载耗时,从而提升用户体验。

目录

前期准备

  1. 工具下载

这里我把需要用到的代码和工具都整理了一下放到了一起:

https://www.aliyundrive.com/s/ALCxbGeWY2o

bzip2:是bsdiff依赖的一个库,这里我只存放了需要用到的文件,完整版的下载地址为:

https://sourceforge.net/projects/bzip2/files/latest/download

bsdiff-win:是编译好的Windows平台下的可执行文件,可以在Windows平台生成差异文件和合并文件。

bsdiff-source:是bsdiff的源码,它的官网为:

http://www.daemonology.net/bsdiff/

  1. 工具的使用方法

只需要在工具所在的目录打开命令行窗口。

然后输入命令即可:

#生成差异文件命令
bsdiff [旧文件] [新文件] [差异文件]
#合并文件命令
bspatch [旧文件] [新文件] [差异文件]

例如我这创建两个文本文件old.txt和new.txt。

然后我可以利用bsdiff命令生成差异文件。

这个时候我再利用bspatch命令,将old.txt和patch文件合成new2.txt。

我们打开new2.txt发现与new.txt是一样的。

原理讲解

实现原理其实就是将新APK文件与旧APK文件进行对比,得出一个差异文件,然后用户端下载这个差异文件与手机上的那个旧APK文件进行合并即可得到与新的APK文件一样的文件,然后再安装这个新APK即可实现增量更新,如下图所示。

具体实现

  1. 集成bspatch到项目

由于Android端只需要合并文件所以我们只需要集成bspatch即可,我们将bsdiff-source/bsdiff-4.3文件夹中的bspatch.c文件拷贝到cpp目录,然后将bzip2文件夹下的文件拷贝到cpp下的bzip(新建的目录)目录下。

此外我们还要对bspatch.c进行修改,我们在文件顶部加入bzip2的引用。

/** 导入bzip2的引用*/
#include "bzip/bzlib.c"
#include "bzip/crctable.c"
#include "bzip/compress.c"
#include "bzip/decompress.c"
#include "bzip/randtable.c"
#include "bzip/blocksort.c"
#include "bzip/huffman.c"

否则的话你运行项目的时候可能会报如下错误:

然后我们还需要新建bspatch.h放到bzip文件夹下,这样做目的是为了可以在native-lib.cpp文件中使用main方法。(注意:这里的main方法并不是入口函数,就是一个执行命令的普通函数)

bspatch.h文件如下:

#ifndef INCREMENTUPDATEDEMO_BSPATCH_H
#define INCREMENTUPDATEDEMO_BSPATCH_H
int main(int argc,char * argv[]);
#endif //INCREMENTUPDATEDEMO_BSPATCH_H

然后在bspatch.c中引入bspatch.h头文件。

接下来我们需要配置下CMakeLists.txt文件将bzip下的c文件和.h头文件链接到项目。

cmake_minimum_required(VERSION 3.10.2)

project("incrementupdatedemo")
#定义一个全局变量包含了所有要编译的C文件
file(GLOB BZIP bzip/*.c)
#导入头文件
include_directories(bzip)
add_library( # Sets the name of the library.
             native-lib
             SHARED
             native-lib.cpp
             #将bzip下的.c文件添加到library
             BZIP)
find_library( # Sets the name of the path variable.
              log-lib
              log )
target_link_libraries( # Specifies the target library.
                       native-lib
                       ${log-lib} )

2. 创建JNI方法

创建PatchUtil工具类,创建合并文件的JNI方法。

public class PatchUtil {
    static {
        System.loadLibrary("native-lib");
    }
    /**
     * 合并APK文件
     * @param oldApkFile 旧APK文件路径
     * @param newApkFile 新APK文件路径(存储生成的APK的路径)
     * @param patchFile 差异文件
     */
    public native static void patchAPK(String oldApkFile,String newApkFile,String patchFile);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金戈鐡馬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值