Android OTAアップグレード(一):アップグレードパッケージのコンパイル
11462 ワード
1.OTA機能紹介OTAアップグレードはAndroidシステムが提供する標準的なソフトウェアアップグレード方式である.フルアップグレードとインクリメンタルアップグレードモードを提供し、SDカードまたはUディスクでアップグレードできます.また、ネットワークでアップグレードできます.ここでは、まず最も簡単な状況を検討し、SDカードによる完全なアップグレードを行います.
2.コンパイルOTAフルアップグレードパッケージ1)まずandroid 2)make otapackageをコンパイルすると入手できる:out/target/product/{product_name}/{product_name}-ota-eng.{uid}.zip
3)このファイルをupdateと改名する.zipはSDカードルートディレクトリに格納し、recoveryモードでのOTAアップグレードを開始します.
3.コンパイルプロセスの研究
主に2つのステップに分けられます.最初のステップは、システムディレクトリなどのアップグレードに必要なコンテンツ(原材料)を含むパッケージを用意します.ステップ2でpythonスクリプトを実行します./build/tools/releasetools/ota_from_target_filesは,最初のステップで用意したZIPパケットを入力として,最終的に必要なアップグレードパケットを生成する.
1)手順1のコンパイルスクリプトは次のとおりです.(From:build/core/Makefile)
これにより,1)L 1089−1090という多くのコンテンツが追加され,ディレクトリが作成される.2)L 1091-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 L 1109-1125、FACTORYサブディレクトリの内容を充填し、使用しなかった.kernelのimage L 1126-143、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->res/system/res├-sbin├-sys└-system L 1144-146、RADIOサブディレクトリの内容を埋め込み、使用しません.L 1147−149は、SYSTEMサブディレクトリの内容を充填する.これはアップグレードの主な内容です.L 1150-1152、DATAサブディレクトリの内容を入力します.デフォルトでは使用されません.L 1153-1156は、OTA/binサブディレクトリの内容を入力し、これはOTAアップグレードが自分で使用するプログラムです.後ろで出会う.OTA/bin$ tree . ├── applypatch ├── applypatch_static ├── check_prereq└--updater L 1159-1169、METAサブディレクトリの内容を入力します.ここにはOTAスクリプトに必要な追加情報が含まれています.L 1170-171、すべてのコンテンツをパッケージ化します.次の段階で使用します.L 1173-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/g 2 p 0 755ここで、ディレクトリはzipinfo–lによって提供され、権限はfs_によって提供されます.config設定.このプログラムのソースコードは、build/tools/fs_にあります.config、fs_configには、54#include"private/android_filesystem_config.h"というヘッダファイル(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.init.trout.rc"},155{ 00550,AID_SHELL,"system/etc/etc/init.ril"},155{ 00550,{00550、bootloaderなどの他のコンテンツをアップグレードする必要がある場合は、ここに参加してください.2)ステップ2のコンパイルスクリプトは次のとおりです.
(From: build/core/Makefile)
コアはpythonスクリプトです:ota_from_target_filesは、以前のステップで生成されたZIPパケットを入力として、OTAアップグレードに使用できるzipパケットを生成します.具体的な内容は後文で分析を続けます.
2.コンパイルOTAフルアップグレードパッケージ1)まずandroid 2)make otapackageをコンパイルすると入手できる:out/target/product/{product_name}/{product_name}-ota-eng.{uid}.zip
3)このファイルをupdateと改名する.zipはSDカードルートディレクトリに格納し、recoveryモードでのOTAアップグレードを開始します.
3.コンパイルプロセスの研究
主に2つのステップに分けられます.最初のステップは、システムディレクトリなどのアップグレードに必要なコンテンツ(原材料)を含むパッケージを用意します.ステップ2でpythonスクリプトを実行します./build/tools/releasetools/ota_from_target_filesは,最初のステップで用意したZIPパケットを入力として,最終的に必要なアップグレードパケットを生成する.
1)手順1のコンパイルスクリプトは次のとおりです.(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: $@"
1089 $(hide) rm -rf $@ $(zip_root)
1090 $(hide) mkdir -p $(dir $@) $(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 $@) .)
1172 @# Run fs_config on all the system files in the zip, and save the output
1173 $(hide) zipinfo -1 $@ | 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 $@) META/filesystem_config.txt)
これにより,1)L 1089−1090という多くのコンテンツが追加され,ディレクトリが作成される.2)L 1091-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 L 1109-1125、FACTORYサブディレクトリの内容を充填し、使用しなかった.kernelのimage L 1126-143、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->res/system/res├-sbin├-sys└-system L 1144-146、RADIOサブディレクトリの内容を埋め込み、使用しません.L 1147−149は、SYSTEMサブディレクトリの内容を充填する.これはアップグレードの主な内容です.L 1150-1152、DATAサブディレクトリの内容を入力します.デフォルトでは使用されません.L 1153-1156は、OTA/binサブディレクトリの内容を入力し、これはOTAアップグレードが自分で使用するプログラムです.後ろで出会う.OTA/bin$ tree . ├── applypatch ├── applypatch_static ├── check_prereq└--updater L 1159-1169、METAサブディレクトリの内容を入力します.ここにはOTAスクリプトに必要な追加情報が含まれています.L 1170-171、すべてのコンテンツをパッケージ化します.次の段階で使用します.L 1173-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/g 2 p 0 755ここで、ディレクトリはzipinfo–lによって提供され、権限はfs_によって提供されます.config設定.このプログラムのソースコードは、build/tools/fs_にあります.config、fs_configには、54#include"private/android_filesystem_config.h"というヘッダファイル(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.init.trout.rc"},155{ 00550,AID_SHELL,"system/etc/etc/init.ril"},155{ 00550,{00550、bootloaderなどの他のコンテンツをアップグレードする必要がある場合は、ここに参加してください.2)ステップ2のコンパイルスクリプトは次のとおりです.
(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: $@"
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) $@
コアはpythonスクリプトです:ota_from_target_filesは、以前のステップで生成されたZIPパケットを入力として、OTAアップグレードに使用できるzipパケットを生成します.具体的な内容は後文で分析を続けます.