Android增量更新(三)-差分文件(Linux)-生成jar和.so库

907 阅读5分钟
原文链接: blog.csdn.net

目录:

        Android增量更新(一)-差分文件(Windows-part1)

        Android增量更新(二)-差分文件(Windows-part2)-dll动态库和jar包

        Android增量更新(三)-差分文件(Linux)-生成jar和.so库


        Windows平台上的增量更新差分文件用了2篇博客来介绍,现在介绍Linux平台的就比较简单了,话不多说直接开始。

一、直接编译成可执行文件

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

  1. tar -xzvf bsdiff-4.3.tar.gz  
tar -xzvf bsdiff-4.3.tar.gz

1.2、由于Linux有bzip2的库,先安装bzip2

  1. sudo apt-get install libbz2-dev  
sudo apt-get install libbz2-dev


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

  1. gcc bsdiff.c -lbz2 -o bsdiff  
gcc bsdiff.c -lbz2 -o bsdiff

1.4、测试程序是否正确

  1. ./bsdiff app_old1.apk app_new1.apk app_patch1.patch  
./bsdiff app_old1.apk app_new1.apk app_patch1.patch

成功生成了.patch文件。

二、添加Java本地调用方法

2.1、创建包含native方法的类:BsDiffYwl5320Util.java,包名为:com.ywl5320.bsdiff

  1. package com.ywl5320.bsdiff;  
  2.   
  3. /** 
  4.  * Created by ywl on 2017-10-23. 
  5.  */  
  6. public class BsDiffYwl5320Util {  
  7.   
  8.     private static BsDiffYwl5320Util instance = new BsDiffYwl5320Util();  
  9.   
  10.     public BsDiffYwl5320Util(){}  
  11.   
  12.     public static BsDiffYwl5320Util getInstance()  
  13.     {  
  14.         return instance;  
  15.     }  
  16.   
  17.     static  
  18.     {  
  19.         System.loadLibrary("BsDiffYwl5320");  
  20.     }  
  21.   
  22.   
  23.     public native int bsDiffFile(String oldFile, String newFile, String patchFile);  
  24.   
  25. }  
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);

}


2.2、用javah生成.h方法

  1. javac com/ywl5320/bsdiff/BsDiffYwl5320Util.java  
  2. javah com.ywl5320.bsdiff.BsDiffYwl5320Util  
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)->**** 调用方法

  1. JNIEXPORT jint JNICALL Java_com_ywl5320_bsdiff_BsDiffYwl5320Util_bsDiffFile  
  2. (JNIEnv *env, jobject jobj, jstring joldfile, jstring jnewfile, jstring jpatchfile)  
  3. {  
  4.         int restlt = -1;  
  5.         int argc = 4;  
  6.         char *argv[4];  
  7.   
  8.         char *oldPath = (char*)(*env)->GetStringUTFChars(env, joldfile, NULL);  
  9.         char *newpath = (char*)(*env)->GetStringUTFChars(env, jnewfile, NULL);  
  10.         char *patchPath = (char*)(*env)->GetStringUTFChars(env, jpatchfile, NULL);  
  11.         argv[0] = "bsdiff_ywl5320";  
  12.         argv[1] = oldPath;  
  13.         argv[2] = newpath;  
  14.         argv[3] = patchPath;  
  15.   
  16.         restlt = bsdiff_main(argc, argv);  
  17.   
  18.         (*env)->ReleaseStringUTFChars(env, joldfile, oldPath);  
  19.         (*env)->ReleaseStringUTFChars(env, jnewfile, newpath);  
  20.         (*env)->ReleaseStringUTFChars(env, jpatchfile, patchPath);  
  21.         return restlt;  
  22. }  
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文件

  1. gcc bsdiff.c -lbz2 -fPIC -shared -o libBsDiffYwl5320.so  
gcc bsdiff.c -lbz2 -fPIC -shared -o libBsDiffYwl5320.so


成功生成了.so文件


三、编写测试程序

3.1、删除开始生成的.patch文件

  1. rm app_patch1.patch  
rm app_patch1.patch
3.2、编写BsDiffTest.java文件
  1. import com.ywl5320.bsdiff.BsDiffYwl5320Util;  
  2.   
  3. /** 
  4.  * Created by ywl on 2017-10-23. 
  5.  */  
  6. public class BsDiffTest {  
  7.   
  8.     private static String oldFile = "app_old1.apk";  
  9.     private static String newFile = "app_new1.apk";  
  10.     private static String patchFile = "app_patch1.patch";  
  11.   
  12.     public static void main(String[] args)  
  13.     {  
  14.         int result = BsDiffYwl5320Util.getInstance().bsDiffFile(oldFile, newFile, patchFile);  
  15.         System.out.println("result:" + result);//0:success 1:wrong  
  16.     }  
  17.   
  18. }  
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、编译并运行BsDiffTest.java文件

3.3.1、首先把libBsDiffYwl5320.so添加到环境变量中,执行命令

  1. export LD_LIBRARY_PATH=.  
export LD_LIBRARY_PATH=.
3.3.2、编译运行测试文件

  1. javac BsDiffTest.java  
  2. java BsDiffTest  
javac BsDiffTest.java
java BsDiffTest


可见,成功生成了差分包app_patch1.patch文件。

四、最后打包jar文件

  1. javac com/ywl5320/bsdiff/BsDiffYwl5320Util.java  
  2. 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






  1. <pre></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  4. <pre></pre>  
  5. <pre></pre>  
  6. <pre></pre>  
  7. <link rel="stylesheet" href="http://static.blog.csdn.net/public/res-min/markdown_views.css?v=2.0">  
  8.