Android之Recovery業(yè)務(wù)(三)-update.zip制作

一.update.zip結(jié)構(gòu)目錄


clipboard.png

二.對(duì)結(jié)構(gòu)目錄的解析

1.META-INF:包含升級(jí)腳本刊驴、腳本解釋器捏浊、簽名信息片择。

             1)update-binary:一個(gè)二進(jìn)制文件,相當(dāng)于一個(gè)腳本解釋器曙求,能夠識(shí)別updater-script中描述的操作。

              來(lái)源:/out/target/product/{project}/symbols/system/bin/updater生成夹孔,可將updater重命名為update-binary得到办陷。該文件在具體的更新包中的名字由源碼中/bootable/recovery/install.cpp中的宏ASSUMED_UPDATE_BINARY_NAME的值而定。

             2)updater-script:此文件是一個(gè)腳本文件震檩,具體描述了更新過程琢蛤。我們可以根據(jù)具體情況編寫該腳本來(lái)適應(yīng)我們的具體需求。

              來(lái)源:編譯過程由build/tools/releasetools/ota_from_target_files抛虏、ota_from_target_files.pt博其、edify_generator.py共同合力產(chǎn)生,其中涉及的內(nèi)容定義可跟bootable/recovery/updater/install.cpp的RegisterInstallFunctions方法查看迂猴。該文件的命名由源碼中bootable/recovery/updater/updater.cpp文件中的宏SCRIPT_NAME的值而定慕淡。

             3)metadata:描述設(shè)備信息及環(huán)境變量的元數(shù)據(jù)。主要包括一些編譯選項(xiàng)沸毁,簽名公鑰峰髓,時(shí)間戳以及設(shè)備型號(hào)等。

             4)MANIFEST.MF:這個(gè)manifest文件定義了與包的組成結(jié)構(gòu)相關(guān)的數(shù)據(jù)息尺。類似Android應(yīng)用的mainfest.xml文件携兵。

             5)CERT.RSA:與簽名文件相關(guān)聯(lián)的簽名程序塊文件,它存儲(chǔ)了用于簽名JAR文件的公共簽名搂誉。簽名采用非對(duì)稱簽名RSA

             6)CERT.SF:這是JAR文件的簽名文件徐紧,其中前綴CERT代表簽名者。

備注:
在具體升級(jí)時(shí)炭懊,對(duì)update.zip包檢查時(shí)大致會(huì)分三步:

①檢驗(yàn)SF文件與RSA文件是否匹配并级。

②檢驗(yàn)MANIFEST.MF與簽名文件中的digest是否一致。

③檢驗(yàn)包中的文件與MANIFEST中所描述的是否一致

2.system包

1)system.new.dat:它實(shí)際上是由system.transfer.list描述的一個(gè)稀疏數(shù)組侮腹,這個(gè)過程的主要目的是降低ota.zip的大小嘲碧,將system.img轉(zhuǎn)換成為稀疏數(shù)組描述。

2)system.patch.dat:升級(jí)包中用于patch的數(shù)據(jù)

3)system.transfer.list:升級(jí)命令執(zhí)行列表父阻,由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的簽名方式不一樣愈涩。

更準(zhǔn)確的方法是查看log:

/out/target/product/{project}_otapackage.log中的最后幾行標(biāo)注的,其中加矛,它也詳細(xì)的標(biāo)注了所用的簽名文件所在的目錄

2.一般簽名:key

testkey.x509.pem

獲取路徑:build/target/product/security/testkey.x509.pem

testkey.pk8

獲取路徑:build/target/product/security/testkey.pk8

注: pem/pk8的準(zhǔn)確來(lái)源钠署,可從源包(做差分包的包)的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 -- 對(duì)應(yīng)Xmx2048m的來(lái)源

self.signapk_path -- 對(duì)應(yīng)signapk.jar的來(lái)源

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

對(duì)應(yīng)的實(shí)現(xiàn)路徑為: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);
}

五.系統(tǒng)編譯的全量包和差分包來(lái)源

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的參數(shù)為-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------------------------------

## 關(guān)鍵點(diǎn):ota_from_target_files  -v -i  #-i就是差分包 -v是校驗(yàn)verify

3.框架圖


20180919203639483 (1).png

參考學(xué)習(xí)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荒椭,隨后出現(xiàn)的幾起案子谐鼎,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狸棍,死亡現(xiàn)場(chǎng)離奇詭異身害,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)草戈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門塌鸯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人唐片,你說我怎么就攤上這事丙猬。” “怎么了费韭?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵茧球,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我星持,道長(zhǎng)抢埋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任督暂,我火速辦了婚禮揪垄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逻翁。我一直安慰自己饥努,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布八回。 她就那樣靜靜地躺著酷愧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辽社。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天翘鸭,我揣著相機(jī)與錄音滴铅,去河邊找鬼。 笑死就乓,一個(gè)胖子當(dāng)著我的面吹牛汉匙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播生蚁,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼噩翠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了邦投?” 一聲冷哼從身側(cè)響起伤锚,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎志衣,沒想到半個(gè)月后屯援,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猛们,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年狞洋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弯淘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吉懊,死狀恐怖庐橙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情借嗽,我是刑警寧澤态鳖,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站淹魄,受9級(jí)特大地震影響郁惜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甲锡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一兆蕉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缤沦,春花似錦虎韵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至企量,卻和暖如春测萎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背届巩。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工硅瞧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恕汇。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓腕唧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瘾英。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枣接,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一. 簽名分析 使用: Auto-sign 執(zhí)行命令 java -jar signapk.jar testke...
    CocoDoll閱讀 2,740評(píng)論 0 0
  • android簽名的應(yīng)用-- 禁止未經(jīng)授權(quán)簽名的apk安裝 最近項(xiàng)目有需求: 只有使用特定簽名簽的apk才可以安裝...
    mahongyin閱讀 707評(píng)論 0 0
  • 經(jīng)常使用的總結(jié): 本文主要講解簽名的原因,簽名怎么保證數(shù)據(jù)的正確,主要知識(shí)點(diǎn) 數(shù)據(jù)摘要(數(shù)據(jù)指紋,消息摘要) 簽名...
    xuefeng_apple閱讀 848評(píng)論 0 2
  • 也有提到怎么單獨(dú)給一個(gè)apk簽名缺谴,這里補(bǔ)充一下android的簽名權(quán)限控制機(jī)制但惶。 android的標(biāo)準(zhǔn)簽名key有...
    WorkFamily閱讀 9,020評(píng)論 1 5
  • 一、目錄結(jié)構(gòu) 目錄說明/binBinary的縮寫,這個(gè)目錄存放最經(jīng)常使用的命令榆骚;/sbins就是Super Use...
    CJ21閱讀 1,623評(píng)論 0 15