2015年5月15日 星期五

android recovery

這裡要說的是, android recovery image (在 u-boot 裡被載入啟動的那個) 這個東西, 預設是沒有任何 console output, 只有 log, 但它 log 會擺在 ramdisk (/tmp/recovery.log, /tmp 一開始是被掛成 tmpfs) 裡面, 所以如果 recovery 一半遇上什麼天災人禍, 您就什麼都看不到了.

以下這個改法是直接導到 console, console 不存在時再導回檔案. 而這個 code 我只能確定 android 4.3 & 4.4.3 的 recovery code 長這樣, 其它有被怎麼改過的我就不知道不保證.

google AOSP folder bootable/recovery/recovery.cpp
約 921 行
int
main(int argc, char **argv) {
    time_t start = time(NULL);

-   freopen(TEMPORARY_LOG_FILE, "a", stdout); setbuf(stdout, NULL);
-   freopen(TEMPORARY_LOG_FILE, "a", stderr); setbuf(stderr, NULL);

+       {
+               char logf[PROPERTY_VALUE_MAX+6] = "/dev/";
+               property_get("ro.boot.console", logf + 5, TEMPORARY_LOG_FILE);
+               freopen(logf, "a", stdout); setbuf(stdout, NULL);
+               freopen(logf, "a", stderr); setbuf(stderr, NULL);
+       }

這樣就可以看的到 /sbin/recovery 運作時的錯誤訊息, 也可以埋 debug message 在 recovery 裡.

AOSP 裡做過 source build/envsetup.sh 與 lunch 後
make recovery recoveryimage
就可以重編 recovery 這個 binary, 及重做整個 recovery image.

.ps (20150527) android 2.3.4 code 一樣, ro.boot.console 要改成 ro.console
4.0 以上系統正常來講只有 ro.boot.console 沒有 ro.console, 除非特別修改 /system/core/init/init.c 中的內容把 ro.console 補上..

沒有留言: