posts - 189,comments - 115,trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(35)

          我參與的團隊

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          Android

          BLOGS

          Econormic

          Friend-Blog

          Guitar

          J2ME

          JAVA

          Linux

          Linux_driver

          MUSIC

          MY--BLOG

          NET

          NEWS

          ORACLE

          Project

          SOFT

          STUDY

          Sutra<==>Research

          SVN

          Translate

          Vim

          在線翻譯

          娛樂

          文檔教程

          考研

          裝修

          軟件開發

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Android OTA 升級之一:編譯升級包

          http://blog.csdn.net/zjujoe/article/details/6206010

          Android OTA 升級之一:編譯升級包

          作者: 宋立新

          Emailzjujoe@yahoo.com

          前言

                 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)

           

           

          1. 1073 # Depending on the various images guarantees that the underlying  
          2. 1074 # directories are up-to-date.  
          3. 1075 $(BUILT_TARGET_FILES_PACKAGE): /  
          4. 1076                 $(INSTALLED_BOOTIMAGE_TARGET) /  
          5. 1077                 $(INSTALLED_RADIOIMAGE_TARGET) /  
          6. 1078                 $(INSTALLED_RECOVERYIMAGE_TARGET) /  
          7. 1079                 $(INSTALLED_FACTORYIMAGE_TARGET) /  
          8. 1080                 $(INSTALLED_SYSTEMIMAGE) /  
          9. 1081                 $(INSTALLED_USERDATAIMAGE_TARGET) /  
          10. 1082                 $(INSTALLED_SECROIMAGE_TARGET) /  
          11. 1083                 $(INSTALLED_ANDROID_INFO_TXT_TARGET) /  
          12. 1084                 $(built_ota_tools) /  
          13. 1085                 $(APKCERTS_FILE) /  
          14. 1086                 $(HOST_OUT_EXECUTABLES)/fs_config /  
          15. 1087                 | $(ACP)  
          16. 1088         @echo "Package target files: $@"  
          17. 1089         $(hide) rm -rf $@ $(zip_root)  
          18. 1090         $(hide) mkdir -p $(dir $@) $(zip_root)  
          19. 1091         @# Components of the recovery image  
          20. 1092         $(hide) mkdir -p $(zip_root)/RECOVERY  
          21. 1093         $(hide) $(call package_files-copy-root, /  
          22. 1094                 $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/RECOVERY/RAMDISK)  
          23. 1095 ifdef INSTALLED_KERNEL_TARGET  
          24. 1096         $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/RECOVERY/kernel  
          25. 1097         $(hide) $(ACP) $(recovery_ramdisk) $(zip_root)/RECOVERY/ramdisk  
          26. 1098 endif  
          27. 1099 ifdef INSTALLED_2NDBOOTLOADER_TARGET  
          28. 1100         $(hide) $(ACP) /  
          29. 1101                 $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/RECOVERY/second  
          30. 1102 endif  
          31. 1103 ifdef BOARD_KERNEL_CMDLINE  
          32. 1104         $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/RECOVERY/cmdline  
          33. 1105 endif  
          34. 1106 ifdef BOARD_KERNEL_BASE  
          35. 1107         $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/RECOVERY/base  
          36. 1108 endif  
          37. 1109         @# Components of the factory image  
          38. 1110         $(hide) mkdir -p $(zip_root)/FACTORY  
          39. 1111         $(hide) $(call package_files-copy-root, /  
          40. 1112                 $(TARGET_FACTORY_ROOT_OUT),$(zip_root)/FACTORY/RAMDISK)  
          41. 1113 ifdef INSTALLED_KERNEL_TARGET  
          42. 1114         $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/FACTORY/kernel  
          43. 1115 endif  
          44. 1116 ifdef INSTALLED_2NDBOOTLOADER_TARGET  
          45. 1117         $(hide) $(ACP) /  
          46. 1118                 $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/FACTORY/second  
          47. 1119 endif  
          48. 1120 ifdef BOARD_KERNEL_CMDLINE  
          49. 1121         $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/FACTORY/cmdline  
          50. 1122 endif  
          51. 1123 ifdef BOARD_KERNEL_BASE  
          52. 1124         $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/FACTORY/base  
          53. 1125 endif  
          54. 1126         @# Components of the boot image  
          55. 1127         $(hide) mkdir -p $(zip_root)/BOOT  
          56. 1128         $(hide) $(call package_files-copy-root, /  
          57. 1129                 $(TARGET_ROOT_OUT),$(zip_root)/BOOT/RAMDISK)  
          58. 1130 ifdef INSTALLED_KERNEL_TARGET  
          59. 1131         $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel  
          60. 1132         $(hide) $(ACP) $(INSTALLED_RAMDISK_TARGET) $(zip_root)/BOOT/ramdisk  
          61. 1133 endif  
          62. 1134 ifdef INSTALLED_2NDBOOTLOADER_TARGET  
          63. 1135         $(hide) $(ACP) /  
          64. 1136                 $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second  
          65. 1137 endif  
          66. 1138 ifdef BOARD_KERNEL_CMDLINE  
          67. 1139         $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline  
          68. 1140 endif  
          69. 1141 ifdef BOARD_KERNEL_BASE  
          70. 1142         $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base  
          71. 1143 endif  
          72. 1144         $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),/  
          73. 1145                     mkdir -p $(zip_root)/RADIO; /  
          74. 1146                     $(ACP) $(t) $(zip_root)/RADIO/$(notdir $(t));)  
          75. 1147         @# Contents of the system image  
          76. 1148         $(hide) $(call package_files-copy-root, /  
          77. 1149                 $(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM)  
          78. 1150         @# Contents of the data image  
          79. 1151         $(hide) $(call package_files-copy-root, /  
          80. 1152                 $(TARGET_OUT_DATA),$(zip_root)/DATA)  
          81. 1153         @# Extra contents of the OTA package  
          82. 1154         $(hide) mkdir -p $(zip_root)/OTA/bin  
          83. 1155         $(hide) $(ACP) $(INSTALLED_ANDROID_INFO_TXT_TARGET) $(zip_root)/OTA/  
          84. 1156         $(hide) $(ACP) $(PRIVATE_OTA_TOOLS) $(zip_root)/OTA/bin/  
          85. 1157         @# Files that do not end up in any images, but are necessary to  
          86. 1158         @# build them.  
          87. 1159         $(hide) mkdir -p $(zip_root)/META  
          88. 1160         $(hide) $(ACP) $(APKCERTS_FILE) $(zip_root)/META/apkcerts.txt  
          89. 1161         $(hide) echo "$(PRODUCT_OTA_PUBLIC_KEYS)" > $(zip_root)/META/otakeys.txt  
          90. 1162         $(hide) echo "$(PRIVATE_RECOVERY_API_VERSION)" > $(zip_root)/META/recovery-api-version.txt  
          91. 1163         $(hide) echo "blocksize $(BOARD_FLASH_BLOCK_SIZE)" > $(zip_root)/META/imagesizes.txt  
          92. 1164         $(hide) echo "boot $(call image-size-from-data-size,$(BOARD_BOOTIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt  
          93. 1165         $(hide) echo "recovery $(call image-size-from-data-size,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt  
          94. 1166         $(hide) echo "system $(call image-size-from-data-size,$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt  
          95. 1167         $(hide) echo "secro $(call image-size-from-data-size,$(BOARD_SECROIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt  
          96. 1168         $(hide) echo "userdata $(call image-size-from-data-size,$(BOARD_USERDATAIMAGE_PARTITION_SIZE))" >> $(zip_root)/META/imagesizes.txt  
          97. 1169         $(hide) echo "$(tool_extensions)" > $(zip_root)/META/tool-extensions.txt  
          98. 1170         @# Zip everything up, preserving symlinks  
          99. 1171         $(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)  
          100. 1172         @# Run fs_config on all the system files in the zip, and save the output  
          101. 1173         $(hide) zipinfo -1 $@ | awk -F/ 'BEGIN { OFS="/" } /^SYSTEM/// {$$1 = "system"; print}' | $(HOST_OUT_EXECUTABLES)/fs_config > $(zip_root)/META/filesystem_config.txt  
          102. 1174         $(hide) (cd $(zip_root) && zip -q ../$(notdir $@) 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 包含了一個頭文件:
          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.ril" },
           
          如果需要升級其它內容,比如 bootloader, 則可以在這里加入。
           

          步驟二

          編譯腳本如下:

          (From: build/core/Makefile)

          1. 1186 name := $(TARGET_PRODUCT)  
          2. 1187 ifeq ($(TARGET_BUILD_TYPE),debug)  
          3. 1188   name := $(name)_debug  
          4. 1189 endif  
          5. 1190 name := $(name)-ota-$(FILE_NAME_TAG)  
          6. 1191   
          7. 1192 INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip  
          8. 1193   
          9. 1194 $(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)  
          10. 1195   
          11. 1196 ifeq ($(TARGET_OTA_SCRIPT_MODE),)  
          12. 1197 # default to "auto"  
          13. 1198 $(INTERNAL_OTA_PACKAGE_TARGET): scriptmode := auto  
          14. 1199 else  
          15. 1200 $(INTERNAL_OTA_PACKAGE_TARGET): scriptmode := $(TARGET_OTA_SCRIPT_MODE)  
          16. 1201 endif  
          17. 1202   
          18. 1203 $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(OTATOOLS)  
          19. 1204         @echo "Package OTA: $@"  
          20. 1205         $(hide) ./build/tools/releasetools/ota_from_target_files /  
          21. 1206            -m $(scriptmode) /  
          22. 1207            -p $(HOST_OUT) /  
          23. 1208            -k $(KEY_CERT_PAIR) /  
          24. 1209            $(BUILT_TARGET_FILES_PACKAGE) $@  

           

          核心是一個python腳本: ota_from_target_files, 它以前一步驟生成的ZIP包作為輸入,生成可用于OTA升級的zip包。 具體內容我們后文繼續分析。

          posted on 2011-08-23 09:58 MEYE 閱讀(3170) 評論(0)  編輯  收藏 所屬分類: Android3D
          主站蜘蛛池模板: 新密市| 剑川县| 石屏县| 紫云| 儋州市| 西乌珠穆沁旗| 巨鹿县| 济宁市| 光泽县| 浙江省| 台东县| 西吉县| 曲阜市| 武威市| 涟源市| 阳高县| 武陟县| 鹿泉市| 岳阳县| 铜川市| 宁海县| 平乐县| 北辰区| 枣庄市| 县级市| 忻城县| 平利县| 邯郸县| 土默特右旗| 晋江市| 岳西县| 九台市| 白山市| 布尔津县| 比如县| 肥东县| 兰州市| 怀远县| 东乡| 东阿县| 满城县|