您的位置:首页 > 移动开发 > Android开发

Android增量式升级程序

2015-07-01 13:19 656 查看
…..,增量式升级应用程序在软件中使用的比较频繁,特别是游戏中,每次更新代码修补漏洞都会使用增量式升级。如淘宝也如此。。

那么,问题就来了!什么是增量升级呢?

简单的说就是把两个不同版本的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: