Android8.0.0-r4的OTA升级--差分包的制作

1、差分包的制作

1.1 update.zip包的目录结构
          |----boot.img   #boot.img是更新boot分区所需要的文件。boot.img主要包括kernel+ramdisk
          |----system/    #system/目录的内容在升级后会放在系统的system分区。主要用来更新系统的一些应用或则应用会用到的一些库等等。可以将Android源码编译out/target/product/tcc8800/system/中的所有文件拷贝到这个目录来代替
          |----recovery/
                |----recovery-from-boot.p    #recovery-from-boot.p是boot.img和recovery.img的补丁(patch),主要用来更新recovery分区
                |----etc/
                        |----install-recovery.sh    #etc/目录下的install-recovery.sh是更新脚本
          |---META-INF/
              |CERT.RSA    #与签名文件相关联的签名程序块文件,它存储了用于签名JAR文件的公共签名。
              |CERT.SF    #JAR文件的签名文件,其中前缀CERT代表签名者
              |MANIFEST.MF #这个文件定义了与包的组成结构相关的数据。类似Android应用的mainfest.xml文件。
              |----com/
                     |----google/
                             |----android/
                                    |----update-binary    #update-binary是一个二进制文件,相当于一个脚本解释器,能够识别updater-script中描述的操作。该文件在Android源码编译后out/target/product/tcc8800/system bin/updater生成,可将updater重命名为update-binary得到。该文件在具体的更新包中的名字由源码中bootable/recovery/install.c中的宏ASSUMED_UPDATE_BINARY_NAME的值而定。
                                    |----updater-script    #此文件是一个脚本文件,具体描述了更新过程。可以根据具体情况编写该脚本来适应具体需求。该文件的命名由源码中bootable/recovery/updater/updater.c文件中的宏SCRIPT_NAME的值而定。
                             |----android/

                                    |----metadata    #描述设备信息及环境变量的元数据。主要包括一些编译选项,签名公钥,时间戳以及设备型号等


    可以在包中添加userdata目录,来更新系统中的用户数据部分。这部分内容在更新后会存放在系统的/data目录下

    在具体升级时,对update.zip包检查时大致会分三步:①检验SF文件与RSA文件是否匹配。②检验MANIFEST.MF与签名文件中的digest是否一致。③检验包中的文件与MANIFEST中所描述的是否一致。

MTK平台的项目

在MTK平台的项目,需要增加与项目强相关的适配文件(scatter.txt、SEC_VER.txt、type.txt),scatter.txt分散加载文件,将可执行映像文件分散加载到不同的内存段(文件内容:指定不同内存段的起始地址)。

    type.txt是build升级包过程生成的,里面的值1代表FullOTA,0代表DiffOTA,android的上层的update流程中会check这个值。

    scatter.txt也是build升级包过程生成的,里面的内容来自于/mediatek/misc/ota_scatter.txt。mediatek/misc/ota_scatter.txt是在build full ota时会产生。该文件主要用于在升级的时候check升级前后parition layout是否有改变。

    SEC_VER.TXT是在编译时从alps\mediatek\custom\$PROJECT\security\recovery下copy过来的,用于在打开SUPPORT_SBOOT_UPDATE之后会使用

升级注意点
        1、签名变更、model变更都会导致升级失败;
        2、分区变化无法通过OTA升级;
        3、本地制作OTA差分包时确保分区和签名与制作的版本一致。

1.2  制作差分包
          对于update.zip包的制作有两种方式,即手动制作和命令生成。
          第一种手动制作:即按照update.zip的目录结构手动创建需要的目录。然后将对应的文件拷贝到相应的目录下,比如向系统中新加一个应用程序。可以将新增的应用拷贝到新建的update/system/app/下(system目录是事先拷贝编译源码后生成的system目录),打包并签名后,拷贝到SD卡就可以使用了。
          第二种制作方式:命令制作。Android源码系统中为我们提供了制作update.zip刷机包的命令,即make otapackage。该命令在编译源码完成后并在源码根目录下执行。 具体操作方式:在源码根目录下执行
                ①$ . build/envsetup.sh。 
                ②$ lunch 然后选择你需要的配置(如17)。
                ③$ make otapackage。
          在编译完源码后最好再执行一遍上面的①、②步防止执行③时出现未找到对应规则的错误提示。命令执行完成后生成的升级包所在位置在out/target/product/full_tcc8800_evm_target_files-eng.mumu.20120309.111059.zip将这个包重新命名为update.zip,并拷贝到SD卡中即可使用。
       2) 使用make otapackage命令生成update.zip的过程分析。
            在源码根目录下执行make otapackage命令生成update.zip包主要分为两步,
第一步是根据Makefile执行编译生成一个update原包(zip格式)。第二步是运行一个python脚本,并以上一步准备的zip包作为输入,最终生成我们需要的升级包。下面进一步分析这两个过程。
1、需要两个增量包

增量包的获取可以再服务器下载,也可以在本地生成,本地生成是 使用./mk hq8127_tb_b2b_l a1992[lenovo] otapackage 之后再/out/target/product/huaqin82_tb_b2d_td/obj/PACKAGING/target_files_intermediates生成了相应的.zip增量包

                    (这时候有一个异常:

                        使用管理员权限修改/usr/lib/python2.7/zipfile.py
                        def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True):
                        false改为true就编译成功了  
                        sudo gedit /usr/lib/python2.7/zipfile.py
                        )


2、根据两个增量包制作差分包./build xxx  - k   xxx -i 老包  新包 差分包

./build/tools/releasetools/ota_from_target_files -k device/mediatek/common/security/hq8127_tb_b2b_l/releasekey -i old.zip new.zip old_to_new.zip

update.zip包的签名:update.zip更新包在制作完成后需要对其签名,否则在升级时会出现认证失败的错误提示。而且签名要使用和目标板一致的加密公钥。加密公钥及加密需要的三个文件在Android源码编译后生成的具体路径为:
               out/host/linux-x86/framework/signapk.jar 
               build/target/product/security/testkey.x509.pem         
               build/target/product/security/testkey.pk8 。
用命令make otapackage制作生成的update.zip包是已签过名的,如果自己做update.zip包时必须手动对其签名。具体的加密方法:$ java –jar /out/host/linux/framework/signapk.jar –w /build/target/product/security/testkey.x509.pem                                      /build/target/product/security/testkey.pk8 update.zip update_signed.zip
    以上命令在update.zip包所在的路径下执行,其中signapk.jar testkey.x509.pem以及testkey.pk8文件的引用使用绝对路径。update.zip 是已经打好的包,update_signed.zip包是命令执行完生成的已经签过名的包。

猜你喜欢

转载自blog.csdn.net/nwpushuai/article/details/79692742