OTA升级功能系列二(升级包的解压缩)

本文详细介绍了在OTA升级过程中如何通过压缩与解压缩技术优化升级体验。重点讲解了使用zip和unzip命令进行文件压缩的方法,并展示了如何将开源库zlib中的unzip功能移植到项目代码中。

前言

在上一篇的文章中,我们简单的介绍了在OTA升级中,如何对升级包文件进行加解密的方法。今天,我们继续介绍如何对文件进行解压缩。


一、为什么要解压缩?

我们知道,OTA升级的过程,简单说,就是在客户端从服务器获取升级包的过程。但是,当升级包文件过于庞大时(例如我们的手机系统升级),这个过程就会被极大地延长,从而造成非常不好的用户体验。因此,在将升级包文件上传服务器前进行一个压缩操作,可以有效地解决这个问题。客户端先在服务器下载升级包压缩文件后,接着在本地进行一个解压缩的操作,就可以得到完整的升级包文件。

二、实现步骤

1.本地实现对升级包文件的压缩

我们知道,在linux系统中,有很多命令可以实现对于文件的解压缩。如常见的gzip和gunzip,zip和unzip命令等,都可以实现对文件的压缩。因此,在上传升级包文件前的压缩文件操作,我们可以直接使用这些命令来实现,不用专门去写对应的代码来实现这个功能。
在这里,我们使用zip和unzip命令来实现对升级包的压缩。

zip updateOTA.zip updateOTA -r

在这里插入图片描述
我们可以看到我们已经成功的对文件进行了压缩。

2.客户端的解压缩操作

在本地,我们可以直接使用命令行工具来对文件进行压缩。那么,在客户端,如何实现解压缩操作呢?如何编程实现unzip命令的解压缩功能呢?这里我们可以到网上找到unzip的源码,稍加改动直接移植到我们的代码上即可。
在网上查找了相关的资料后,我们找到了zlib这个开源库,里面或许有我们需要的东西。
在这里插入图片描述
如图,我下载的版本是zlib-1.2.8,下载地址可以到github上面去搜。
将当前路径移到contrib/minizip/目录下(如下图)
在这里插入图片描述
我们可以看到,有unzip.c和unzip.h两个文件,可能是我们正在找的unzip命令行工具的源码。有Makefile文件,ok我们先编译下整份文件。

make all

在这里插入图片描述
编译完了后,我们可以看到有一些警告,本着“警告=没问题”的原则,我们继续往下走。
在这里插入图片描述
ls查看当前目录后,我们可以看到当前目录多出来了一些可执行文件和.o文件。
在这里插入图片描述
多出来的可执行程序有minizip和miniunz两个,哪个是unzip.c和unzip.h编译出来的呢?其实看文件名猜都猜出来了。保险点,我们可以看Makefile确认下。

CC=cc
CFLAGS=-O -I../..

UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
ZIP_OBJS = minizip.o zip.o   ioapi.o ../../libz.a

.c.o:
	$(CC) -c $(CFLAGS) $*.c

all: miniunz minizip

miniunz:  $(UNZ_OBJS)
	$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)

minizip:  $(ZIP_OBJS)
	$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)

test:	miniunz minizip
	./minizip test readme.txt
	./miniunz -l test.zip
	mv readme.txt readme.old
	./miniunz test.zip

clean:
	/bin/rm -f *.o *~ minizip miniunz

可以看到,miniunz是我们想要的东西,同时Makefile有test使用说明,我们使用miniunz执行程序看下是否可以解压我们前面用zip工具压缩的压缩包。
在这里插入图片描述
可以看到,使用miniunz是可以正常解压缩压缩包的。那么,接下来,我们的工作就是看如何移植miniunz的源码到我们的代码上。
我们从上面的Makefile文件,可以看到miniunz的依赖关系。

UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a

这里依赖于三个文件,一个lib.a,unzip.c和ioapi.c,我们直接将这三个文件移到我们的代码中即可。接下来就是如何修改移植miniunz.c文件。
我们直接查看miniunz.c的main函数,如下:

int main(argc,argv)
    int argc;
    char *argv[];
{
   
   
    int i;
    int opt_overwrite=0;
    int opt_compress_level=Z_DEFAULT_COMPRESSION;
    int opt_exclude_path=0;
    int zipfilenamearg = 0;
    char filename_try[MAXFILENAME+16];
    int zipok;
    int err=0;
    int size_buf=0;
    void* buf=NULL;
    const char* password=NULL;


    do_banner();
    if (argc==1)
    {
   
   
        do_help();
        return 0;
    }
    else
    {
   
   
        for (i=1;i<argc;i++)
        {
   
   
            if ((*argv[i])=='-')
            {
   
   
                const char *p=argv[i]+1;

                while ((*p)!='\0')
                {
   
   
                    char c=*(p++);;
                    if ((c=='o') || (c=='O'))
                        opt_overwrite = 1;
                    if ((c=='a') || (c=='A'))
                        opt_overwrite = 2;
                    if ((c>='0') && (c<='9'))
                        opt_compress_level = c-'0';
                    if ((c=='j') || 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Top0_0lll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值