android R vendor.boot-hal-1-1启动失败问题分析
記一個android R上開機啟動vendor.boot-hal-1-1進程啟動失敗的過程分析,總結一下下,也給需要的提供個參考。
問題:
在開機啟動過程中,一直報錯,vendor.boot-hal-1-1無法正常啟動。
看起來是vendor.boot-hal-1-1這個服務起來后,很快就異常了,然后被kill掉了。
如何分析定位?
因為這個log一直打印刷屏,看著有點煩,可以通過如下命令把log打印關閉
好了,現在串口不瘋狂打印log了,可以借助strace進行定位,命令strace 進程名,當然也可以用strace -p 進程pid
strace /vendor/bin/hw/android.hardware.boot@1.1-servicestrace后打印的部分內容如下:
openat(AT_FDCWD, "/vendor/etc/fstab.xxx", O_RDONLY|O_CLOEXEC) = 6 writev(5, [{iov_base="\0\241\nNb\370`\266\236)#", iov_len=11}, {iov_base="\4", iov_len=1}, {iov_base="android.hardware.boot@1.1-servic"..., iov_len=34}, {iov_base="[libfs_mgr]ReadDefaultFstab "..., iov_len=81}], 4) = 127 writev(5, [{iov_base="\0\241\nNb\370`eU8#", iov_len=11}, {iov_base="\6", iov_len=1}, {iov_base="android.hardware.boot@1.1-servic"..., iov_len=34}, {iov_base="Could not find bootloader messag"..., iov_len=79}], 4) = 125 openat(AT_FDCWD, "/dev/pmsg0", O_WRONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) writev(5, [{iov_base="\0\241\nNb\370`/\310E#", iov_len=11}, {iov_base="\6", iov_len=1}, {iov_base="android.hardware.boot@1.1-impl\0", iov_len=31}, {iov_base="Could not initialize BootControl"..., iov_len=40}], 4) = 83 close(6) = 0 exit_group(1) = ? +++ exited with 1 +++根據這里面的打印內容“Could not initialize BootControl”,去代碼中找吧,因為是HIDL的進程,直接去android\hardware\interfaces下面檢索,最后定位到在android/hardware/interfaces/boot/1.1/default/boot_control/libboot_control.cpp
bool BootControl::Init() {std::string device = get_bootloader_message_blk_device(&err);if (device.empty()) {LOG(ERROR) << "**Could not find bootloader message block device**: " << err;return false;}... }繼續追一下get_bootloader_message_blk_device的實現
std::string get_bootloader_message_blk_device(std::string* err) {std::string misc_blk_device = get_misc_blk_device(err);if (misc_blk_device.empty()) return "";if (!wait_for_device(misc_blk_device, err)) return "";return misc_blk_device;}繼續追get_misc_blk_device的實現,從下面的代碼基本上可以斷定是從fstab中找misc分區節點配置了。
std::string get_misc_blk_device(std::string* err) {if (g_misc_device_for_test.has_value() && !g_misc_device_for_test->empty()) {return *g_misc_device_for_test;}Fstab fstab;if (!ReadDefaultFstab(&fstab)) {*err = "failed to read default fstab";return "";}for (const auto& entry : fstab) {if (entry.mount_point == "/misc") {return entry.blk_device;}}*err = "failed to find /misc partition";return "";}回頭一看,果然是fstab.xxx中沒有配置misc分區,添加上
/dev/block/by-name/misc /misc emmc defaults defaults重新編譯,果然就不再報這個問題了。
現在回頭來看一下vendor.boot-hal-1-1啟動的是啥進程,看了一下相關的bp和代碼,這是打開ENABLE_AB = true后,用來OTA A/B升級完成時更新slot信息的進程和相關接口,為了告訴系統應用引導哪個slot a還b鏡像。
好了,就分析到這吧。
總結
以上是生活随笔為你收集整理的android R vendor.boot-hal-1-1启动失败问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iBATIS.NET 学习笔记(五)
- 下一篇: asp动态树菜单集合(3/3)