首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android OTA晋级(1):编译升级全包

2013-04-02 
Android OTA升级(1):编译升级全包田海立@CSDN2013-3-23Android原生系统中就已经支持OTA升级。所谓OTA升级就

Android OTA升级(1):编译升级全包

田海立@CSDN

2013-3-23

 

     Android原生系统中就已经支持OTA升级。所谓OTA升级就是通过空中接口获取升级包,然后更新系统固件。一般地,升级包无论如何获取,哪怕是直接TCard本地升级,也被称为OTA升级。

     OTA升级首要是生成OTA升级包,升级包又分为升级全包和升级差分包(或要增量包)。升级全包是编译当前系统得到的软件包,这个包很大,有上百兆,但是不依赖与当前手机里的软件版本;升级差分包是对手机两个软件版本做差分,在第一个版本上打patch,得到第二个升级包,所以差分包只能对第一个版本的机器进行升级。

    本文主要讲述升级全包的生成过程。

 

编译升级全包,用下面指令:

#make otapackage

最终生成INTERNAL_OTA_PACKAGE_TARGET,也就是$(PRODUCT_OUT)/$(name).zip。

 

一、升级全包($(PRODUCT_OUT)/$(name).zip)的生成


INTERNAL_OTA_PACKAGE_TARGET依赖于BUILT_TARGET_FILES_PACKAGE

生成规则【在build/core/Makefile中】:

def WriteFullOTAPackage(input_zip, output_zip):  # TODO:how to determine this?  We don't knowwhat version it will  # beinstalled on top of.  For now, we expectthe API just won't  # changevery often.  script =edify_generator.EdifyGenerator(3, OPTIONS.info_dict)   metadata= {"post-build": GetBuildProp("ro.build.fingerprint",input_zip),             "pre-device": GetBuildProp("ro.product.device",input_zip),              "post-timestamp":GetBuildProp("ro.build.date.utc", input_zip),             }  device_specific = common.DeviceSpecificParams(     input_zip=input_zip,     input_version=OPTIONS.info_dict["recovery_api_version"],     output_zip=output_zip,     script=script,     input_tmp=OPTIONS.input_tmp,     metadata=metadata,     info_dict=OPTIONS.info_dict,     trusted_boot=OPTIONS.trusted_boot) #  if not OPTIONS.omit_prereq:#    ts =GetBuildProp("ro.build.date.utc", input_zip)#   script.AssertOlderBuild(ts) # AppendAssertions(script, input_zip)# device_specific.FullOTA_Assertions()  script.ShowProgress(0.9, 16)   if OPTIONS.wipe_user_data:   script.FormatPartition("/data")  script.FormatPartition("/system") script.Mount("/system")# script.UnpackPackageDir("recovery", "/system") script.UnpackPackageDir("system", "/system")   symlinks= CopySystemFiles(input_zip, output_zip) script.MakeSymlinks(symlinks) # boot_img = common.File("boot.img", common.BuildBootableImage(#     os.path.join(OPTIONS.input_tmp, "BOOT")))# recovery_img = common.File("recovery.img",common.BuildBootableImage(#     os.path.join(OPTIONS.input_tmp, "RECOVERY")))# MakeRecoveryPatch(output_zip, recovery_img, boot_img) Item.GetMetadata(input_zip) Item.Get("system").SetPermissions(script) # common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict)# common.ZipWriteStr(output_zip, "boot.img", boot_img.data)# script.ShowProgress(0.2, 0) # script.ShowProgress(0.2, 10)# script.WriteRawImage("/boot", "boot.img") # script.ShowProgress(0.1, 0) device_specific.FullOTA_InstallEnd()   if OPTIONS.extra_script is not None:   script.AppendExtra(OPTIONS.extra_script)  script.UnmountAll() script.AddToZip(input_zip, output_zip)  WriteMetadata(metadata,output_zip)


OTA全包生成的过程

1.      script用来生成Edify脚本,在edify_generator.py中实现;

2.      script中增加语句:显示进度;

3.      script中增加语句:擦除“/system”分区;

4.      script中增加语句:安装system分区到“/system”;

5.      script中增加语句:把system中的内容复制到/system下;

6.      把input_zip包/system中的内容,复制到output_zip包中,不包含其中的link文件;

7.      对于link文件,script中增加指向链接的语句;

8.      从input_zip包的META/filesystem_config.txt中获取其中描述的/system下各个文件的权限信息;

9.      script中增加语句:设置/system下文件的权限和属主信息;

10.  调用具体device特定的函数FullOTA_InstallEnd。

     main()函数中已经获取OPTIONS.device_specific为/device/<company>/<product>/recovery;这里的device_specific是common.DeviceSpecificParams。

     common实现在common.py中,在判断出OPTIONS.device_specific为目录时,用该目录下的releasetools.py脚本。所以这里执行releasetools.py中的FullOTA_InstallEnd。

11.  如果特别指定了其他脚本,script中加入;

12.  通过script.AddToZip()写META-INF

    把前面所有的脚本,写入到output_zip里的META-INF/com/google/android/updater-script这个edify脚本中;

    把input_zip里的OTA/bin/updater写入到output_zip里的META-INF/com/google/android/update-binary

13.  把metadata的内容写入到output_zip里的META-INF/com/android/metadata

 

总结


    本文分析了Android OTA全包的编译生成过程。首先生成中间包,这个包是后续全包生成的基础,也是差分包生成的基础,接着解析了生成最终升级全包的过程。通过分析知道升级包中update-binary和updater-script的来源,对于后续分析OTA升级的过程至关重要。

    差分包的生成在介绍完整个OTA的过程之后,再进一步阐述。

 

热点排行