Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1304567
  • 博文数量: 478
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4833
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-28 11:12
文章分类

全部博文(478)

文章存档

2019年(1)

2018年(27)

2017年(21)

2016年(171)

2015年(258)

我的朋友

分类: Android平台

2015-08-18 09:51:29

http://blog.csdn.net/myarrow/article/details/8110110
 

Android OTA 升级(一): 编译升级包

分类: Android OTA2012-10-25 11:42 1866人阅读 评论(0) 收藏 举报

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. 编译过程研究

主要分两步:
    第一步,准备一个包,其中包含升级需要的内容(原材料),比如,system 目录。
    第二步,运行python 脚本 ./build/tools/releasetools/ota_from_target_files,以第一步准备的ZIP包作为输入,最终生成需要的升级包。

1) 步骤一
编译脚本如下:
(From: build/core/Makefile)
  

[python] view plaincopy
  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. <span style="BACKGROUND-COLOR: #ff0000"><span style="color:#cccccc;">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. </span></span>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)  


由此可见,向其增加了很多内容:
  1)L1089-1090 , 创建一个目录。
  2)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, 则可以在这里加入。
 
2) 步骤二
编译脚本如下:

(From: build/core/Makefile)

 

[python] view plaincopy
  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包。 具体内容我们后文继续分析。
 

 

 


阅读(640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~