利用sz命令下载文件时,当先4G下载不了,如何下载呢?

Linux分卷压缩与解压缩

一、普通更新和增量更新

率先领悟一下施用万般更新的逻辑(那里指不通过动用商场立异):
新本子发表后将APK文件上盛传服务器。然后由客户端下载新的APK文件并设置。

只是只要APK过大,普通更新的害处就涌出了。
譬如:3个嬉戏的APK,老版本有480M。新本子添加了3个模块APK扩张到500M。依照普通更新的逻辑,用户须求下载500M的APK,很显明相比费流量!那几个并不是只针对用户,对服务器也是这般,服务器也亟需节约带宽。

只要有壹种体制:只必要下载新版APK与老版APK多出的两样的一对,然后再由客户端将老版的APK和下载的壹些联合成新版APK,再实行安装更新。

譬如这一个事例,用户只须求下载20M左右的更新包就能展开翻新操作,就能丰盛欣喜的缓解流量的那几个难点了。

上述的那些事例就是增量更新的大旨逻辑,用图片来表示:

澳门金沙国际 1

增量更新

听他们讲增量更新的逻辑,能够驾驭增量更新主要的多少个知识点。

  • 服务器遵照新旧APK生成的增量包。(本文重点)
  • 客户端下载差分包(本文不做牵线)。
  • 客户端依依旧APK和下载的差分包生成新的APK。(本文重点,其它部须要要一丝丝NDK的底子)
  • 客户端安装新的APK。

Linux分卷压缩与解压缩

正文介绍的法子是先对该文件实行拆分,拆分成七个低于四G的公文,然后分别下载,下载到本地后再进行统一或直接解压,具体操作如下:

1.rar
 rar a -m5 -v12m myarchive myfiles # 最大范围为 12M

二、增量更新的依赖性

增量更新必要差分APK和统一APK,那里并不需求应用的开发者去写算法,直接可用3方提供的工具。

法定地址:
http://www.daemonology.net/bsdiff/

可是windows无法下载,恐怕被墙的来由。作者从第1方弄到的工具:

链接:拆分合并工具百度云地址

澳门金沙国际 2

资源

此间聚集了windows平台和linux平台使用的差分工具,以及客户端必要利用的统一工具。

1.rar
 rar a -m5 -v12m myarchive myfiles # 最大范围为 1二M

1.分拆为五个公文的授命:

cat workspace_20150624230059.tar.gz | split -b 2G - workspace_20150624230059.tar.gz.

指令解释:

workspace_贰零壹4062423005玖.tar.gz 是待下载的贰壹G文件

拆分成二G的小文件

workspace_二零一六062423005玖.tar.gz.
是拆分后文件的前缀,默认分拆后文件名称叫workspace_20150624230059.tar.gz.ab,ab,ac….类推

rar e myarchive.part1.rar #解压

3、差分APK

差分APK的操作有二种,小编那边介绍windows平台和Linux平台二种。

rar e myarchive.part1.rar #解压

2.下载多少个小文件

sz workspace_20150624230059.tar.gz.a*

分卷压缩

叁.1、Windows下的差分

将下载的工具中windows平台下的文书bsdiff4.叁-win3二-src.zip解压。

澳门金沙国际 3

bsdiff for windows

下一场再release文件夹下能够见见多少个.exe文件。必要接纳windows差分文件需求用到。bsdiff.exe.

澳门金沙国际 4

bsdiff

接下去将旧版的APK和新版的APK复制到这一个文件夹下,执行以下命令:

bsdiff.exe  旧APK地址  新APK地址 增量包地址

澳门金沙国际 5

实践拆分命令

下一场增量包就生成了:

澳门金沙国际 6

扭转增量包

如上办法应该是非常简单了。

理所当然解压bsdiff四.三-win3二-src.zip之后会发现这是源码:

澳门金沙国际 7

windows平台的源码

澳门金沙国际 8

差分的功力

经过这一个图能够见见,增量包要比新本子的安装包要小很多的。如果新版apk更加大,效果越来越强烈。

分卷压缩

三.联结下载的公文或间接解压

统一命令:

cat workspace_20150624230059.tar.gz.a* > workspace_20150624230059.all.tar.gz

怎么从Linux服务器上下载超越四G的公文,Linux分卷压缩与解压缩。集合后,再解压即可

直接解压多少个文本命令:

cat workspace_20150624230059.tar.gz.a*|tar xzv

Ubuntu下并未有暗许安装rar,可以因而sudo apt-get install rar,sudo apt-get install unrar 来安装rar.

三.二、Linux下的差分

比方未有windows系统,linux系统同样是提供支撑的。作者那边是装了3个Ubuntu的虚拟机。由于linux不太熟悉,小编那边只显示linux差分的中央部分。

先是步将bsdiff-四.三.tar.gz和bzip2-1.0.陆.tar.gz解压。将bsdiff-四.三.tar.gz中的bsdiff.c和bzip2-一.0.6.tar.gz中兼有的.c和.h文件全体复制到贰个目录中。(小编这里是用windows解压的,所以放的是windows的截图)

澳门金沙国际 9

bsdiff.c

澳门金沙国际 10

bzip2的所有.h和.c

在Linux中新建四个文书夹存放那几个文件:

澳门金沙国际 11

在Linux的文件

接下来需求用linux的编写翻译命令gcc将这个文件编写翻译成Linux中可举办的公文。(gcc是如何命令本身就不介绍了)。接下来会踩多少个坑。
接下去执行:

 gcc -g -o axe_bsdiff  blocksort.c decompress.c bsdiff.c  randtable.c  bzip2.c huffman.c compress.c bzlib.c crctable.c 

里面的axe_bsdiff是linux端可运维文件的文书名,可修改。执行那段命令就会遇上以下难点:

澳门金沙国际 12

首先个坑

直接用vim进入bsdiff.c,找include bzlib.h的地方:

澳门金沙国际 13

vim bsdiff.c

题材一目领会了,唯有引用系统提供的头文件才能用”<
>”,这就把那里改成
include "bzlib.h"
下一场保留!
如此也消除了地点为啥要求那样多文本的疑问了:bsdiff.c调用了bzlib下的c文件。
化解这几个标题那就继续执行gcc命令。

澳门金沙国际 14

第三个坑

上述正是第3个坑了,main方法被壹再概念。这几个标题也很精通,各个程序唯有一个main方法。那就把别的地点定义的main去掉就行了。此间要求保留bsdiff.c
中的main方法。

澳门金沙国际 15

将不需求的main方法修改成任何办法

自作者那里用windows端的notepad++修改的。名字是随便改的,,只要符合规范就行了。
客户端合并也急需那几个改动后的源文件,已上传git。最终有链接

修改形成之后,继续执行gcc编写翻译命令。
接下来就旗开马到了,生成了axe_bsdiff的可执行文件!

澳门金沙国际 16

gcc成功

接下去的步子就和windows端差分增量包操作大约了。执行一下发令:

./axe_bsdiff 旧APK路径 新APK路径 增量包路径

自身那里将新旧APK都赋值到了这几个文件夹,然后执行命令:

澳门金沙国际 17

执行差分命令

得逞生成增量包:

澳门金沙国际 18

中标转移增量包

完整来说Linux差分增量包要比windows差分增量包麻烦些。还或然会境遇权限不够的题材,这一年供给chmod命令等等。

Ubuntu下未有暗中认可安装rar,能够经过 sudo apt-get install rar,sudo apt-get
install unrar 来安装rar.

tar分卷压缩与解压缩

设置过后,使用以下命令进行分卷压缩:

四、客户端的统一操作

那边照旧必要接纳bsdiff-肆.三.tar.gz和bzip贰-一.0.6.tar.gz的解压文件。那里须求使用bsdiff-四.三中的bspatch.c还有bzip2-一.0.陆全数的.c和.h。上边讲到的Linux中差分增量包的文本,那里的能够直接运用。

设置过后,使用以下命令进行分卷压缩:

举例表明:

要将引得logs打包压缩并分割成五个1M的文本,能够用上面包车型地铁通令:

tar cjf - logs/ |split -b 1m - logs.tar.bz2.

做到后会产生下列文件:

logs.tar.bz2.aa, logs.tar.bz2.ab, logs.tar.bz2.ac

要解压的时候要是实施下边包车型大巴命令就能够了:

cat logs.tar.bz2.a* | tar xj

rar a -vSIZE  压缩后的文本名 被缩减的公文或然文件夹

4.一、新建NDK项目 (那一个就不上课了)

rar a -vSIZE  压缩后的文件名 被缩减的文书可能文件夹

再举例:

要将文件test.pdf分包压缩成500 bytes的文件:

tar czf - test.pdf | split -b 500 - test.tar.gz

最后要晋升然而那四个”-“不要漏了,那是tar的ouput和split的input的参数。

tar cjf - logs/ |split -b 1m - logs.tar.bz2.

形成后会发生下列文件:

logs.tar.bz2.aa, logs.tar.bz2.ab, logs.tar.bz2.ac

要解压的时候假诺进行下边包车型大巴下令就足以了:

cat logs.tar.bz2.a* | tar xj

例如:rar a -v50000k eclipse.rar eclipse

四.二、将所急需的公文导入并且配备好CMakeLists.txt。

澳门金沙国际 19

文本导入

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

# 加载指定文件夹的所有文件
file(GLOB bzip2 src/main/cpp/bzip2/*.c)

find_library( log-lib
              log )

# 配置AxeBsPatch动态库
add_library( AxeBsPatch
             SHARED
             src/main/cpp/bspatch.c
             ${bzip2}
             )
# 链接AxeBsPatch动态库
target_link_libraries( AxeBsPatch
                       ${log-lib} 

例如:rar a -v50000k eclipse.rar eclipse

此命令即为对eclipse文件夹实行分卷压缩,每卷的高低为四千0k,压缩后的文书名叫eclipse.rar
 二.tar举例表达:要将引得logs打包压缩并分割成两个1M的文书,可以用上边包车型客车一声令下:
 
tar cjf – logs/ |split -b 1m – logs.tar.bz2.
完了后会发生下列文件:
 logs.tar.bz2.aa, logs.tar.bz2.ab, logs.tar.bz2.ac
澳门金沙国际,要解压的时候即使举行下边包车型大巴授命就足以了:
cat logs.tar.bz2.a* | tar xj

4.3、新建native方法。

那边转移的native方法须要传入多个参数,老的APK地址、新的APK地址、下载的增量包的地方。

public class BsPatch {
    public native static int patch(String oldFile,String newFile,String patchFile);
    static {
        System.loadLibrary("AxeBsPatch");
    }
}

接下来用javah命令生成.h文件。

此命令即为对eclipse文件夹举行分卷压缩,每卷的尺寸为40000k,压缩后的文书名称为eclipse.rar
 贰.tar举例表明:要将引得logs打包压缩并私分成多个1M的文书,能够用下边包车型大巴一声令下:
 
tar cjf – logs/ |split -b 1m – logs.tar.bz2.
完了后会爆发下列文件:
 logs.tar.bz2.aa, logs.tar.bz2.ab, logs.tar.bz2.ac
要解压的时候如若实施下边的授命就足以了:
cat logs.tar.bz2.a* | tar xj

再举例:
要将文件test.pdf分包压缩成500 bytes的文本:
tar czf – test.pdf | split -b 500 – test.tar.gz
最终要唤醒可是那八个”-“不要漏了,那是tar的ouput和split的input的参数。

四.肆、达成.h文件中的方法

在bspatch.c中include生成的头文件。并完毕.h中的方法。

#include "com_mg_axechen_bspatch_BsPatch.h"
// ... ... 省略若干代码

/*
 * Class:     com_mg_axechen_bspatch_BsPatch
 * Method:    patch
 * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
 * params: old_path:The path for old APK.
 *         new_path:The path for new APK.
 *         patch_path:The path for patch package.
 */
JNIEXPORT jint JNICALL Java_com_mg_axechen_bspatch_BsPatch_patch
        (JNIEnv *env, jclass jclz, jstring old_path, jstring new_path, jstring patch_path) {

    // 先将jstring转化为char
    char *oldPath = (char *) (*env)->GetStringUTFChars(env, old_path, NULL);
    char *newPath = (char *) (*env)->GetStringUTFChars(env, new_path, NULL);
    char *patchPath = (char *) (*env)->GetStringUTFChars(env, patch_path, NULL);
    char *argv[4];

    int ret = -1;

    // 第一个参数随便填写
    argv[0] = "AXE_BSPATCH";
    argv[1] = oldPath;
    argv[2] = newPath;
    argv[3] = patchPath;

    // 第一个参数必须为4.
    ret = main(4, argv);

    // 回收资源
    (*env)->ReleaseStringUTFChars(env, old_path, oldPath);
    (*env)->ReleaseStringUTFChars(env, new_path, newPath);
    (*env)->ReleaseStringUTFChars(env, patch_path, patchPath);

    return ret;
}

那边也相比简单,将盛传的参数放入数组中,然后调用bspatch中的main方法即可。

再举例:
要将文件test.pdf分包压缩成500 bytes的文书:
tar czf – test.pdf | split -b 500 – test.tar.gz
最后要唤醒不过这四个”-“不要漏了,那是tar的ouput和split的input的参数。

3、用7z

伍、更新的逻辑判断

为了仿效得更像更新的逻辑,作者进入了简约的VersionCode的判定。
老版APK的VersionCode是一 ,新版的版本VersionCode是二。若是是老版则更新。
因为更新耗费时间,里面含有了下载和统1。所以放在线程中。
借使统十分之一功,就经过Hanlder发送通告去安装新的APK。
本身这里未有下载的逻辑,所以先将增量包放在了客户端sdcard的钦命路线!

/**
     * 更新操作
     *
     * @param view
     */
    public void upload(View view) {
        if (APKUtils.getVersionCode(MainActivity.this, getPackageName()) >= 2) {
            //
            new AlertDialog.Builder(MainActivity.this)
                    .setMessage("已经是最新的版本了,无需更新!")
                    .setNegativeButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    }).create().show();
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 下载就省略。 由于我没有服务器进行下载

                // 1、拿到老的APK
                String oldFile = APKUtils.getSourceApkPath(MainActivity.this, getPackageName());

                // 2、拿增量包的路径
                String patchFile = Contants.PATCH_FILE_PATH;

                Log.i("AXE", patchFile);
                // 3、开始执行合并操作
                int ret = BsPatch.patch(oldFile, Contants.NEW_APK_PATH, patchFile);

                // 4、合并的成功和失败
                if (ret == 0) {
                    Log.i("AXE", "合并成功");
                    handler.sendEmptyMessage(0);
                } else {
                    Log.i("AXE", "合并失败");
                }
            }
        }).start();
    }

3、用7z

壹律用以上例子

4.6、安装APK

柒.0后的APK安装有非常的大的变动。
看“在行使间共享文件”那有个别
切切实实贯彻本人也不贴出来了,那里直接贴出别的人的博客链接。
http://blog.csdn.net/czhpxl007/article/details/53781464

一样用以上例子

在film上层目录操作,保留film目录名
压缩:    7z a film.7z film -v80m
解压到当前目录:  柒z x film.七z.001
解压到目录a:    mkdir a && cd a && 7z x ../film.7z.001
或者  7z -oa x film.7z.001

伍、增量更新的优缺点

优点:

  • 很引人侧目,能节约流量,节省服务器费用。

缺点:

  • 客户端和服务端须要投入相应的支撑。每一趟发表新本子,服务端都须要为在此以前有所的老版本生成对应的差分包,并根据客户端端请求重返对应的更新包,维护进度将会变得相对复杂。客户端须要对差分包做进一步详细的注解,幸免出错,除外,客户端应该能够依据服务端更新开关来规定当前是选用完全更新依旧增量更新。
  • apk包之间的差异过小时,比如贰m之下,此时生成的差分包还是有几百k,此时应用增量更新以珠弹雀,毕竟形成差分包和统一的经过都11分耗费时间。其余,但版本之间变更相当大的时候,平日是是大版本好转变的时候,比如从v
    一.0.0到2.0.0,此时使用完整更新也不利。

如上缺点引用CSDN博客:

http://blog.csdn.net/dd864140130/article/details/52928419
作者:###
江湖人队(Los Angeles Lakers)称小白哥

在film上层目录操作,保留film目录名
压缩:    7z a film.7z film -v80m
解压到当前目录:  七z x film.柒z.00一
解压到目录a:    mkdir a && cd a && 柒z x ../film.七z.001
或者  7z -oa x film.7z.001

不保留film目录名
压缩  cd film && find . | xargs 7z a film.7z -v80m
解压  7z -oa x film.7z.001

最后

正文讲解了增量更新的主导逻辑、差分操作(Windows/Linux)、合并的操作(客户端)、7.0后装置APK的变更。

客户端合并的源代码:
源码传送门

参照博客:
http://blog.csdn.net/lmj623565791/article/details/52761658
http://blog.csdn.net/dd864140130/article/details/52928419

不保留film目录名
压缩  cd film && find . | xargs 7z a film.7z -v80m
解压  7z -oa x film.7z.001

壹味施用七z的话,文件的权柄(拥有者)属性会丢失,
采取如下办法则能够保存: 
压缩:
tar cf – film | 7z a -si film.tar.7z -v80m
解压缩:
7z x -so film.tar.7z.001 | tar xf –

偏偏运用柒z的话,文件的权力(拥有者)属性会丢失,
选择如下办法则足以保留: 
压缩:
tar cf – film | 7z a -si film.tar.7z -v80m
解压缩:
7z x -so film.tar.7z.001 | tar xf –

澳门金沙国际 20

1.rar rar a -m5 -v12m
myarchive myfiles # 最大范围为 1二M rar e myarchive.part壹.rar #解压
分卷压缩 Ubuntu下未有暗中认可安装rar,能够通过…

相关文章