目录:
Android增量更新(一)-差分文件(Windows-part1)
Android增量更新(二)-差分文件(Windows-part2)-dll动态库和jar包
Android增量更新(三)-差分文件(Linux)-生成jar和.so库
Windows平台上的增量更新差分文件用了2篇博客来介绍,现在介绍Linux平台的就比较简单了,话不多说直接开始。
一、直接编译成可执行文件
1.1、解压bsdiff源文件(bsdiff-4.3.tar.gz)
tar -xzvf bsdiff-4.3.tar.gz
1.2、由于Linux有bzip2的库,先安装bzip2
sudo apt-get install libbz2-dev
gcc bsdiff.c -lbz2 -o bsdiff
1.4、测试程序是否正确
./bsdiff app_old1.apk app_new1.apk app_patch1.patch

成功生成了.patch文件。
二、添加Java本地调用方法
2.1、创建包含native方法的类:BsDiffYwl5320Util.java,包名为:com.ywl5320.bsdiff
- package com.ywl5320.bsdiff;
- /**
- * Created by ywl on 2017-10-23.
- */
- public class BsDiffYwl5320Util {
- private static BsDiffYwl5320Util instance = new BsDiffYwl5320Util();
- public BsDiffYwl5320Util(){}
- public static BsDiffYwl5320Util getInstance()
- {
- return instance;
- }
- static
- {
- System.loadLibrary("BsDiffYwl5320");
- }
- public native int bsDiffFile(String oldFile, String newFile, String patchFile);
- }
package com.ywl5320.bsdiff;
/**
* Created by ywl on 2017-10-23.
*/
public class BsDiffYwl5320Util {
private static BsDiffYwl5320Util instance = new BsDiffYwl5320Util();
public BsDiffYwl5320Util(){}
public static BsDiffYwl5320Util getInstance()
{
return instance;
}
static
{
System.loadLibrary("BsDiffYwl5320");
}
public native int bsDiffFile(String oldFile, String newFile, String patchFile);
}
javac com/ywl5320/bsdiff/BsDiffYwl5320Util.java
javah com.ywl5320.bsdiff.BsDiffYwl5320Util
2.3、修改bsdiff.c并编译成.so
2.3.1、导入Java中的jni.h和jni_md.h
2.3.2、bsdiff.c中添加com_ywl5320_bsdiff_BsDiffYwl5320Util.h头文件,并把它们中的#include <jni.h> 改成#include “jni.h”
2.3.3、bsdiff.c中实现native方法,因为是c语言的,所以需要用:(*env)->**** 调用方法
- JNIEXPORT jint JNICALL Java_com_ywl5320_bsdiff_BsDiffYwl5320Util_bsDiffFile
- (JNIEnv *env, jobject jobj, jstring joldfile, jstring jnewfile, jstring jpatchfile)
- {
- int restlt = -1;
- int argc = 4;
- char *argv[4];
- char *oldPath = (char*)(*env)->GetStringUTFChars(env, joldfile, NULL);
- char *newpath = (char*)(*env)->GetStringUTFChars(env, jnewfile, NULL);
- char *patchPath = (char*)(*env)->GetStringUTFChars(env, jpatchfile, NULL);
- argv[0] = "bsdiff_ywl5320";
- argv[1] = oldPath;
- argv[2] = newpath;
- argv[3] = patchPath;
- restlt = bsdiff_main(argc, argv);
- (*env)->ReleaseStringUTFChars(env, joldfile, oldPath);
- (*env)->ReleaseStringUTFChars(env, jnewfile, newpath);
- (*env)->ReleaseStringUTFChars(env, jpatchfile, patchPath);
- return restlt;
- }
JNIEXPORT jint JNICALL Java_com_ywl5320_bsdiff_BsDiffYwl5320Util_bsDiffFile
(JNIEnv *env, jobject jobj, jstring joldfile, jstring jnewfile, jstring jpatchfile)
{
int restlt = -1;
int argc = 4;
char *argv[4];
char *oldPath = (char*)(*env)->GetStringUTFChars(env, joldfile, NULL);
char *newpath = (char*)(*env)->GetStringUTFChars(env, jnewfile, NULL);
char *patchPath = (char*)(*env)->GetStringUTFChars(env, jpatchfile, NULL);
argv[0] = "bsdiff_ywl5320";
argv[1] = oldPath;
argv[2] = newpath;
argv[3] = patchPath;
restlt = bsdiff_main(argc, argv);
(*env)->ReleaseStringUTFChars(env, joldfile, oldPath);
(*env)->ReleaseStringUTFChars(env, jnewfile, newpath);
(*env)->ReleaseStringUTFChars(env, jpatchfile, patchPath);
return restlt;
}

2.3.4、编译bsdiff.c成.so文件
gcc bsdiff.c -lbz2 -fPIC -shared -o libBsDiffYwl5320.so

成功生成了.so文件
三、编写测试程序
3.1、删除开始生成的.patch文件
rm app_patch1.patch
3.2、编写BsDiffTest.java文件- import com.ywl5320.bsdiff.BsDiffYwl5320Util;
- /**
- * Created by ywl on 2017-10-23.
- */
- public class BsDiffTest {
- private static String oldFile = "app_old1.apk";
- private static String newFile = "app_new1.apk";
- private static String patchFile = "app_patch1.patch";
- public static void main(String[] args)
- {
- int result = BsDiffYwl5320Util.getInstance().bsDiffFile(oldFile, newFile, patchFile);
- System.out.println("result:" + result);//0:success 1:wrong
- }
- }
import com.ywl5320.bsdiff.BsDiffYwl5320Util;
/**
* Created by ywl on 2017-10-23.
*/
public class BsDiffTest {
private static String oldFile = "app_old1.apk";
private static String newFile = "app_new1.apk";
private static String patchFile = "app_patch1.patch";
public static void main(String[] args)
{
int result = BsDiffYwl5320Util.getInstance().bsDiffFile(oldFile, newFile, patchFile);
System.out.println("result:" + result);//0:success 1:wrong
}
}
3.3.1、首先把libBsDiffYwl5320.so添加到环境变量中,执行命令
export LD_LIBRARY_PATH=.
3.3.2、编译运行测试文件
javac BsDiffTest.java
java BsDiffTest

可见,成功生成了差分包app_patch1.patch文件。
四、最后打包jar文件
- javac com/ywl5320/bsdiff/BsDiffYwl5320Util.java
- jar cvf BsDiffYwl5320.jar com/ywl5320/bsdiff/BsDiffYwl5320Util.class
javac com/ywl5320/bsdiff/BsDiffYwl5320Util.java
jar cvf BsDiffYwl5320.jar com/ywl5320/bsdiff/BsDiffYwl5320Util.class

这就完成了Linux平台上面的移植,生成的.jar包和.so可以直接使用了。
下一篇将介绍用Android Studio生成APK并对差分包进行合并。
源码下载:GitHub BsDiffYwl5320
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <link rel="stylesheet" href="http://static.blog.csdn.net/public/res-min/markdown_views.css?v=2.0">