linux之Android差分包环境搭建

106 阅读2分钟

差分包环境搭建

1、将bsdiff-4.3.tar.gz和bzip2-1.0.6.zip文件上传到服务器的某个目录(/home/bsdiff)

2、解压bsdiff源文件(bsdiff-4.3.tar.gz)

tar -xzvf bsdiff-4.3.tar.gz

3、安装bzip2

3.1. 先查找bzip2的库

yum search bzip2

1.png

3.2安装bzip2

yum -y install bzip2-devel.x86_64

4、编译bsdiff.c生成可执行文件bsdiff

cd /home/bsdiff/bsdiff-4.3

gcc bsdiff.c -lbz2 -o bsdiff

5、添加Java本地调用方法

进入bsdiff-4.3所在目录( /home/bsdiff/bsdiff-4.3)

1、新建目录 com/leelen/crm/util/

mkdir -p com/leelen/crm/util

2、创建包含native方法的类:LeelenBsDiffUtil.java,包名为:com.leelen.crm.util

cd /home/bsdiff/bsdiff-4.3/com/leelen/crm/util

vim LeelenBsDiffUtil.java

添加文件内容

package com.leelen.crm.util;

public class LeelenBsDiffUtil {
    private static LeelenBsDiffUtil instance = new LeelenBsDiffUtil();

    public LeelenBsDiffUtil() {
    }

    public static LeelenBsDiffUtil getInstance() {
        return instance;
    }

    static {
        try {
            System.loadLibrary("LeelenBsdiff");
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    public native int bsDiffFile(String oldFile, String newFile, String patchFile);
}

3、用javah生成.h方法(或者直接本地生成.h文件上传

cd /home/bsdiff/bsdiff-4.3/

javac com/leelen/crm/util/LeelenBsDiffUtil.java

javah com.leelen.crm.util.LeelenBsDiffUtil

4、修改bsdiff.c并编译成.so

4.1导入Java中的jni.h和jni_md.h文件到/home/bsdiff/bsdiff-4.3/中

#查找jkd安装路径

which java #/usr/java/jdk1.8.0_172/bin/java

#进入jdk目录

cd /usr/java/jdk1.8.0_172

#拷贝jni.h和jni_md.h文件

cp include/jni.h /home/bsdiff/bsdiff-4.3/

cp include/linux/jni_md.h /home/bsdiff/sdiff-4.3/

4.2bsdiff.c文件中添加com_leelen_crm_util_LeelenBsDiffUtil.h头文件,并把它们中的#include <jni.h> 改成#include “jni.h”

cd /home/bsdiff/bsdiff-4.3/

vim bsdiff.c

#include "com_leelen_crm_util_LeelenBsDiffUtil.h"

2.png

4.3修改com_leelen_crm_util_LeelenBsDiffUtil.h文件将#include <jni.h> 改成#include “jni.h”

vim com_leelen_crm_util_LeelenBsDiffUtil.h

#将#include 改成#include “jni.h” 如下

3.png

4.4bsdiff.c中实现com_leelen_crm_util_LeelenBsDiffUtil.h中的native方法

vim bsdiff.c

在bsdiff.c底部添加如下内容,并保存退出

`JNIEXPORT jint JNICALL Java_com_leelen_crm_util_LeelenBsDiffUtil_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] = "leelenBsdiff";
    argv[1] = oldPath;
    argv[2] = newpath;
    argv[3] = patchPath;

    restlt = main(argc, argv);

    (*env)->ReleaseStringUTFChars(env, joldfile, oldPath);
    (*env)->ReleaseStringUTFChars(env, jnewfile, newpath);
    (*env)->ReleaseStringUTFChars(env, jpatchfile, patchPath);
    return restlt;

}`

4.5编译bsdiff.c成.so文件

gcc bsdiff.c -lbz2 -fPIC -shared -o libLeelenBsdiff.so

4.png

4.6将libLeelenBsdiff.so拷贝到linux库中

cp libLeelenBsdiff.so /usr/lib/

4.7编写BsDiffTest.java文件

vim BsDiffTest.java

文件内容,保存退出

import com.leelen.crm.util.LeelenBsDiffUtil;

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 = LeelenBsDiffUtil.getInstance().bsDiffFile(oldFile, newFile, patchFile);
        System.out.println("result:" + result);//0:success 1:wrong
    }


}

4.6编译并运行BsDiffTest.java文件

javac BsDiffTest.java

java BsDiffTest

成功生成差分包

5.png

4.7最后打包jar文件

javac com.leelen.crm.util.LeelenBsDiffUtil.java

jar cvf leelen-bsdif.jar com/leelen/crm/util/LeelenBsDiffUtil.class