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

 

我的视频课程:《FFmpeg打造Android万能音频播放器》

我的视频课程(编码直播推流):《Android视频编码和直播推流》

 

目录:

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

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

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

        Android增量更新(四)-客户端合并差分包生成新的apk安装包

        移动大脑-SpringMVc搭建RestFul后台服务(七)-增量更新     

 

Update:

        1、实际测试中发现通过Jenkins打包发布时找不到.so库,可以直接复制.so库到系统目录里面:/lib 就行。

        2、加载动态库System.loadLibrary("BsPatchYwl5320") 不成功时用try...catch(Exception)...看不到异常结果,可以用try...catch(Throwable)来捕获异常:

 

try
        {
            System.loadLibrary("BsPatchYwl5320");
        }
        catch (Throwable ex)
        {
            ex.printStackTrace();
        }

 

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

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

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

 

tar -xzvf bsdiff-4.3.tar.gz

 

 

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

Ubuntu:

sudo apt-get install libbz2-dev

redhat:

1.2.1、查找bzip2的库

 

yum search bzip2

1.2.2、选择相应的版本,这里选择带header的

 

yum -y install bzip2-devel.x86_64

 

1.3、编译bsdiff.c生成可执行文件bsdiff(测试,可能不能运行,但不影响打包成.so库)

 

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);

}

 

 

2.2、用javah生成.h方法

 

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;
}

 

 

 

 

 

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
    }

}

 

 

3.3、编译并运行BsDiffTest.java文件

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

 

 

 

 

 

这就完成了Linux平台上面的移植,生成的.jar包和.so可以直接使用了。
下一篇将介绍用Android Studio生成APK并对差分包进行合并


源码下载:GitHub BsDiffYwl5320

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ywl5320

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

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

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

打赏作者

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

抵扣说明:

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

余额充值