Android增量式升级程序
2015-07-01 13:19
656 查看
…..,增量式升级应用程序在软件中使用的比较频繁,特别是游戏中,每次更新代码修补漏洞都会使用增量式升级。如淘宝也如此。。
那么,问题就来了!什么是增量升级呢?
简单的说就是把两个不同版本的APK包进行对比,利用工具计算出两个apk的差异,然后把这个差异的部分装到文件中,Android客户端下载该差异包,然后本地进行apk包和差异包合并,得出最新的应用程序包。
这里要感谢基哥提供的资料!!!!!!!!!!!!!!!!!!
这里记录一下使用方法:—————我是分割线———————
服务端:
(原理)准备好两个apk文件,使用bsdiff.exe工具进行计算,并且生成增量包×××.patch.供android客户端下载。
示例代码:
Android客户端
(原理)下载增量包*.patch,使用JNI调用C代码进行差量包整合。
1,下载增量包^^^^^^^这里下载就不说了使用Http网络请求下载下来就好了,注意,这个下载下来的差异包地址要记录下来。
2, 根据native方法生成C的头文件
具体生成方法(/article/3721694.html)
3,在项目中建立一个jni文件,并且把需要的.C源文件否复制进去
这里我们需要改动的地方只有Patcher.cpp,需要把我们生成的头文件中的方法复制到Pactcher.cpp中。
这个头文件
把以上方法复制,粘贴到:
这里的代码char **argv代表字符数组,在for循环中给每个字符分配空间,然后给每个都赋值,其中Jstring2CStr是把java中的字符串转换成C语言中的字符串。接着调用bspatch(argv)方法进行合并。最后需要释放字符串资源。
在bspatch方法中进行了字节的整合,这里代码比较多不详细说明。
3,如果你的文件不叫Pacther.cpp,那么记得改一下Android.mk中的名称,然后进行编译(右键项目-》properties-》builders-》new program-》…..具体请看第2步),编译生成的一个Patcher.os动态连接库,接下来就可使用这个os文件了
4,使用动态链接库进行资源合并
哦,对了,这里首先需要把手机当前的apk包复制出来,我们当前的包是在手机的data/app/下面,可以通过代码复制到sd卡中:
这里我把下载下来的差量包,以及apk当前的包都放在了SD卡根目录下,这里调用Native方法进行合并,合并完成后进行安装。
这里的升级包合并的时候请确保服务器当前的旧包和手机当前安装的旧包一致,否则合并出来新的apk包无法安装,出现解析包错误。这个也就是不能跳版本进行差量升级。
实例代码下载:
http://download.csdn.net/detail/leifengpeng/8860915
那么,问题就来了!什么是增量升级呢?
简单的说就是把两个不同版本的APK包进行对比,利用工具计算出两个apk的差异,然后把这个差异的部分装到文件中,Android客户端下载该差异包,然后本地进行apk包和差异包合并,得出最新的应用程序包。
这里要感谢基哥提供的资料!!!!!!!!!!!!!!!!!!
这里记录一下使用方法:—————我是分割线———————
服务端:
(原理)准备好两个apk文件,使用bsdiff.exe工具进行计算,并且生成增量包×××.patch.供android客户端下载。
示例代码:
[code] private static String path="E://increment"; public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File(path); //找到bsdiff.exe文件 File bsdiff = new File(dir,"bsdiff"); if(bsdiff.exists()){ System.out.println("存在bsdiff.exe"); } String bsdiffpath = bsdiff.getAbsolutePath(); System.out.println(bsdiffpath); //定位到旧的包和新的包 File oldApk = new File(dir,"old.apk"); String oldApkpath = oldApk.getAbsolutePath(); if(oldApk.exists()){ System.out.println("存在old.apk/"+oldApkpath); } File newApk = new File(dir,"new.apk"); String newApkpath = newApk.getAbsolutePath(); if(newApk.exists()){ System.out.println("存在new.apk/"+newApk); } //增量文件的目录 String name ="update.patch"; File patch = new File(dir,name); String patchpath = patch.getAbsolutePath(); if(patch.exists()){ System.out.println("存在update.patch/"+patchpath); }else{ System.out.println("不存在update.patch/"+patchpath); } if(!patch.exists()){ //生成增量文件 try { Runtime.getRuntime().exec(bsdiffpath + " " + oldApkpath + " " + newApkpath + " " + patchpath); System.out.println("是否成功:"+patch.exists()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ps:主要代码是一下代码 Runtime.getRuntime().exec(bsdiffpath + " " + oldApkpath + " " + newApkpath + " " + patchpath); 这句代码使得程序去执行bsdiff.exe程序,后面三个参数分别是旧包地址,新包地址,产生的增量包地址。
Android客户端
(原理)下载增量包*.patch,使用JNI调用C代码进行差量包整合。
1,下载增量包^^^^^^^这里下载就不说了使用Http网络请求下载下来就好了,注意,这个下载下来的差异包地址要记录下来。
2, 根据native方法生成C的头文件
public static native void patchapk(String oldApkpath,String newApkpath,String incrementpath);
具体生成方法(/article/3721694.html)
3,在项目中建立一个jni文件,并且把需要的.C源文件否复制进去
这里我们需要改动的地方只有Patcher.cpp,需要把我们生成的头文件中的方法复制到Pactcher.cpp中。
这个头文件
把以上方法复制,粘贴到:
这里的代码char **argv代表字符数组,在for循环中给每个字符分配空间,然后给每个都赋值,其中Jstring2CStr是把java中的字符串转换成C语言中的字符串。接着调用bspatch(argv)方法进行合并。最后需要释放字符串资源。
在bspatch方法中进行了字节的整合,这里代码比较多不详细说明。
3,如果你的文件不叫Pacther.cpp,那么记得改一下Android.mk中的名称,然后进行编译(右键项目-》properties-》builders-》new program-》…..具体请看第2步),编译生成的一个Patcher.os动态连接库,接下来就可使用这个os文件了
4,使用动态链接库进行资源合并
哦,对了,这里首先需要把手机当前的apk包复制出来,我们当前的包是在手机的data/app/下面,可以通过代码复制到sd卡中:
这里我把下载下来的差量包,以及apk当前的包都放在了SD卡根目录下,这里调用Native方法进行合并,合并完成后进行安装。
这里的升级包合并的时候请确保服务器当前的旧包和手机当前安装的旧包一致,否则合并出来新的apk包无法安装,出现解析包错误。这个也就是不能跳版本进行差量升级。
实例代码下载:
http://download.csdn.net/detail/leifengpeng/8860915
相关文章推荐
- Android EditText 设置默认键盘类型
- android service服务
- Android Notification的使用
- starting android emulator没反应的解决方案
- Android中调试工具LogCat简析
- android自定义伸缩框(展开效果)
- 一个自己用的代码备份工具,支持delphi,android,java,可以自己添加配置,灵活支持大部分编程语言
- android 模拟器 hosts文件修改 亲测可用
- 错误:指定的任务可执行文件位置 D:\Android\platform-tools\aapt.exe 无效
- AndroidManifest.xml——intent-filter
- Android学习 18 ->网格控件GridView
- Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
- Android开源项目第一篇——个性化控件(View)篇 收藏的
- ListView.setOnItemClickListener无效
- Android 软键盘事件imeOptions响应
- Android 仿百度手机助手首页滑动效果
- android GPS 定位,取位置信息
- Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
- Android的PowerManager和PowerManager.WakeLock用法简析
- Android 系统开发学习杂记(转)