android增量更新详细解读

本文详细介绍了增量更新技术,包括其意义、如何生成差分包及合成差分包的方法。增量更新能够有效减小软件更新包体积,降低网络流量消耗。

1 增量更新的意义

a 神马是增量更新?

这个概念很早就被提出,但是目前的形式,小厂用的很少,大厂用的比较多;企鹅的QQ和微信里面都有增量更新着玩意;到底神马是增量更新? 首先增量更新主要用于新版本apk替换旧版本apk, 跟热修复鸟关系都没有,热修复是撸bug的,增量更新是升级apk的, 我们用一张图来说明下 。。。。

这里写图片描述

也就是我们只需要下载一个很小很小的差分包再跟本地apk合并就可以更新版本了 。。。

b 存在的作用或是意义
不仅仅是为了装13,没有人会这么无聊了,现在WiFi更新免费,4G流量又便宜不差钱
节约大厂带宽

小厂的App就不多解释,下载的人都没有;大厂就不同了,像百度,企鹅等,android的apk更新都是直接从官方网站往下拉,企鹅好几亿的用户,每人多一兆。。。好了。不解释了。。。至少我们在微信官方apk上发现了 增量更新的痕迹,别不服,上图,也就是企鹅的微信用了增量更新

这里写图片描述

不只是企鹅,大部分有头有脸的网络公司都会撸这一把 。。。。。。

2 生成差分包

首先,差分包是比较两个版本的不同而生成的一个补丁文件 ,也就是比较一个 新的 apk和 旧的apk 通过开源算法而得出的一个补丁,新包的大小可以比旧包大,也可以比旧包小,甚至大小相同都可以,因为大小都不重要,重要的是里面的内容 。。。。。,首先,开源算法哪里可以搞得到了 ???? 这不重要,稍后代码会共享的

差分包一般都是有服务器生成

我说的是一般情况, 不一般的也有服务器端如果2的话,那么只有android端自己搞起了 。。。。 虽然android端生成差分包毫无压力,我们还是得详细的说下。。。网上也有教程,我擦,那帮孙子写的教程我猜过几天自己都看不懂。。。。

a 新建android studio项目 勾上 支持C++

这里写图片描述

项目名称改成自己的 。。。。。
然后会得到这样的一个项目 。。。。。。

这里写图片描述

我们可以干一个事情,就是把native-lib 这个名称改下 ,改为自己的名称 ,如果直接重命名是会报错的。。。 需要改动如下几个地方。。。

这里写图片描述

这三个地方, 名称保持一致就可以了 。。。。 然后我们写一个工具类

这里写图片描述

这里写图片描述

这里写图片描述

编译下没错, 那么到现在为止Java层和JNI层的对接是没有问题的 。。。 现在我们来导入 bzip2 的包因为差分的过程其实是将apk解压比较解压后的比较 ,所有我们需要导入bzip 还有 计算差分的开源框架 。。 分别将下面文件复制到项目中 。。。

这里写图片描述

这里写图片描述

这里写图片描述

然后修改 CMake.txt 里面的配置文件 。。。。 注意路径 。。。。

这里写图片描述

然后需要修改 bsdiff.c 这个文件中两个地方 。。。。

这里写图片描述

这里写图片描述

然后编译运行 。。。。。

这里写图片描述

这里写图片描述

那么到现在为止,C层的apk差分工作已经准备就绪 。。。。。 我们这个时候要注意个 so库 , 因为这个so库会用的上的。。。 Java工程或者是其他的android工程都能够用的上的。。。。

这里写图片描述

因为C代码部分已经实现了 , 都是开源框架的功劳 ,开源框架牛逼啊 。。。。
我们需要将我们的 cpp 代码调用 开源框架的代码 。。。。。。
下一步 我们需要将我们的代码调用C代码 。。.。。。。。

我们需要新建一个叫 bsdiff.h 的文件 。。。。。

这里写图片描述

并且在 bsdiff.c 中引入

这里写图片描述

创建这个.h文件的目的是为了 .cpp代码 调用.c代码中的函数 。。。

这里写图片描述

然后我们生成一个旧版 ,和 一个新版的apk 来 搞一个差分看看 。。。。。 我们现在在手机上差分 。。。。。

这里写图片描述

这里写图片描述

然后 , 我就要开始差分了。。。。。。

package hebiao.online.bsdiffapk;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void diff(View v){

        new Thread(){
            @Override
            public void run() {
                doDiffAction();
            }
        }.start();

    }

    private void doDiffAction(){
        System.out.println("xxxxxxxxxxxxxxxxxx  start");
        String oldFileName = getSdCardPath()+"/aaa/app_old.apk";
        String newFileName = getSdCardPath()+"/aaa/app_new.apk";
        String diffFileName = getSdCardPath()+"/aaa/apk_diff.patch";
        DiffUtil.diff(oldFileName,newFileName,diffFileName);
        System.out.println("===============  end");

    }


    public static boolean isSdCardExist() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    }


    public static String getSdCardPath() {
        boolean exist = isSdCardExist();
        String sdpath = "";
        if (exist) {
            sdpath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
        }
        return sdpath;

    }
}

这里写图片描述

差分生成成功。。。。。。。。

我们可以发现,差分包比新版本的更新包小 , 因为当前apk是不到1.8M ,但是差分包只有1M左右 。。。。不得不服啊 。。 差分包的确比新版本的包小。。。。。。

3 合成差分包

其实合成差分包和生成差分包的配置大部分是相同的,有个地方要注意下 。。。。。

这里写图片描述

合成差分是 bspatch.c ,而生成差分是 bsdiff.c 只有这两个地方的差别 。。。。。

这里写图片描述

我们新建一个文件夹,名称叫 bbb ,我们把生成的patch文件 和 旧的 old_apk文件 合并看下 。。。。。。。

这里写图片描述

package hebiao.online.patchapk;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }

     public void buttonAction(View v){
        new Thread(){
            @Override
            public void run() {
                doPatchAction();
            }
        }.start();
    }

    private void doPatchAction(){
        System.out.println("开始 合成 ");


        String oldFileName = getSdCardPath()+"/bbb/app_old.apk";
        String newFileName = getSdCardPath()+"/bbb/app_new.apk";
        String diffFileName = getSdCardPath()+"/bbb/apk_diff.patch";

        PatchUtil.patch(oldFileName,newFileName,diffFileName);

        System.out.println("合成 结束");

    }


    public static boolean isSdCardExist() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    }


    public static String getSdCardPath() {
        boolean exist = isSdCardExist();
        String sdpath = "";
        if (exist) {
            sdpath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
        }
        return sdpath;

    }


}

这里写图片描述

安装发现。。。。。。 可以 。。。。。.。。.。。

下载链接 https://download.youkuaiyun.com/download/chmod_r_755/10303657
没有积分的可以私信我。。。。
或者 https://github.com/hebiao6446/patchAndDiff

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值