前言:
第一次写博客,所谓的处女作。
不喜勿喷
不喜勿喷
不喜勿喷
这里我只是简单的实现
环境:
Windows7 64
NDK R10
VS 2013
材料:
bzip2
bsdiff 这里下载windows版
我云盘也有
流程:
服务器:利用bsdiff 项目生成old.apk 与 new.apk 的差分包 apk.patch
客户端:下载差分包apk.patch与old.apk结合生成new.apk。安装这个new.apk
开动:
这里还是需要一点JNI基础的,还不了解可以先去get一下。
既然我们是基于bsdiff,那我们就开始编译bsdiff,解压bsdiff4.3-win32-src
新建一个VS C++项目
把bsdiff4.3-win32-src中所有的 .c 和 .h 复制到新建的VS项目中,再把我们的jni.h,jni_md.h也加入到VS项目中,这里我删除了 bspatch.cpp (bspatch.cpp是用来合并 apk.patch 与 old.apk),这里我们先实现形成差分包 apk.patch
在新建的VS项目把我们复制的文件引入
这里我们配置一下项目,我们这里生产dll库给方便调用
在设置一下 项目 属性 => C/C++ => SDL 检查 ==>否,关闭VS语法检查。
我们在加入两个宏定义 项目 属性 => C/C++ =>命令行
1)用了不安全的函数 >>加入命令行 -D _CRT_SECURE_NO_WARNINGS
2)用了过时的函数 >>加入命令行 -D _CRT_NONSTDC_NO_DEPRECATE
这样全局设置就不用每个类去添加了
到这里我们就编译好bsdiff。。。。。。。。。。。。。
有木有点儿小激动!!!!!!!!!!!!!!!!
好了,我们要继续踩坑了,抬起我48码的大脚
打开bsdiff.cpp,找到main函数,这就是程序的入口了。
别问我怎么知道,猜的!!!
if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
这行代码很直观的告诉了我们参数应该怎么传,首先判断我们是否传了四个参数。
第一个参数在代码中没有用到,所以我们随便传一个就好。
oldfile:即我们的old.apk路径
newfile:即我们的new.apk路径
patchfile: 即生成的差分包路劲
**注意:路径不要带中文**
终于到我们熟悉的java了
打开elicpse新建一个java项目,这里就要用到JNI的技术了。
生成头文件
再次抬起大脚踩回C++的坑
复制 com_ly_diff_BsDiff.h 到我们的c++ 项目中并添加。(这里记得修改jni.h 为本地的)
在bsdiff.cpp引入我们的com_ly_diff_BsDiff.h并实现函数。
并修改了main函数名称为 diff_main
//JNI 调用
JNIEXPORT void JNICALL Java_com_ly_diff_BsDiff_bsdiff(JNIEnv *env, jclass jcls, jstring oldfile_jstr, jstring newfile_jstr, jstring patchfile_jstr){
int argc = 4;
char* oldfile = (char*)env->GetStringUTFChars(oldfile_jstr, NULL);
char* newfile = (char*)env->GetStringUTFChars(newfile_jstr, NULL);
char* patchfile = (char*)env->GetStringUTFChars(patchfile_jstr, NULL);
//参数(第一个参数无效)
char *argv[4];
argv[0] = "bsdiff";
argv[1] = oldfile;
argv[2] = newfile;
argv[3] = patchfile;
diff_main(argc,argv);
env->ReleaseStringUTFChars(oldfile_jstr, oldfile);
env->ReleaseStringUTFChars(newfile_jstr, newfile);
env->ReleaseStringUTFChars(patchfile_jstr, patchfile);
}
编译生成一把,成功即可得到 bsdiff.dll动态库. 位置:项目》X64》debug
这回真的是回到ava了(⊙﹏⊙)b
拷贝我们的bsdiff.dll动态库到APKBsdiff根目录。下面是完整的代码
package com.ly.diff;
public class BsDiff {
/**
* @param oldfile
* @param newfile
* @param patchfile
*/
public native static void bsdiff(String oldfile,String newfile,String patchfile);
/**
* 加载动态库
*/
static{
System.loadLibrary("bsdiff");
}
public static void main(String[] args) {
//APK是我事先生成好的,大家先准备好吧。
//dn_app_update_new中我是加了几张高清图片
//dn_app_update_old.apk 为7.54MB,dn_app_update_new.apk为14.1MB,patch生成后为6.48MB
bsdiff("E:/apk_update/apk/dn_app_update_old.apk","E:/apk_update/apk/dn_app_update_new.apk","E:/apk_update/apk/apk.patch");
}
}
直接运行
好了。我会在下一篇博客给大家实现apk合并。。。