<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 189,comments - 115,trackbacks - 0

    Android OTA 升級(jí)之一:編譯升級(jí)包

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

    Android OTA 升級(jí)之一:編譯升級(jí)包

    作者: 宋立新

    Emailzjujoe@yahoo.com

    前言

           OTA 升級(jí)是 Android 系統(tǒng)提供的標(biāo)準(zhǔn)軟件升級(jí)方式。 它功能強(qiáng)大,提供了完全升級(jí)、增量升級(jí)模式,可以通過(guò) SD 卡升級(jí),也可以通過(guò)網(wǎng)絡(luò)升級(jí)。

           這里,我們先研究最簡(jiǎn)單的情況,通過(guò) SD 卡進(jìn)行完全升級(jí)。

           如何執(zhí)行升級(jí)就不多說(shuō)了,網(wǎng)上有很多資料。(比如,介紹HTC手機(jī)如何升級(jí))。我們感興趣的是它是如何實(shí)現(xiàn)的,作為開(kāi)發(fā)者,如何修改它以符合我們的定制化需求。

           首先,我們研究一下 ota 升級(jí)包的編譯過(guò)程。

    Quick start

           首先編譯出android, 然后執(zhí)行:

    make otapackage

        即可獲得:out/target/product/{product_name}/ {product_name}-ota-eng.{uid}.zip

        將該文件改名為update.zip放到T卡根目錄, 即可開(kāi)始recovery模式下的 OTA 升級(jí)。

    編譯過(guò)程研究

     

    主要分兩步,第一步, 會(huì)準(zhǔn)備一個(gè)包,其中包含升級(jí)需要的內(nèi)容(原材料),比如,system 目錄。

    第二步,運(yùn)行python 腳本 ./build/tools/releasetools/ota_from_target_files,以步驟一準(zhǔn)備的ZIP包作為輸入,最終生成需要的升級(jí)包。

     

    步驟一

    編譯腳本如下:

    (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)  

     

    可見(jiàn)往里面添加了很多內(nèi)容。

    L1089-1090 , 造一個(gè)目錄。

    L1091-1108,填充 RECOVERY 子目錄的內(nèi)容。用于生成recovery.img。包括:kernel 的image, recovery 根文件系統(tǒng)的 image, recovery 根文件系統(tǒng)的內(nèi)容:
    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 子目錄的內(nèi)容, 沒(méi)有用到,包括:kernel 的image 
    L1126-1143, 填充 BOOT子目錄的內(nèi)容,用于生成boot.img。和 RECOVERY目錄類(lèi)似,包括:kernel 的image,根文件系統(tǒng)的 image,根文件系統(tǒng)的內(nèi)容:
    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子目錄的內(nèi)容, 沒(méi)有用到。
    L1147-1149, 填充 SYSTEM子目錄的內(nèi)容。 這是升級(jí)的主要內(nèi)容。
    L1150-1152, 填充 DATA子目錄的內(nèi)容。缺省沒(méi)有用到。
    L1153-1156, 填充 OTA/bin子目錄的內(nèi)容,這是OTA升級(jí)自己使用的程序。后面會(huì)遇到。
    OTA/bin$ tree
    .
    ├── applypatch
    ├── applypatch_static
    ├── check_prereq
    └── updater
    L1159-1169, 填充 META子目錄的內(nèi)容,這里包含了OTA腳本需要的一些附加信息。
    L1170-1171,將所有內(nèi)容打包。供下一階段使用。
    L1173-1174,生成 META/filesystem_config.txt 并將其加入到 zip 包中。該文件保存了 system 目錄下各目錄、文件的權(quán)限及 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 提供, 而權(quán)限則由 fs_config 設(shè)定。此程序的源碼位于:build/tools/fs_config, 其中fs_config 包含了一個(gè)頭文件:
    54 #include "private/android_filesystem_config.h"
    這個(gè)文件(system/core/include/private/android_filesystem_config.h)以hardcoding 的方式設(shè)定了 system 下各目錄、文件的權(quán)限、屬主。比如:
    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" },
     
    如果需要升級(jí)其它內(nèi)容,比如 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) $@  

     

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

    posted on 2011-08-23 09:58 MEYE 閱讀(3166) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Android3D
    主站蜘蛛池模板: 亚洲s码欧洲m码吹潮| 日韩亚洲国产高清免费视频| 亚洲 另类 无码 在线| 中日韩亚洲人成无码网站| 亚洲高清免费在线观看| 亚洲AV无码国产精品色午友在线| 未满十八私人高清免费影院| 国产一区二区三区在线免费| 亚洲私人无码综合久久网| 无码区日韩特区永久免费系列| 91在线精品亚洲一区二区| 免费一级毛片无毒不卡| 亚洲精品无码久久久影院相关影片| 日本激情猛烈在线看免费观看| 国产在线98福利播放视频免费| 亚洲av午夜国产精品无码中文字| 成年男女免费视频网站| 亚洲精品美女网站| 无人影院手机版在线观看免费| 亚洲中文无码线在线观看| 1000部无遮挡拍拍拍免费视频观看| 亚洲天堂在线播放| 免费无码毛片一区二区APP| 亚洲av网址在线观看| 丁香花在线视频观看免费| 亚洲国产精品福利片在线观看| 二个人看的www免费视频| 国产亚洲精品不卡在线| 丝袜捆绑调教视频免费区| 亚洲香蕉网久久综合影视| 在线免费观看h片| 国产亚洲精品美女久久久| 久久精品免费一区二区三区| 亚洲av午夜成人片精品网站| 久久精品私人影院免费看| 亚洲爱情岛论坛永久| 8x8×在线永久免费视频| 亚洲国产成人精品无码区在线秒播 | 久久国产亚洲精品麻豆| 日韩精品免费视频| 亚洲精品中文字幕麻豆|