java生成差分文件_Android开发 使用差分算法实现增量更新

本文介绍了如何在Android开发中使用Java和JNI结合bsdiff及bzip2库,实现差分文件的生成与应用,从而进行应用的增量更新。通过编译C语言源码并生成SO库,创建Java接口调用这些方法来完成diff和patch操作。
摘要由CSDN通过智能技术生成

还是老样子先上效果图,由于上传图片限制压缩有点严重凑合看吧:

633c6742672537749d8f2cc055ad935e.gif

首先使用差分算法bsdiff计算出差分包,感兴趣的可以自己点击进去下载源码,然后就是使用bzip2压缩工具打包生成补丁差分包文件和合并补丁包文件;由于这里提供的都是C语言程序所以我们需要借助NDK/JNI实现增量更新了。

我们先去bsdiff地址下载bsdiff.c和bspatch.c这两个文件,然后去bzip2下载源码包解压复制粘贴出我们需要的文件:

bzip2/blocksort.c\

bzip2/bzip2.c\

bzip2/bzip2recover.c\

bzip2/bzlib.c\

bzip2/bzlib.h\

bzip2/bzlib_private.h\

bzip2/compress.c\

bzip2/crctable.c\

bzip2/decompress.c\

bzip2/huffman.c\

bzip2/randtable.c

好了准备工作我们都做好了就开始创建JNI文件吧:

1.创建一个java文件例如:DiffPatchUtil,然后使用命令进入该文件目录下用命令编译“javac DiffPatchUtil.java”生成DiffPatchUtil.class文件,再执行“javah com.xhiston.diffpatch

.DiffPatchUtil”生成com_xhiston_diffpatch_DiffPatchUtil.h文件这一步大家需要注意一下命令目录回退一下到DiffPatchUtil的最外层包名下面不然命令提示找不包名下文件。DiffPatchUtil.java创建的时候可以简单的只放JNI回调的相关方法,生成com_xhiston_diffpatch_DiffPatchUtil.h文件后再修改添加其他方法。

package com.xhiston.diffpatch;

import android.content.Context;

import android.os.Looper;

import android.widget.Toast;

/**

* Created by xie on 2020/10/20.

*/

public class DiffPatchUtil {

static {

System.loadLibrary("diffpatch");

}

/**

* 采用差分算法将当前包与新包打patch补丁包,生成xxx.patch文件

**/

public native int diff(String oldApk, String newApk, String patch);

/**

* 采用差分算法将patch补丁包与当前包合并生成新包,生成apk文件

**/

public native int patch(String oldApk, String newApk, String patch);

}

com_xhiston_diffpatch_DiffPatchUtil.h文件:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_xhiston_diffpatch_DiffPatchUtil */

#ifndef _Included_com_xhiston_diffpatch_DiffPatchUtil

#define _Included_com_xhiston_diffpatch_DiffPatchUtil

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_xhiston_diffpatch_DiffPatchUtil

* Method: diff

* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I

*/

JNIEXPORT jint JNICALL Java_com_xhiston_diffpatch_DiffPatchUtil_diff

(JNIEnv *, jobject, jstring, jstring, jstring);

/*

* Class: com_xhiston_diffpatch_DiffPatchUtil

* Method: patch

* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I

*/

JNIEXPORT jint JNICALL Java_com_xhiston_diffpatch_DiffPatchUtil_patch

(JNIEnv *, jobject, jstring, jstring, jstring);

#ifdef __cplusplus

}

#endif

#endif

2.创建com_xhiston_diffpatch_DiffPatchUtil.c以及JNI配置文件Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

APP_ABI := All

APP_PLATFORM := android-16

LOCAL_C_INCLUDES :=bzip2

LOCAL_MODULE := diffpatch

LOCAL_SRC_FILES := com_xhiston_diffpatch_DiffPatchUtil.h\

com_xhiston_diffpatch_DiffPatchUtil.c\

bspatch.c\

bsdiff.c\

myerr.h\

myerr.c\

bzip2/blocksort.c\

bzip2/bzip2.c\

bzip2/bzip2recover.c\

bzip2/bzlib.c\

bzip2/bzlib.h\

bzip2/bzlib_private.h\

bzip2/compress.c\

bzip2/crctable.c\

bzip2/decompress.c\

bzip2/huffman.c\

bzip2/randtable.c\

include $(BUILD_SHARED_LIBRARY)

修改一下bspatch.c、bsdiff.c里的main方法名然后com_xhiston_diffpatch_DiffPatchUtil中就可以重新调用了,可以参考我的源码进行修改,确保代码无误后便可以ndk-buildd编译生成so库了,当然编译的时候也会检查代码报错的需要自行修改,不过这个就要求大家有一定的C语言基础了,没基础的话可以现学一下不是多难。

3.如果大家不想修改,我这里已经为大家封装成library库了,大家直接下载导入diffpatch库引用一下就可以直接使用了非常简单;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值