ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年7月2日 星期一

android tools for recovery .

android framework 中有寫好的 recovery function : bootable/recovery
大概就是靠著 bootloader 的 support,決定進入 recovery mode 時,以 boot device 上的 recovery partition 作為 root。

這個特殊的 root 的 init.rc ,讓 系統啟動後,執行 recovery 這個程式。

recovery 的source ,就在 bootable/recovery/ 中。



這個 platform 進入 recovery mode 是依靠 /cache partition 中的 recovery/command 這個檔。
bootloader 找到這個 file 長度不是 0,就會改以 boot_recovery 作為 boot command。

這個專屬的 recovery partition,build 的動作也是寫在 Build/core/Makefile 中: # ----------------------------------------------------------------- # Recovery image # If neither TARGET_NO_KERNEL nor TARGET_NO_RECOVERY are true ifeq (,$(filter true, $(TARGET_NO_RECOVERY) $(BUILD_TINY_ANDROID))) INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img recovery_initrc := $(call include-path-for, recovery)/etc/init.rc #recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system #recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img #recovery_build_prop := $(INSTALLED_BUILD_PROP_TARGET) recovery_binary := $(call intermediates-dir-for,EXECUTABLES,recovery)/recovery recovery_resources_common := $(call include-path-for, recovery)/res recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res)) recovery_resource_deps := $(shell find $(recovery_resources_common) \ $(recovery_resources_private) -type f) recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab)) ifeq ($(recovery_resources_private),) $(info No private recovery resources for TARGET_DEVICE $(TARGET_DEVICE)) endif ifeq ($(recovery_fstab),) $(info No recovery.fstab for TARGET_DEVICE $(TARGET_DEVICE)) endif


這個幾乎不能debug,因為沒有 console,而且只會把東西放到 /cache/recovery/log

很不方便,所以修改 init.rc,把 service recovery 的 option 加上 console。
然後把 recovery.c 的 main( ) 一開始 reopen stdout, stderr 的 code comment 掉,
就可以用 printf 來 debug 了 (唉~~)。

幾點:
  • 會用 console, framebuffer 顯示圖片,如果顯示不出來,查一下 bootloader 的 boot argument,main display port 要設對。
  • /cache/recovery/command 的內容格式很重要,每個option 最後都要是 cr, lf,開始不可以有空白。
  • 最後一行 不可以是 empty,也就是說,最後一個 option 不可以有 cr, lf。否則 recovery 這個程式會死掉,然後 init 又重開她

最後一點就改一下,加上 empty string 的check..

/cache/recovery/command 的內容是: --wipe_data 開頭跟最後都不可以有空白
這個會format data 和 cache partition. (當然,會把 recovery/log copy 回 /cache)

沒有留言:

標籤

網誌存檔