Android+OTA+升級之一:編譯升級包---make+otapackage
Android OTA 升級之一:編譯升級包
作者: 宋立新
前言
OTA 升級是 Android 系統提供的標準軟體升級方式。 它功能強大,提供了完全升級、增量升級模式,可以通過 SD卡升級,也可以通過網路升級。
這裡,我們先研究最簡單的情況,通過 SD 卡進行完全升級。
如何執行升級就不多說了,網上有很多資料。(比如,介紹HTC手機如何升級)。我們感興趣的是它是如何實現的,作為開發者,如何修改它以符合我們的定製化需求。
首先,我們研究一下 ota 升級包的編譯過程。
Quick start
首先編譯出android, 然後執行:
make otapackage
即可獲得:out/target/product/{product_name}/ {product_name}-ota-eng.{uid}.zip
將該檔案改名為update.zip放到T卡根目錄, 即可開始recovery模式下的 OTA 升級。
編譯過程研究
主要分兩步,第一步, 會準備一個包,其中包含升級需要的內容(原材料),比如,system 目錄。
第二步,執行python 指令碼 ./build/tools/releasetools/ota_from_target_files,以步驟一準備的ZIP包作為輸入,最終生成需要的升級包。
步驟一
編譯指令碼如下:
(From: build/core/Makefile)
- 1073 # Depending on the various images guarantees that the underlying
- 1074 # directories are up-to-date.
- 1075 $(BUILT_TARGET_FILES_PACKAGE): /
- 1076 $(INSTALLED_BOOTIMAGE_TARGET) /
- 1077 $(INSTALLED_RADIOIMAGE_TARGET) /
- 1078 $(INSTALLED_RECOVERYIMAGE_TARGET) /
- 1079 $(INSTALLED_FACTORYIMAGE_TARGET) /
- 1080 $(INSTALLED_SYSTEMIMAGE) /
- 1081 $(INSTALLED_USERDATAIMAGE_TARGET) /
- 1082 $(INSTALLED_SECROIMAGE_TARGET) /
- 1083 $(INSTALLED_ANDROID_INFO_TXT_TARGET) /
- 1084 $(built_ota_tools) /
- 1085 $(APKCERTS_FILE) /
- 1086 $(HOST_OUT_EXECUTABLES)/fs_config /
- 1087 | $(ACP)
- 1088 @echo "Package target files: [email protected]"
- 1089 $(hide) rm -rf [email protected] $(zip_root)
- 1090 $(hide) mkdir -p $(dir [email protected]) $(zip_root)
- 1091 @# Components of the recovery image
- 1092 $(hide) mkdir -p $(zip_root)/RECOVERY
- 1093 $(hide) $(call package_files-copy-root, /
- 1094 $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/RECOVERY/RAMDISK)
- 1095 ifdef INSTALLED_KERNEL_TARGET
- 1096 $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/RECOVERY/kernel
- 1097 $(hide) $(ACP) $(recovery_ramdisk) $(zip_root)/RECOVERY/ramdisk
- 1098 endif
- 1099 ifdef INSTALLED_2NDBOOTLOADER_TARGET
- 1100 $(hide) $(ACP) /
- 1101 $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/RECOVERY/second
- 1102 endif
- 1103 ifdef BOARD_KERNEL_CMDLINE
- 1104 $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/RECOVERY/cmdline
- 1105 endif
- 1106 ifdef BOARD_KERNEL_BASE
- 1107 $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/RECOVERY/base
- 1108 endif
- 1109 @# Components of the factory image
- 1110 $(hide) mkdir -p $(zip_root)/FACTORY
- 1111 $(hide) $(call package_files-copy-root, /
- 1112 $(TARGET_FACTORY_ROOT_OUT),$(zip_root)/FACTORY/RAMDISK)
- 1113 ifdef INSTALLED_KERNEL_TARGET
- 1114 $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/FACTORY/kernel
- 1115 endif
- 1116 ifdef INSTALLED_2NDBOOTLOADER_TARGET
- 1117 $(hide) $(ACP) /
- 1118 $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/FACTORY/second
- 1119 endif
- 1120 ifdef BOARD_KERNEL_CMDLINE
- 1121 $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/FACTORY/cmdline
- 1122 endif
- 1123 ifdef BOARD_KERNEL_BASE
- 1124 $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/FACTORY/base
- 1125 endif
- 1126 @# Components of the boot image
- 1127 $(hide) mkdir -p $(zip_root)/BOOT
- 1128 $(hide) $(call package_files-copy-root, /
- 1129 $(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK)
- 1130 ifdef INSTALLED_KERNEL_TARGET
- 1131 $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel
- 1132 $(hide) $(ACP) $(INSTALLED_RAMDISK_TARGET) $(zip_root)/BOOT/ramdisk
- 1133 endif
- 1134 ifdef INSTALLED_2NDBOOTLOADER_TARGET
- 1135 $(hide) $(ACP) /
- 1136 $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second
- 1137 endif
- 1138 ifdef BOARD_KERNEL_CMDLINE
- 1139 $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
- 1140 endif
- 1141 ifdef BOARD_KERNEL_BASE
- 1142 $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base
- 1143 endif
- 1144 $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),/
- 1145 mkdir -p $(zip_root)/RADIO; /
- 1146 $(ACP) $(t) $(zip_root)/RADIO/$(notdir $(t));)
- 1147 @# Contents of the system image
- 1148 $(hide) $(call package_files-copy-root, /
- 1149 $(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM)
- 1150 @# Contents of the data image
- 1151 $(hide) $(call package_files-copy-root, /
- 1152 $(TARGET_OUT_DATA),$(zip_root)/DATA)
- 1153 @# Extra contents of the OTA package
- 1154 $(hide) mkdir -p $(zip_root)/OTA/bin
- 1155 $(hide) $(ACP) $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/
- 1156 $(hide) $(ACP) $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/
- 1157 @# Files that do not end up in any images, but are necessary to
- 1158 @# build them.
- 1159 $(hide) mkdir -p $(zip_root)/META
- 1160 $(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt
- 1161 $(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt
- 1162 $(hide) echo "$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/recovery-api-version.txt
- 1163 $(hide) echo "blocksize $(BOARD_FLASH_BLOCK_SIZE)" > $(zip_root)/META/imagesizes.txt
- 1164 $(hide) echo "boot $(call image-size-from-data-size,$(BOARD_BOOTIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt
- 1165 $(hide) echo "recovery $(call image-size-from-data-size,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt
- 1166 $(hide) echo "system $(call image-size-from-data-size,$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt
- 1167 $(hide) echo "secro $(call image-size-from-data-size,$(BOARD_SECROIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt
- 1168 $(hide) echo "userdata $(call image-size-from-data-size,$(BOARD_USERDATAIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt
- 1169 $(hide) echo "$(tool_extensions)" > $(zip_root)/META/tool-extensions.txt
- 1170 @# Zip everything up, preserving symlinks
- 1171 $(hide) (cd $(zip_root) && zip -qry ../$(notdir [email protected]) .)
- 1172 @# Run fs_config on all the system files in the zip, and save the output
- 1173 $(hide) zipinfo -1 [email protected] | awk -F/ 'BEGIN { OFS="/" } /^SYSTEM/// {$$1 = "system"; print}' | $(HOST_OUT_EXECUTABLES)/fs_config > $(zip_root)/META/filesystem_config.txt
- 1174 $(hide) (cd $(zip_root) && zip -q ../$(notdir [email protected]) META/filesystem_config.txt)
可見往裡面添加了很多內容。
L1089-1090 , 造一個目錄。
L1091-1108,填充 RECOVERY 子目錄的內容。用於生成recovery.img。包括:kernel 的image, recovery 根檔案系統的 image, recovery 根檔案系統的內容:
RECOVERY$ tree -L 2
├── kernel
├── ramdisk
└── RAMDISK
├── advanced_meta_init.rc
├── data
├── default.prop
├── dev
├── etc
├── init
├── init.factory.rc
├── init.goldfish.rc
├── init.mt6516.rc
├── init.rc
├── meta_init.rc
├── proc
├── res
├── sbin
├── sys
├── system
└── tmp
L1109-1125, 填充 FACTORY 子目錄的內容, 沒有用到,包括:kernel 的image
L1126-1143, 填充 BOOT子目錄的內容,用於生成boot.img。和 RECOVERY目錄類似,包括:kernel 的image,根檔案系統的 image,根檔案系統的內容:
BOOT$ tree -L 2
.
├── kernel
├── ramdisk
└── RAMDISK
├── advanced_meta_init.rc
├── data
├── default.prop
├── dev
├── init
├── init.factory.rc
├── init.goldfish.rc
├── init.mt6516.rc
├── init.rc
├── meta_init.rc
├── proc
├── res -> /system/res
├── sbin
├── sys
└── system
L1144-1146, 填充 RADIO子目錄的內容, 沒有用到。
L1147-1149, 填充 SYSTEM子目錄的內容。 這是升級的主要內容。
L1150-1152, 填充 DATA子目錄的內容。預設沒有用到。
L1153-1156, 填充 OTA/bin子目錄的內容,這是OTA升級自己使用的程式。後面會遇到。
OTA/bin$ tree
.
├── applypatch
├── applypatch_static
├── check_prereq
└── updater
L1159-1169, 填充 META子目錄的內容,這裡包含了OTA指令碼需要的一些附加資訊。
L1170-1171,將所有內容打包。供下一階段使用。
L1173-1174,生成 META/filesystem_config.txt 並將其加入到 zip 包中。該檔案儲存了 system 目錄下各目錄、檔案的許可權及 owner.
$ head META/filesystem_config.txt
system 0 0 755
system/usr 0 0 755
system/usr/srec 0 0 755
system/usr/srec/config 0 0 755
system/usr/srec/config/en.us 0 0 755
system/usr/srec/config/en.us/grammars 0 0 755
system/usr/srec/config/en.us/grammars/phone_type_choice.g2g 0 0 644
system/usr/srec/config/en.us/grammars/VoiceDialer.g2g 0 0 644
system/usr/srec/config/en.us/grammars/boolean.g2g 0 0 644
system/usr/srec/config/en.us/g2p 0 0 755
這裡,目錄由 zipinfo –l 提供, 而許可權則由 fs_config 設定。此程式的原始碼位於:build/tools/fs_config, 其中fs_config 包含了一個頭檔案:
這個檔案(system/core/include/private/android_filesystem_config.h)以hardcoding 的方式設定了 system 下各目錄、檔案的許可權、屬主。比如:
152 { 00440, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.rc" },
153 { 00550, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.sh" },
154 { 00440, AID_ROOT, AID_SHELL, "system/etc/init.trout.rc" },
155 { 00550, AID_ROOT, AID_SHELL, "system/etc/init.ril" },
如果需要升級其它內容,比如 bootloader, 則可以在這裡加入。
步驟二
編譯指令碼如下:
(From: build/core/Makefile)
- 1186 name := $(TARGET_PRODUCT)
- 1187 ifeq ($(TARGET_BUILD_TYPE),debug)
- 1188 name := $(name)_debug
- 1189 endif
- 1190 name := $(name)-ota-$(FILE_NAME_TAG)
- 1191
- 1192 INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip
- 1193
- 1194 $(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
- 1195
- 1196 ifeq ($(TARGET_OTA_SCRIPT_MODE),)
- 1197 # default to "auto"
- 1198 $(INTERNAL_OTA_PACKAGE_TARGET): scriptmode := auto
- 1199 else
- 1200 $(INTERNAL_OTA_PACKAGE_TARGET): scriptmode := $(TARGET_OTA_SCRIPT_MODE)
- 1201 endif
- 1202
- 1203 $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(OTATOOLS)
- 1204 @echo "Package OTA: [email protected]"
- 1205 $(hide) ./build/tools/releasetools/ota_from_target_files /
- 1206 -m $(scriptmode) /
- 1207 -p $(HOST_OUT) /
- 1208 -k $(KEY_CERT_PAIR) /
- 1209 $(BUILT_TARGET_FILES_PACKAGE) [email protected]
核心是一個python指令碼: ota_from_target_files, 它以前一步驟生成的ZIP包作為輸入,生成可用於OTA升級的zip包。 具體內容我們後文繼續分析。
相關推薦
Android+OTA+升級之一:編譯升級包---make+otapackage
Android OTA 升級之一:編譯升級包 作者: 宋立新 前言 OTA 升級是 Android 系統提供的標準軟體升級方式。 它功能強大,提供了完全升級、增量升級模式,可以通過 SD卡升級,也可以通過網路升級。 這裡,我們先研究最簡單的情況
Android OTA升級(1):編譯升級全包
2013-3-23 Android原生系統中就已經支援OTA升級。所謂OTA升級就是通過空中介面獲取升級包,然後更新系統韌體。一般地,升級包無論如何獲取,哪怕是直接TCard本地升級,也被稱為OTA升級。 OTA升級首要是生成OTA升級包,升級包又分為升級全包
【Android】實用教程:匯入SlidingMenu包,不用在GitHub下載(Android Studio 3.1.2)
轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/80192923 【AS版本】 【步驟】 1、開啟Project Structural。(可點選圖示,也可以在File選單中開啟,也可以按Ctrl+Al
Android列表用法之一:實戰簡單ListView
ListView這個列表控制元件,是我們在開發當中使用頻率比較高的一個控制元件。 既然是使用頻率比較高,那麼我們就有必要將它的使用方式儲存,方便以後直接複製貼上,把注意力放在架構上面,不用經常做程式碼搬運工(重複搬運)。 當然Android的API也提供了許多建立ListView介面卡的快
Nginx 之一:編譯安裝nginx 1.8.1 及配置
一:基介紹 官網地址www.nginx.org,nginx是由1994年畢業於俄羅斯國立莫斯科鮑曼科技大學的同學為俄羅斯rambler.ru公司開發的,開發工作最早從2002年開始,第一次公開發布時間是2004年10月4日,版本號是0.1.0 Nginx是單程序單執行緒模型,即啟
Android實戰技巧之一:文字與佈局(字串變數在資源裡替換)
//別看這個標題挺大,其實這次要說的只是3個小技巧。 //2014.11.7 update 1、字串資源裡變數替換 工作中是拒絕硬編碼的,Android裡會把一些字串等放在xml中當做資源使用,如專案中values下的strings.xml列出了app_name.
Android網路程式設計之一:原生網路訪問簡單封裝
前言:轉眼間2017了,去年給自己定的一週一篇部落格被拖成了一月一篇,後來忙著找工作也荒廢了。竟然還被CSDN部落格之星提名,又點燃了擼部落格的激情。 作為一個android codder,網略訪問基本上在專案中都會用到,常用的獲取JSON資料、下載檔案(
android學習筆記之一:快速入門
1.手機制式 1G-4G 1G(第一代模擬製式手機): 大哥大 特點:安全性差,容易受干擾,通話不穩定,不能發簡訊 2G(第二代GSM、CDMA等數字手機): 小靈通等功能機 特點:通
Android Gradle 技巧之一: Build Variant 相關
Build Variant android gradle 外掛,允許對最終的包以多個維度進行組合。 BuildVariant = ProductFlavor x BuildType 兩個維度 最常見的就是這樣: productFlavors { pro { }
原 AS升級3.1 編譯報錯:The SourceSet 'instrumentTest' is not recognized by the Android Gradle Plugin.
AndroidStudio升級到3.1後編譯報錯:The SourceSet ‘instrumentTest’ is not recognized by the Android Gradle Plugin.專案中 gradle 配置sourceSets { main
android studio 3.0 升級問題:原來module中的包沒法引用
問題 Android studio升級到3.0以上之後,也隨之升級到了3.0.0版本。 classpath 'com.android.tools.build:gradle:3.0.0' 在3.0版本中,compile 指令被標註為過時方法,而新增了兩個
Android OTA升級包製作指令碼詳解(一,引數解析)
寫在前面: “build/tools/releasetools/ota_from_target_files -u lk.bin -n target.zip update.zip”這是製作整包的命令,很顯然這裡支援lk升級。本系列博文主要對該命令的執行流程及原理進
[dotnetCore2.0]學習筆記之一: ASP.NET Core 升級到2.0
玩耍 後來 razor ons 引用 net ins install 查找 需要升級: 1、SDK2.0 ,需要單獨安裝;https://www.microsoft.com/net/core#windowscmd VS2017 不包含這個SDK;而這個SDK包含了run
nRF52832 BLE_DFU空中升級OTA(二)編譯下載(SDK14.2.0)
上一篇配置好了開發環境,現在就可以試著跑一下例程了,這裡需要兩個例程,一個是bootloader的,一個是應用程式的,其路徑分別為: bootloader:SDK_14.2.0工程\examples\dfu\bootloader_secure_ble\pca10040\arm5_no_packs 應用程式
Android OTA線上升級一(架構分析)
1、前言 OTA(Over-the-Air Technology)空中下載技術。是通過行動通訊(GSM或CDMA)的空中介面對SIM卡資料及應用進行遠端管理的技術。空中介面可以採用WAP、GPRS、CDMA1X及短訊息技術。OTA技術的應用,使得行動通訊不僅可以提供語音和資料服務,而且還能提供新業
【Android開發】app升級報錯,解析包時出現錯誤(華為手機8.0系統)
問題描述: 今天釋出app版本升級,碰到華為手機8.0系統,安裝升級的時候提示,解析包時出現問題。而其他手機都是正常的。而且當我的包沒有經過360加固的時候,也是可以去升級新版本,加固過後就不行了。 這個導致這個問題的原因有很多,我先把我這邊app的問題處理方案介紹給大家
Android OTA升級新舊版本任意升級
1. Android升級到較新的版本後,想用.zip升級包升回舊的版本時,在升級時會發錯。這是由於android系統時對升級檔案有版本檢測。 2. build/tools/releasetools/ota_from_target_files: def main(argv):
Android OTA升級原理和流程分析(一)
這篇及以後的篇幅將通過分析update.zip包在具體Android系統升級的過程,來理解Android系統中Recovery模式服務的工作原理。我們先從update.zip包的製作開始,然後是Android系統的啟動模式分析,Recovery工作原理,如何從
Android OTA差分包升級失敗
升級失敗log如下:I update_engine: [0530/162336:INFO:delta_performer.cc(359)] Applying 21701 operations to partition "system" E update_engine: [05
Android OTA升級原理和流程分析(三)---Android系統的三種啟動模式
以下的篇幅開始分析我們在上兩個篇幅中生成的update.zip包在具體更新中所經過的過程,並根據原始碼分析每一部分的工作原理。 一、 系統更新update.zip包的兩種方式 1. 通過上一個文件,我們知道了怎樣製作一個updat