Android之Recovery业务(三)-update.zip制作

一.update.zip结构目录


clipboard.png

二.对结构目录的解析

1.META-INF:包含升级脚本、脚本解释器、签名信息。

             1)update-binary:一个二进制文件,相当于一个脚本解释器,能够识别updater-script中描述的操作。

              来源:/out/target/product/{project}/symbols/system/bin/updater生成,可将updater重命名为update-binary得到。该文件在具体的更新包中的名字由源码中/bootable/recovery/install.cpp中的宏ASSUMED_UPDATE_BINARY_NAME的值而定。

             2)updater-script:此文件是一个脚本文件,具体描述了更新过程。我们可以根据具体情况编写该脚本来适应我们的具体需求。

              来源:编译过程由build/tools/releasetools/ota_from_target_files、ota_from_target_files.pt、edify_generator.py共同合力产生,其中涉及的内容定义可跟bootable/recovery/updater/install.cpp的RegisterInstallFunctions方法查看。该文件的命名由源码中bootable/recovery/updater/updater.cpp文件中的宏SCRIPT_NAME的值而定。

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

             4)MANIFEST.MF:这个manifest文件定义了与包的组成结构相关的数据。类似Android应用的mainfest.xml文件。

             5)CERT.RSA:与签名文件相关联的签名程序块文件,它存储了用于签名JAR文件的公共签名。签名采用非对称签名RSA

             6)CERT.SF:这是JAR文件的签名文件,其中前缀CERT代表签名者。

备注:
在具体升级时,对update.zip包检查时大致会分三步:

①检验SF文件与RSA文件是否匹配。

②检验MANIFEST.MF与签名文件中的digest是否一致。

③检验包中的文件与MANIFEST中所描述的是否一致

2.system包

1)system.new.dat:它实际上是由system.transfer.list描述的一个稀疏数组,这个过程的主要目的是降低ota.zip的大小,将system.img转换成为稀疏数组描述。

2)system.patch.dat:升级包中用于patch的数据

3)system.transfer.list:升级命令执行列表,由build/tools/releasetools/blockimgdiff.py生成

三.update包的签名

1.签名脚本:

java -Xmx2048m -jar signapk.jar -w testkey.x509.pem testkey.pk8 update_tmp.zip update_signed.zip

注:

可能有些update.zip的签名方式不一样。

更准确的方法是查看log:

/out/target/product/{project}_otapackage.log中的最后几行标注的,其中,它也详细的标注了所用的签名文件所在的目录

2.一般签名:key

testkey.x509.pem

获取路径:build/target/product/security/testkey.x509.pem

testkey.pk8

获取路径:build/target/product/security/testkey.pk8

注: pem/pk8的准确来源,可从源包(做差分包的包)的MATA/mic_info.txt中查看 default_system_dev_certificate=build/target/product/security/testkey

signapk.jar

获取路径:out/host/linux-x86/framework/signapk.jar

-Xmx2048m

获取路径:

build\tools\releasetools下的common.py:

self.java_args -- 对应Xmx2048m的来源

self.signapk_path -- 对应signapk.jar的来源

3.案例

#!/bin/bash
cd update
zip -r ../update_unsign.zip ./*
cd ../
echo "zipping finished"
java -Xmx2048m -jar signapk.jar -w testkey.x509.pem testkey.pk8 update_unsign.zip update_sign.zip
sudo rm update_unsign.zip

四.update脚本updater-script详解

clipboard.png

对应的实现路径为:bootable\recovery\updater\install.cpp

void RegisterInstallFunctions() {
    RegisterFunction("mount", MountFn);
    RegisterFunction("is_mounted", IsMountedFn);
    RegisterFunction("unmount", UnmountFn);
    RegisterFunction("format", FormatFn);
    RegisterFunction("show_progress", ShowProgressFn);
    RegisterFunction("set_progress", SetProgressFn);
    RegisterFunction("delete", DeleteFn);
    RegisterFunction("delete_recursive", DeleteFn);
    RegisterFunction("package_extract_dir", PackageExtractDirFn);
    RegisterFunction("package_extract_file", PackageExtractFileFn);
    RegisterFunction("symlink", SymlinkFn);
    ···
    RegisterFunction("getprop", GetPropFn);
    RegisterFunction("file_getprop", FileGetPropFn);
    RegisterFunction("write_raw_image", WriteRawImageFn);
    ···
    RegisterFunction("apply_patch", ApplyPatchFn);
    RegisterFunction("wipe_cache", WipeCacheFn);
    RegisterFunction("ui_print", UIPrintFn);
    ···
    RegisterFunction("enable_reboot", EnableRebootFn);
    RegisterFunction("tune2fs", Tune2FsFn);
}

五.系统编译的全量包和差分包来源

1.全量包

build/core/Makefile
ifeq ($(build_ota_package),true)
# -----------------------------------------------------------------
# OTA update package

name := $(TARGET_PRODUCT)
ifeq ($(TARGET_BUILD_TYPE),debug)
  name := $(name)_debug
endif
name := $(name)-ota-$(FILE_NAME_TAG)

INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip

$(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)

$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(HOST_OUT_EXECUTABLES)/mkparameter $(HOST_OUT_EXECUTABLES)/drmsigntool
        @echo "Package OTA: $@"
        $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
           ./build/tools/releasetools/ota_from_target_files -v \ 
           --block \  ## 这里使用ota_from_target_files的参数为-v和--block
           -p $(HOST_OUT) \
           -k $(KEY_CERT_PAIR) \
           $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
           $(BUILT_TARGET_FILES_PACKAGE) $@

.PHONY: otapackage
otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)

endif    # build_ota_package

2.差分包

#!/bin/bash
color_red='\E[1;31m'
color_end='\E[0m'

root_path=`pwd`
ota_name="buildTools/OTA"
ota_path=$root_path/$ota_name

old_path=$ota_path/old.zip
new_path=$ota_path/new.zip
update_path=$ota_path/update.zip

echo ---------------------------begin update.zip---------------------------
echo $old_path
if [ ! -e $old_path ]; then
   echo -e "$color_red--$old_path is not exist--$color_end"
   exit 0
fi

echo $new_path
if [ ! -e $new_path ]; then
   echo "$color_red--$new_path is not exist--$color_end"
   exit 0
fi

echo $update_path
if [ -e $update_path ]; then
   echo "delete $update_path"
   rm -fr $update_path
fi

./build/tools/releasetools/ota_from_target_files  -v -i $old_path $new_path $update_path

echo -----------------------------end update.zip------------------------------

## 关键点:ota_from_target_files  -v -i  #-i就是差分包 -v是校验verify

3.框架图


20180919203639483 (1).png

参考学习

https://blog.csdn.net/chi_wy/article/details/82777895 https://chendongqi.me/2019/01/04/updater/ https://blog.csdn.net/luzhenrong45/article/details/60968458?utm_source=blogxgwz9 https://blog.csdn.net/wanshilun/article/details/77337734 https://blog.csdn.net/huangyabin001/article/details/44838315 https://source.android.google.cn/devices/tech/ota/nonab/inside_packages?hl=zh-cn

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 一. 签名分析 使用: Auto-sign 执行命令 java -jar signapk.jar testke...
    CocoDoll阅读 2,742评论 0 0
  • android签名的应用-- 禁止未经授权签名的apk安装 最近项目有需求: 只有使用特定签名签的apk才可以安装...
    mahongyin阅读 711评论 0 0
  • 经常使用的总结: 本文主要讲解签名的原因,签名怎么保证数据的正确,主要知识点 数据摘要(数据指纹,消息摘要) 签名...
    xuefeng_apple阅读 848评论 0 2
  • 也有提到怎么单独给一个apk签名,这里补充一下android的签名权限控制机制。 android的标准签名key有...
    WorkFamily阅读 9,022评论 1 5
  • 一、目录结构 目录说明/binBinary的缩写,这个目录存放最经常使用的命令;/sbins就是Super Use...
    CJ21阅读 1,625评论 0 15