问题描述
最近做的一个 MTK 平台的项目客退一台手机,不良现象为: 开机卡死在 android logo 界面,无法正常进入系统。
背景知识
android 手机开机一般都有三帧 boot logo,第一帧是 “Power by android”,第二帧一般是各个手机品牌商的品牌 logo,第三帧就是定制的开机动画了。
此问题是没有跳转到第二帧,卡死在第一帧,所以关键看第一帧到第二帧期间哪里出了问题。
贴出同事总结的 Android logo 加载流程:
1 | [第一张 logo 显示在 lk 启动流程中介绍] |
分析思路
(1) 先回读镜像,回读了 pl lk boot(但不知道手机的软件版本),通过和正式版本的镜像对比,发现回读的镜像和 WW B18 一致,确认到手机软件版本为 WW B18。
(2) 和 WW B18 的镜像对比,发现 pl lk boot 镜像和版本中的镜像一致,没有损坏。
(3) 焊接串口,抓取串口 log,通过 fastboot 在 user 版本下抓取完整的开机 uart log。
1 | C:\Users\wangbing>fastboot oem p2u on |
(4) 对比不良机和正常机开机串口 log,发现,不良机在 init 进程中找不到 boot_logo_updater,没有正常启动 boot_logo_updater 程序(此服务用于加载 kernel 阶段的 boot logo,对应开机的客户品牌 logo 图片)。
1 | [ 5.119985] <5>.(5)[1:init]init: Starting service 'healthd'... |
(5) boot_logo_updater 服务编译版本后会打包在 /system/vendor/bin 目录下,而 /vendor/bin/ 是通过软链接方式链接到 /system/vendor/bin 目录的。
1 | C:\Users\wangbing>adb shell |
(6) boot_logo_update 程序打不开,有两个怀疑点,要么是 /system/vendor/bin 目录下的执行文件有问题,要么是从 /vendor/ 到 /system/vendor/ 的软链接没有生效。
(7) 试图连接下 adb,想确认下软连接有没有生效,很遗憾,无法连接。
(8) 回读不良机的 system 镜像,使用 ext2explore.exe 解压确认,发现不良原因确实是 boot_logo_updater 损坏,导致无法加载第二帧 logo。
分析结论
客退机 system 分区损坏,导致无法加载 boot_logo_updater 程序引导第二帧 boot logo;同时 init 进程无法成功执行,导致无法开机。