← 技術文章
Android BSP · 開機時間 · 工業 IoT
系統優化三部曲 · 第二部

開機 34 秒砍到 14 秒:工業 Android 開機時間的真正瓶頸

工業設備開機慢,常被歸咎於「App 太多」或「硬體太弱」。但開機時間往往卡在你看不到的最底層。我們把一台 QCM6490 工業相機的冷開機從約 34 秒降到約 14 秒——少了快 20 秒、減一半以上——而且只改了一個開機參數、沒有拿掉任何功能。關鍵不是蠻力,而是先把看不見的開機過程量出來,找到真正的瓶頸。

重點摘要
  • 冷開機從約 34 秒降到約 14 秒(減 57%),只改一個 kernel 開機參數、零功能回歸。
  • 真正的瓶頸不是 App、不是某個慢服務,而是一個量產板根本沒接、卻在開機期同步空轉的除錯序列埠。
  • 難的不是改那一行,而是先讓「看不見的早期開機過程」變得可量測,才知道要改哪裡。
  • 我們連中途把測試機弄到無法開機的失誤也照實寫出來——因為這是工程,不是包裝。

上一篇留下的問題:開機時間到底卡在哪

在前一篇〈移除 Android 預載 App,工業設備實際省下什麼?〉裡,我們誠實寫了一個結果:移除幾十個用不到的預載 App,省了儲存、OTA 和記憶體,但冷開機時間幾乎沒變。當時的結論是——開機的瓶頸不在 App 這一層。

那它在哪一層?這一篇就來回答。對無人值守的工業相機來說,開機時間是實打實的指標:斷電後多久能回到線上、OTA 更新後重啟要等多久、產線批次燒錄一台要佔多少時間。每一秒都有意義。

第一步:先讓「看不見的開機過程」變得可量測

優化開機,最大的困難往往不是「不知道怎麼改」,而是「看不到時間花在哪」。我們量到開機完成大約 34 秒,其中超過四分之三、整整 25 秒以上,是在桌面框架(zygote)都還沒啟動之前就花掉的——而這段最早期的過程,遠端幾乎看不到:

  • 負責 adb 連線的服務,要到開機約 31 秒才起來,早期那段根本連不上去看;
  • 核心的開機 log 緩衝區很小,開機還沒結束就被新訊息蓋掉了;
  • 這塊板子也沒開啟「跨重開保存開機 log」的機制,等於沒有黑盒子。

所以我們做的第一件事不是優化,而是裝儀表:在核心裡開啟一塊「重開機後仍保留早期開機紀錄」的記憶體區,把最早期的開機過程錄下來、重開後讀出來。能看見,才能優化——這一步本身沒有讓開機變快一毫秒,但它是後面一切的前提。

真正的瓶頸:一個沒人讀的序列埠

把早期開機過程錄下來之後,線索浮現了:從開機到系統初始化,核心和系統服務一路印出極其大量的訊息——每一個指令、每一個服務、每一個設定動作都在記錄。問題不在「印了什麼」,而在「印到哪裡」。

開發板上有一個除錯用的序列埠(serial console),開機時核心會把每一行訊息都同步送到這個埠。在工程師桌上、接著除錯線時,這很有用。但量產出貨的板子根本沒有接任何東西到這個埠

關鍵在於「同步」兩個字:這個埠的傳輸速率固定且很慢,而核心是寫一行、等它真的送出去、再寫下一行。送往一個沒有任何接收端的埠,核心還是老老實實地按那個龜速一個位元組一個位元組地等。開機期累積上萬行訊息,就這樣白白空轉、燒掉了大約 19 秒

這也回頭解釋了上一篇的謎題:為什麼移除 App 對開機沒幫助。因為瓶頸從來不在 App、也不在某個特定的慢服務,而在最底層、每一行 log 都要付一次的固定成本。砍上層的東西,當然動不到它。

解法:一行設定,但要用對方式

修法本身很小:在開機參數裡加一個設定,把核心輸出到序列埠的訊息降到只剩警告與錯誤——平時的海量訊息不再逐行同步送出,那 19 秒的空轉就消失了。

但這裡有一個值得分享的坑。我們一開始試的是更激進的做法——乾脆把序列埠整個關掉。結果板子在開機很早期就卡死、連不上、變成磚,只能用底層救援模式重新燒錄才救回來。原來在這塊板子的開機組態裡,這個序列埠不能直接移除;正確做法是保留它、但只關掉那些海量的一般訊息。同樣的目的,差別在於用對方法。

另一個重點:這個改動不會犧牲除錯能力。它只減少「即時送到序列埠」的輸出;完整的開機 log 仍然保留在系統內,工程師照樣能用標準工具把全部訊息抓出來分析。我們要的是「不要在沒人看的地方空轉」,不是「不要記錄」。

結果:34 秒 → 14 秒,可重現、零回歸

燒回真實設備驗收:冷開機從約 34 秒降到約 14 秒,連續多次重開都穩定一致。桌面框架的啟動時間點從 25 秒提前到 8 秒。同時——相機、遠端連線、核心服務全部正常,沒有任何功能回歸,除錯能力也維持完整。一個開機參數,減掉超過一半的開機時間。

而且同平台、同樣保留 verbose 序列 console 的機種,很可能一起受益——因為它們吃的是同一筆底層成本。實際幅度仍需各自上機量測確認。

為什麼這件事值得寫

因為它說明了平台工程真正的價值,不在「會不會改參數」,而在有沒有能力把看不見的問題變得可量測、進而定位到正確的那一層。如果一開始就埋頭去砍 App、砍服務,再怎麼努力也省不到這 19 秒,因為瓶頸根本不在那裡。

我們也刻意把中途「把測試機弄到變磚」的失誤寫出來。工業客戶要的是一個可預期、可驗證、出問題救得回來的平台,不是漂亮的行銷數字。誠實地講清楚哪裡踩了坑、怎麼救回來、最後怎麼用對方法,比單純報一個「快了一倍」更能說明這是扎實的工程。

結論:開機優化是「定位工程」,不是蠻力

把開機時間減半,靠的不是砍功能,而是先量測、再定位、最後用對方法在正確的一層做最小的改動,並在真機上驗證沒有弄壞任何東西。難的地方在判斷與量化,不在改那一行字。

這正是 App 底下那層平台工程的價值所在。對量不大但技術需求深的工業 Android 團隊,CoreEdge Lab 就是把這層「定位工程」做得扎實、可量測、可還原的技術夥伴。

如果你的工業 Android 專案有開機太慢、斷電復原太久、或「不知道時間花在哪」的問題,CoreEdge Lab 可以協助做開機時間定位、優化與現場可靠性的風險控管。