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)
沒有留言:
張貼留言