上一篇留下的問題:開機時間到底卡在哪
在前一篇〈移除 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 可以協助做開機時間定位、優化與現場可靠性的風險控管。