Android recovery更新简单流程及注意点

关于recovery更新相关的几点总结记录:

1、recovery升级的大致流程:

        ①编译:执行make otapackage

        ②.main system模式下,将升级包重名为update.zip,下载到/cache目录下

        ③.创建文件/cache/recovery/command,并向command中写入:--update_package=/cache/update.zip

        ④终端执行reboot recovery进入recovery模式,也可以通过android上层调用函数android_reboot,并设置进入recovery模式的代码

        ⑤.系统重启,进入recovery模式,并启动recovery进程,该进程会检测/cache/recovery/command的内容,然后升级update.zip。

2、命令文件/cache/recovery/command:保存着Main system传给Recovery的命令行,每一行就是一条命令,支持一下几种的组合。

--send_intent=anystring   //write the text out to recovery/intent

//在Recovery结束时在finish_recovery函数中将定义的intent字符串作为参数传进来,并写入到/cache/recovery/intent中

--update_package=root:path

//verify install an OTA package file     Main system将这条命令写入时,代表系统需要升级,在进入Recovery模式后,

//将该文件中的命令读取并写入BCB中,然后进行相应的更新update.zip包的操作。

                --wipe_data    //erase user data(and cache),then reboot。擦除用户数据。擦除data分区时必须要擦除cache分区。

                --wipe_cache   //wipe cache(but not user data),then reboot。擦除cache分区。

3、recovery时分区相关需要与system主模式的分区号一致

位置:bootable/bootloader/uboot-imx/include/autoconf.mk

CONFIG_ANDROID_CACHE_PARTITION_MMC=12

CONFIG_ANDROID_RECOVERY_PARTITION_MMC=6

CONFIG_ANDROID_SYSTEM_PARTITION_MMC=5

CONFIG_ANDROID_RECOVERY_CMD_FILE="/recovery/command"

4、bootable/recovery/recovery.c修改

#LOCAL_MODULE_TAGS := eng

如果放开这行,将只会在eng版本软件中有copy到/system/bin的动作

5、build/core/Makefile修改

$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)

        @echo "Package OTA: $@"

        $(hide) ./build/tools/releasetools/ota_from_target_files -v \

           -p $(HOST_OUT) \

           -k $(KEY_CERT_PAIR) \

           -n \

-w \

-n在升级时是否不检查时间戳,缺省要检查,即缺省情况下只能基于旧版本升级

 -w是否清除userdata分区

注:如果/cache/recovery/last_log中出现如下错误则说明升级包较旧导致终止执行,可以加上上面说的-n项

assert failed: !less_than_int(1397801920, getprop("ro.build.date.utc"))

6、recovery的log文件放在/cache/recovery/

last_install

last_locale:上次recovery使用的语言,如在更新时界面显示的提示语的语种,英语、日语等

last_log:log

7、检测命令文件/cache/recovery/command函数是int check_recovery_cmd_file(void)在如下文件中定义

"bootable/bootloader/uboot-imx/board/freescale/mx6q_sabresd/mx6q_sabresd.c"

8、recovery升级最终是通过执行updater-script脚本来进行的。下面是部分注释供参考。

点击(此处)折叠或打开

assert(getprop("ro.product.device") == "sabresd_6dq" ||

getprop("ro.build.product") == "sabresd_6dq");

//show_progress(frac,sec):frac表示进度完成的数值,sec表示整个过程的总秒数。主要用与显示UI上的进度条。

show_progress(0.500000, 0);

//format(fs_type,partition_type,location):fs_type,文件系统类型,取值一般为“yaffs2”或“ext4”。Partition_type,分区类型,一般取值为“MTD”或则“EMMC”。主要用于格式化为指定的文件系统。

format("ext4", "EMMC", "/dev/block/mmcblk0p5", "0", "/system");

//挂在一个文件系统/system到指定挂载点mmcblk0p5

mount("ext4", "EMMC", "/dev/block/mmcblk0p5", "/system");

//package_extract_dir(src_path,destination_path):src_path,要提取的目录,destination_path目标目录。作用:从升级包内,提取目录到指定的位置。

package_extract_dir("recovery", "/system");//提取recovery

package_extract_dir("system", "/system");//提取system

//创建符号链接

symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");

symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");

symlink("mksh", "/system/bin/sh");

symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",

"/system/bin/chown", "/system/bin/cmp", "/system/bin/cp",

"/system/bin/date", "/system/bin/dd", "/system/bin/df",

"/system/bin/dmesg", "/system/bin/du", "/system/bin/getevent",

"/system/bin/getprop", "/system/bin/grep", "/system/bin/hd",

"/system/bin/id", "/system/bin/ifconfig", "/system/bin/iftop",

"/system/bin/insmod", "/system/bin/ioctl", "/system/bin/ionice",

"/system/bin/kill", "/system/bin/ln", "/system/bin/log",

"/system/bin/ls", "/system/bin/lsmod", "/system/bin/lsof",

"/system/bin/md5", "/system/bin/mkdir", "/system/bin/mount",

"/system/bin/mv", "/system/bin/nandread", "/system/bin/netstat",

"/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv",

"/system/bin/ps", "/system/bin/reboot", "/system/bin/renice",

"/system/bin/rm", "/system/bin/rmdir", "/system/bin/rmmod",

"/system/bin/route", "/system/bin/schedtop", "/system/bin/sendevent",

"/system/bin/setconsole", "/system/bin/setprop", "/system/bin/sleep",

"/system/bin/smd", "/system/bin/start", "/system/bin/stop",

"/system/bin/sync", "/system/bin/top", "/system/bin/touch",

"/system/bin/umount", "/system/bin/uptime", "/system/bin/vmstat",

"/system/bin/watchprops",

"/system/bin/wipe");

//设置文件或目录权限

set_perm_recursive(0, 0, 0755, 0644, "/system");

set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");

set_perm(0, 3003, 02750, "/system/bin/netcfg");

set_perm(0, 3004, 02755, "/system/bin/ping");

set_perm(0, 2000, 06750, "/system/bin/run-as");

set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");

set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");

set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");

set_perm(0, 0, 0544, "/system/etc/install-recovery.sh");

set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");

set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor");

set_perm(0, 0, 0644, "/system/vendor/etc/audio_effects.conf");

set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");

show_progress(0.200000, 0);

show_progress(0.200000, 10);

//将升级包中的boot.img文件写入到/dev/block/mmcblk0p1

package_extract_file("boot.img", "/dev/block/mmcblk0p1");

show_progress(0.100000, 0);

unmount("/system");

9、updater-script脚本是从python脚本build/tools/releasetools/ota_from_target_files中生成的。

10、更新时的图片显示是在/android4.2-imx6/bootable/recovery/res/images下面

11、Android recovery模式时界面显示的文字是从png文本图片中读取的。目录也是在/android4.2-imx6/bootable/recovery/res/images

如果要显示文字是需要从上层传递locale变量的。如果没有设置或者不知如何设置(我就不知),可以直接修改bootable/recovery/recovery.cpp文件中locale 定义时赋予初始值,如下表示英语_英国

char* locale = "en_GB"

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352