资讯动态

系统升级后反复重启的开机异常,如何从启动链路与日志快速定位?

发布时间:2026/10/17 14:59:23 来源:尧图企业网站定制
刚拿到一台返修设备现象很典型客户反馈升级完系统基线版本后机器反复重启偶尔能进桌面但撑不过两分钟又黑屏转圈最后彻底卡在开机动画上不来。我插上串口线一看log刷得飞起来回都是同一条崩溃栈。这类“基线升级后反复重启不开机”的问题做系统集成和售后的人隔三差五就会遇到处理起来的核心不是急着刷机而是先把现场日志抓全再顺着启动链路逐段定位。这篇文章我想把几次实战排查的经验整理出来把定位思路、常用命令、恢复手段和容易踩的坑都拆开讲适合负责系统升级、固件开发、售后技术支持以及做整机测试的工程师参考。哪怕你之前没深入搞过启动流程按这套方法论也能少走不少弯路。1. 现象确认与现场信息收集1.1 拿到设备后别急着刷机先看现场很多人一听说“不开机”第一反应就是拿全量包重新刷一遍。这个做法对不对分情况。如果设备已经彻底变砖刷机当然是最高效的恢复手段但如果是基线升级后出现的逻辑性重启刷全量包等于把案发现场毁掉——原厂log、分区状态、slot标记、升级残留包全都覆盖了后续再想定位根因只能靠复现。我一般拿到设备后的动作顺序是固定的先接串口或者反复敲adb命令看能不能抓到boot阶段输出统计重启间隔和重启阶段的分布判断是快速重启还是慢速重启尝试进入bootloader、recovery、fastboot盘点当前slot状态和分区挂载情况抓取last_kmsg、logcat、dropbox等现场日志能抓多少抓多少。整个过程尽量在五分钟内完成。很多时候设备反复重启但还能进系统几秒这段时间足够adb授权并导出部分日志。如果连adb都来不及授权串口就是唯一救命稻草。1.2 我建议先确认的信息清单问题定位最怕信息不完整。同样是“反复重启”升级前版本、升级方式、失败阶段不同排查方向完全不一样。我会在动手前先建立一个信息速查表信息项说明获取方式升级前基线版本判断改动差异范围产品版本记录、升级包命名升级后的目标版本定位新增改动点升级包内版本文件升级方式OTA增量/整包/工厂线刷询问现场或看升级日志升级过程是否中断掉电、强断、空间不足logcat升级记录、update_engine日志重启周期几秒/几十秒/几分钟串口或观察开机动画当前slot状态A/B槽是否可用fastboot getvar current-slot上次启动的crash栈崩溃位置last_kmsg、logcat -b crash这里重点提醒一下升级方式非常关键。整包升级出问题大概率是分区格式或镜像本身不匹配增量OTA出问题往往是patch合成失败、底层服务兼容性差异线刷出问题优先怀疑bootloader和分区表。不同路径的排查策略差异很大不要混在一起分析。1.3 从重启节奏判断问题大概在哪个阶段串口日志没出来之前凭眼睛观察也能得到有用信息。我习惯把启动过程分成三个阶段bootloader阶段屏幕无输出或仅有厂商logo重启间隔极短基本是BL崩溃、分区表读取失败或设备树加载异常kernel/init阶段屏幕有logo但无法进入桌面重启周期在几秒到十几秒通常是内核panic、init解析失败、关键服务起不来Android框架阶段能进桌面但过一会就重启间隔几十秒到几分钟重点查system_server异常、watchdog触发、内核关键驱动空指针。这个判断不一定是100%准确但能帮你在连上串口之前就确定大概搜索范围。比如我遇到过一台设备屏幕上logo刚亮就灭重启间隔稳定在六秒左右后来一查是升级后内核dtb里iommu配置变了某个外设驱动在probe阶段直接卡死看门狗。2. 解析系统启动链路为什么基线升级容易“翻车”2.1 先梳理正常启动要经过哪几道门把启动链路完整过一遍排查思路会非常清晰。以一个典型带A/B分区的Linux/Android设备为例完整路径是这样的芯片BootROM加载bootloader校验签名和配置bootloader读取分区表选当前active slot合入启动引导内核加载设备树、ramdisk挂载根文件系统init进程启动解析init.rc系列脚本逐个启动系统服务vendor、hal、zygote、system_server按依赖顺序拉起最后进入桌面Launcher系统进入可用状态。任何一个环节崩掉表现出来的都是重启循环但崩溃栈出现的位置能直接告诉你是哪道门没进去。比如我在串口里经常看到Kernel panic - not syncing: Fatal exception这行字后面的函数名就是地雷埋的位置。2.2 基线升级带来的改动面比想象中大所谓“基线升级”通常不只是安卓小版本号的跳跃而是整个软件基线往前迈了一大步。这就意味着内核版本可能换了、分区布局可能调了、vendor和kernel之间的接口协议可能改了、selinux策略可能收紧了、A/B升级策略可能变了。这些改动叠加在一起任何一个不匹配都会在启动时露出问题。举几个实际例子内核从4.x升到5.x某个老外设驱动没跟上新framework的dma接口probe阶段直接oops分区镜像vendor大小调整了但bootloader里对应的偏移没同步升级后bootloader找不到vendorselinux策略从permissive改为enforcing某供应商hal服务被拒绝访问导致反复拉起失败dtb文件里的内存布局和kernel配置不一致天线上电后访问非法地址触发panic。所以排查这类问题的核心思路永远是弄清楚“变更集”然后针对变更点逐一验证这比满世界找崩溃原因高效得多。2.3 现场抓日志的几条关键通道日志不够定位免谈。我每次排查都会按优先级抓这几样东西串口控制台最早能看到的启动日志包含bootloader和kernel阶段的全部输出。如果没有调试串口可以尝试在bootloader里开启console重定向。last_kmsg / pstore设备重启后内核上一次崩溃的现场会保存在pstore分区记录panic栈。读取方式是在root后执行cat /sys/fs/pstore/console-ramoops或者cat /proc/last_kmsg。注意很多设备没开pstore这个东西需要在kernel cmdline里配置。logcat缓冲如果设备能短暂进入系统adb授权后立刻执行adb logcat -b all -b crash -t 500 adb shell dmesg dmesg.txt adb shell ls /data/system/dropbox/dropbox里存放着system_server崩溃时自动保存的异常信息一句adb shell dumpsys dropbox --print能直接看到谁在反复崩。升级日志OTA升级的过程日志通常存在/data/misc/update_engine/log或/cache/recovery/下能判断升级在哪个分区写入时失败。提示调试阶段强烈建议在开发板上把consolettyS0,115200和earlycon都打开保证串口能拿到尽可能早的启动信息。量产设备没有串口时优先通过fastboot进bootloader再查看硬件状态。3. 高频根因排查与确认方法3.1 分区镜像异常与dm-verity校验失败升级过程中如果分区写入不完整或者得到的是半截镜像dm-verity在校验时会直接拒绝挂载或者触发panic。这类问题的特征非常明显启动日志里有dm-verity verification failed、failed to verify dm-verity、Verity mode: enforcing之类的关键字而且设备通常无法稳定进入系统。排查步骤我会这么走fastboot模式下执行fastboot getvar current-slot确认当前启动槽用fastboot oem device-info看bootloader是否处于unlocked状态逐个校验关键分区镜像例如执行fastboot flash vendor vendor.img或fastboot flash boot boot.img重点看写入速度和校验是否报错如果是OTA升级出现的查看升级日志确认是哪个分区校验失败。dm-verity校验失败最常见的原因有三个分区镜像损坏、分区大小和镜像不匹配、root之后关闭了verity导致校验状态不一致。我碰到过一个奇葩案例客户把设备root后改了system分区文件之后直接运行官方OTA增量包patch在半途就把分区搞坏了最后只能整包恢复。3.2 A/B槽切换机制导致的启动失败带A/B分区的设备正常升级是在后台把镜像写入备用槽重启后切换。如果升级中断、切换标志被错误置为unbootable或者两个槽都被标记不可用设备就会陷入启动死循环。排查命令非常直接fastboot getvar current-slot fastboot getvar slot-count fastboot getvar slot-unbootable如果发现当前槽是unbootable可以强制切换fastboot set_active a reboot bootloader这个操作只改bootloader里的active标记不擦除数据适合现场急救。但要留意有时候不是slot标记的问题而是备用槽里根本没有完整镜像。判断方法很简单切到另一个槽后看能否启动能启动说明镜像没问题不能启动就用U盘或线刷把完好的镜像刷进对应分区。A/B机制的另一个坑是retry_count。每次启动失败bootloader会累加失败次数如果达到阈值会自动把另一个槽标记为unbootable防止反复起不来。这本身是保护机制但在现场会表现为“明明切到备用槽了还是起不来”。这时候要检查两个槽的失败计数把状态彻底清一遍再试。3.3 内核与驱动不匹配基线升级后内核换新外设驱动还是老的这是“反复重启”的高发根源。典型表现是开机动画闪一下然后黑屏很快重启串口日志最后几行停在某个驱动的probe函数里。举个例子有一次某项目的无线网卡驱动没适配新内核的内存管理接口驱动加载时直接空指针内核oops后看门狗把系统拉起来重启。日志里反反复复出现同一行[ 12.345678] NULL pointer dereference at 0000000000000028 [ 12.345679] RIP: 0010:wlan_probe0x38/0x100排查路径是用dmesg | grep -i fail或看串口日志尾部找到panic点的函数名对照内核版本和驱动源码确认接口变更如果是二进制闭源驱动优先找供应商要适配版本临时屏蔽该外设设备树里status改为disabled验证系统能否正常起来能起来基本实锤是驱动问题找驱动正确版本重新编入vendor或kernel。很多“重启但有时能用”的诡异问题最后都回归到驱动时序和电源管理上。驱动probe时访问外设寄存器外设没上电返回错误或者总线异常内核就会panic。这类故障做几个小时的连续压力测试最容易暴露。3.4 系统服务反复崩溃导致boot loop系统能起来但system_server反复挂掉也会表现为开机动画循环。这类问题在logcat里通常能看到同一进程反复crash然后zygote重启再拉起system_server周而复始。定位时我喜欢用这两个命令adb logcat -b crash -b system -t 200 adb shell dumpsys dropbox --print重点看崩溃栈是否指向同一处。如果是同一个方法反复崩八成是数据/配置不兼容或者某个hal服务反复拉起失败。比如某供应商的healthd服务在升级后无法连接新版本的binder接口它一崩system_server的watchdog就认为关键服务无响应强制重启。处理思路有两种能进系统就临时禁用出问题的服务或者替换掉不兼容的配置不能进系统就从日志里定位到具体库把相关模块更新到配套版本。如果是为了应急恢复现场数据可以尝试在启动早期用adb shell setprop persist.sys.sf.nobootanimation 1跳过开机动画减少系统压力。3.5 selinux放宽后的坑与漏网策略基线升级后selinux策略收紧是导致服务启动失败的一个隐蔽原因。它不会让内核panic但会让某个关键服务被拒绝访问然后反复启动失败。查看方式很简单adb logcat -b all | grep avc: denied adb shell dmesg | grep avc: denied如果看到大量avc: denied基本就是selinux策略没跟上。临时验证可以把selinux切到permissive模式adb shell setenforce 0能正常启动说明策略问题再打开enforcing复现问题就能确认。长期解法是完善te规则把缺失的allow语句补上重新编译policy进vendor。补策略的时候要注意有些供应商的hal服务需要访问的是sysfs、procfs或/dev节点这些节点路径在不同基线版本里可能变了光加allow语句还不够得把文件上下文也理一遍。4. 实战案例复盘4.1 案例一升级包在写入系统分区时掉电导致system分区损坏场景一台工控设备做OTA整包升级现场人员反馈升级到一半停电再来电后设备一直卡在开机logo反复重启进不了系统。排查过程串口日志显示卡在kernel挂载system分区阶段反复出现EXT4-fs error进入fastboot后执行fastboot getvar current-slot显示当前槽是b切换fastboot set_active a仍然无法启动检查fastboot getvar slot-unbootable两个槽都正常排除slot标记问题确认是system分区文件系统损坏。处理方案在fastboot模式下重新刷入system.img和vendor.img之后设备正常启动。这个问题本质上就是升级中途掉电导致分区写一半损坏了文件系统。经验总结升级类故障第一个排查点永远是“升级过程是否完整”。现场人员反馈“升级到一半停电”这六个字价值比十页日志都高。后来我们在产品里加了升级断点保护和双备份校验再遇到掉电启动时能自动回滚到上一版本。4.2 案例二dtb设备树与内核不匹配camera驱动加载即崩溃场景某智能终端从旧基线升级到新基线后约三分之一设备出现反复重启重启间隔大约8秒串口日志里全是同一行panic。排查过程串口日志显示崩溃点在camera_probe0x2c/0x120空指针访问对比新旧内核配置发现新基线的iommu策略变了camera驱动还在用旧接口访问IOVA空间设备树里camera节点在新基线的dtb中寄存器地址已经调整但驱动还是旧寄存器偏移临时在设备树里禁掉camera节点设备能正常启动确认问题定位。处理方案联系模组厂商提供适配新版内核的驱动重新编译vendor镜像后验证。量产批次的复测全部通过。经验总结基线升级导致的外设驱动不兼容几乎天天都能见到。供应商代码长期没同步到上游一旦内核框架变化老驱动就会踩雷。这类问题最好在新基线bringup阶段就做全外设遍历测试而不是等问题爆发后逐台救。4.3 案例三selinux策略收紧导致关键hal服务崩溃循环场景某设备升级到新基线后能进桌面但几秒后自动重启重启前logcat大量输出同一行crash。排查过程adb logcat -b crash看到system_server反复死于security_xx相关异常adb logcat -b all | grep avc: denied刷屏全是某个vendor服务访问audit节点被拒adb shell setenforce 0后设备长时间稳定运行确认是selinux策略问题定位到缺少的规则补te文件后重新编译。处理方案修订ate策略放行相关进程对新增文件节点的访问重新生成vendor镜像验证通过。经验总结selinux这类问题的坑点在于光看crash栈找不到真正原因必须同时看avc denied日志。如果logcat里avc刷屏几千行不要被吓到按时间戳去匹配crash前后的denied条目基本就能锁定。5. 现场恢复手段与长期预防机制5.1 我习惯的恢复顺序先软后硬先轻量后重刷接下来是纯干货阶段。设备反复重启到手里之后如果目标只是恢复使用我通常会按下面的顺序一层层处理第一步是检查slot状态和分区挂载情况。fastboot模式下执行getvar current-slot、getvar slot-unbootable如果槽被标记unbootableset_active切一下能省掉整个刷机时间。这个操作只需要几十秒代价几乎为零一定先做。第二步是尝试直接在fastboot下重刷boot、vendor、system这三个最有可能出问题的分区。不需要擦除userdata全程几分钟。顺序上先刷vendor再刷boot最后system因为很多驱动问题出现在vendor。第三步是清缓存和数据。如果重刷关键分区还起不来考虑是不是data分区里的旧数据不兼容新基线。fastboot下fastboot erase userdata虽然会丢用户数据但很多时候升级后系统框架变化旧的data缓存会导致反复崩溃。第四步才是整包线刷。做之前务必确认能拿到同版本的完整工厂包避免刷了错误版本浪费时间。这个顺序本质上是“从非破坏性到破坏性”的递进。在实际售后场景里前两步能解决一半以上的升级后重启问题完全不需要动用户数据。5.2 升级验证时容易被忽略的三个要点复盘这么多案例我发现大多数“升级后不开机”问题本可以在测试阶段拦截住但都被漏掉了。原因通常是以下三点没做到位第一升级过程掉电测试没有跑。OTA升级过程中任意时刻断电再来电设备应能自动恢复或回滚到上一个可用版本。这个测试看着简单实际很多团队根本不跑或者只在实验室跑一次没覆盖到中途关机的各种时序。第二升级后的全外设遍历测试缺失。很多项目做完升级只验证了基本功能没有把所有外设、传感器、通信模块逐一摸一遍。像前面提到的camera驱动问题如果升级后第一时间跑一遍相机马上就能暴露。第三双槽可用性检查不够。量产阶段偶尔会出现两个槽都标记unbootable的情况根源通常是长时间没做槽切换某个槽长期没被用到镜像损坏了。建议在升级验证中增加“切换槽位后正常启动”的用例并且定期在两个槽之间切换使用。5.3 永久修复与临时救活的边界最后要说一下现场救活和永久修复是两个层面的事。救活一台设备靠刷机、切slot、清userdata是可以做到的但对整个产品线来说只要没找到根因并修掉同样的故障会在更多设备上复现。我处理这类问题的习惯是现场恢复后保留全部抓取日志哪怕设备刷机前也要把pstore、logcat、crash buffer先备份出来然后回实验室做根因分析修改代码、更新镜像、重新验证。只有走到这一步清单才算真正关闭。写在最后坦白讲升级后反复重启不开机是这个行业最磨人的问题之一。你面对的可能是一台变砖的设备但背后往往是升级流程、驱动适配、策略调整、分区机制多个环节叠加出来的复杂局面。排查这类问题的核心就两句话现场信息抓干净启动链路理清楚。拿到设备别急着刷机先把日志和分区状态读到顺着崩溃栈往回推根因不会藏太久。我自己处理这类问题最大的体会是不要迷信某一个看似“显然”的原因。今天可能是驱动不匹配明天可能是selinux策略后天可能是升级断电。把所有可能性按概率排好序用最便宜的手段逐项排除最后得到的一定是最可靠的答案。希望这篇整理能帮你在下次遇到反复重启时少烧几块板子少加几个夜班。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑