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

全部博文(478)

文章存档

2019年(1)

2018年(27)

2017年(21)

2016年(171)

2015年(258)

我的朋友

分类: Android平台

2016-04-19 10:58:42

Email:

前言

       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 目录。

第二步,运行 脚本 ./build/tools/releasetools/ota_from_target_files,以步骤一准备的ZIP包作为输入,最终生成需要的升级包。

 

步骤一

编译脚本如下:

(From: build/core/Makefile)

 

 

 

可见往里面添加了很多内容。

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 包含了一个头文件:
 #include ""
这个文件(system/core/include/private/android_filesystem_config.h)hardcoding 的方式设定了 system 下各目录、文件的权限、属主。比如:
     { 00440, ,      ,     "system/etc/init.goldfish.rc" },
     { 00550, ,      ,     "system/etc/init.goldfish.sh" },
     { 00440, ,      ,     "system/etc/init.trout.rc" },
     { 00550, ,      ,     "system/etc/init.ril" },
 
如果需要升级其它内容,比如 bootloader, 则可以在这里加入。
 

步骤二

编译脚本如下:

(From: build/core/Makefile)

 

核心是一个python脚本: ota_from_target_files, 它以前一步骤生成的ZIP包作为输入,生成可用于OTA升级的zip包。 具体内容我们后文继续分析。

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