「當硬體成本被砍到骨折,剩下的每一毫秒與每一 KB,都是軟體架構師用命換來的。」
這是一個關於如何在百元級高通低階晶片(4 顆 Cortex-A53 @ 1.3GHz、2GB RAM、無 NPU、Android 開機直接吃掉 1.3GB)極度受限的硬體上,扛起金融級 BCTC 活體人臉辨識、要求小於 1 秒開門、99.99% 精度且 7×24 小時不死機的真實工程實錄。
在邊緣工控終端的世界裡,沒有「加記憶體」或「換高階晶片」這種選項——硬體 BOM Cost 每壓低一美元,出貨萬台就是幾十萬的淨利。當公司選型拍板了這顆連滑桌面都會喘的晶片時,我們唯一的活路,就是從 Android 系統層級開始動刀,把整個系統壓榨到極致。
本導覽將這趟長達數百天的「軟硬兼施」榨汁歷程,整理為五大破局階段與 17 篇核心實戰長文。
一、 全系列 5 大階段破局架構圖
[ 物理死局 ] 2048MB 實體 RAM - 1300MB 系統常駐 - 950MB 雙鏡高頻 Buffer = -202MB (直接死機)
│
├── 階段 1:系統減磅與水線治理 (淨奪回 520MB+ 實體記憶體)
│ ├── 算力與記憶體儀表板建立 (USS / PSS / RSS 精準量測)
│ ├── AOSP 裁剪:go_defaults 與 Kiosk 20+ 無用系統服務徹底拔除
│ └── 內核抗壓:ZRAM 壓縮、SWAP 禁忌與 KSM 功耗取捨
│
├── 階段 2:底層抗壓、LMKD 與 GC 決戰 (720 小時穩態 0 GC Thrashing)
│ ├── LMKD 自定義進程水線殺手與防 OOM 策略
│ ├── 大內存全面下沉 C++ Native,Java Heap 恆定 15MB
│ ├── 三路高頻影像流 DirectBuffer 跨層零拷貝
│ └── 物理世界 Watchdog:GPIO 電擊與顯式靜態廣播拉活
│
├── 階段 3:影像演算法極限榨汁 (150ms ➔ 3ms,百倍提速)
│ ├── QFastCV + ARM NEON 向量指令集:YUV 轉碼 < 1ms
│ └── ARM Compute Library (ACL) SGEMM:5,000 人矩陣特徵比對 3ms
│
├── 階段 4:雙鏡時空同步與 3D 空間感知 (Sony iToF 30fps 即時點雲)
│ ├── RGB 與 iToF 跨感測器毫秒級時空同步與非阻塞隊列
│ └── RAW12 深度圖轉 3D 空間點雲與 OpenGL ES 即時著色
│
└── 階段 5:邊緣工控連線與近場配網 (工業級穩固連線)
├── WebSocket 雙向長連線、Protobuf 序列化與離線雙寫架構
├── 永遠不關相機:WebRTC 視訊免切換 0ms 搶相機黑屏解決方案
└── 門禁機當 BLE Peripheral 近場配網與 31-Byte 廣播拆分
二、 全系列 17 篇核心文章導讀與閱讀路徑
階段 1:硬體瓶頸量測與系統減磅
- 第 0 篇:到底有多爛?(全系列風格母本)
揭露 QM215 物理硬傷與 BCTC 金融認證的殘酷要求。公開核心物理死局算式:2048MB - 1300MB - 950MB = -202MB < 0。 - 第 1 篇:評估第一:沒有儀表板的飛機沒人敢開
深入拆解dumpsys meminfo、procrank、smaps,釐清 USS、PSS、RSS 真實物理邊界;揭露表面 456MB Free RAM 背後,真正無延遲空間只有 64MB 的真相。 - 第 2 篇:記憶體優化:無用系統服務徹底剔除
分為 AOSP 標準規範(go_defaults.mk、拔除 Telephony)與 Kiosk 極限抽脂(Launcher3、SystemUI、LatinIME、無電池),一舉奪回 520MB 實體記憶體! - 第 3 篇:系統優化:ZRAM, SWAP, KSM 擴張最大值
深入剖析 DMA/ION Pinned 頁面不可壓縮本質;實測 KSM 耗 10% CPU 僅省 20MB 果斷拔除;揭露 eMMC Swap 磨損快閃記憶體的定時炸彈,確立 256MB ZRAM LZ4 克制藝術。
階段 2:底層記憶體防線、LMKD 與 GC 決戰
- 第 4 篇:記憶體控場師 LMKD
從 In-kernel LMK 演進到 Userspace LMKD;修改ProcessList.java快取上限(32 ➔ 3);可用 Free RAM 從瀕危的 64MB 暴增至 470MB。 - 第 5 篇:GC 是唯一會關心你 OOM 的好人
深度剖析 ART GC Log(for allocvsbackgroundvsNativeAlloc);第一性原理將大記憶體全面下沉 C++ Native,讓 Java Heap 恆定維持在 15MB 舒適圈。 - 第 6 篇:三路高頻影像流:三倍蓋亞,趕快 GC
RGB (13.8MB/s) + ToF (55.3MB/s) 總量 69.1MB/s 原始灌入!透過「0-new 鐵碗隊列」、「DirectBuffer 跨層零拷貝」與「雙層背壓 Drop-Oldest」,待機 CPU 負載從 100% 降至 15%~20%。 - 第 7 篇:物理世界需要 watchdog
獨立 MCU 遭閹割後的軟體自救:顯式靜態廣播冷啟動拉活進程;Linux NUD (ARP) 0 CPU 監控網卡硬體死鎖;相機斷流兩段式 GPIO 500ms 電擊重啟機制。 - 補充篇:GC Thrashing 思路補充
揭露每 20ms 觸發一次 GC 清理 1KB 的瀕死現場;揪出第三方庫殘留finalize()塞爆FinalizerDaemon獨木橋,全面邁向顯式生命週期。
階段 3:影像演算法極限榨汁與異質運算
- 第 8 篇:YUV_420_888 還能怎樣加速:QFastCV
剖析 Semi-Planar NV21 硬體 ISP 掃描與 Row Stride 垃圾記憶體;Java 24 萬次邊界檢查耗時 15ms,對比高通 QFastCV ARM NEONVLD2向量拆分降至 < 1ms。 - 第 9 篇:兄弟齊心,軟硬兼施:ARM Compute Library (ACL)
5,000 人 1:N 特徵矩陣比對演進史:純 Java 雙重迴圈 150ms ➔ JNI 頻繁換向災難 320ms ➔ ARM ACL SGEMM 3ms!提速整整 100 倍! - 番外篇:從 50ms 到 3ms:ARM NEON、FastCV 與記憶體極限榨汁指南
直面記憶體牆(A53 讀 L1 13 時脈 vs DRAM 150200 時脈);SoA vs AoS 排布調優;全鏈路端到端驗收耗時從 1.5 秒壓制至 280ms。
階段 4 & 5:雙目 3D 視覺、ToF 點雲與工控通訊
- 第 10 篇:雙鏡頭的時空修羅場:RGB 與 ToF
RGB 30fps 與 ToF 點雲時空錯位引發活體誤判;設計 RGB Master 火車頭非阻塞(0ms)拉取 ToF 最新幀機制,鼻尖空間深度門檻提早短路無效運算。 - 第 11 篇:ToF RAW12 轉 3D 點雲
30.7 萬點 3D 點雲即時渲染:C++ 幾何解算、動態降採樣砍 80% GPU 負擔、Atan2 查表法、NEON 8 像素並行、牛頓逼近開方消滅開根號延遲,最後以 OpenGL ESGL_POINTS渲染。 - 第 12 篇:說到底還是一台 IOT:WebSocket 篇
工控長連線實戰:0.1 秒極速開門、Protobuf 幹掉 JSON Base64 省 60% 頻寬與記憶體;HandlerThread 單執行緒事件隊列防競態;SQLite 離線雙指針與 ACK 閉環保證可靠交付。 - 第 13 篇:為了幾乎不會用到的功能需要大改特改的 WebRTC
Androidcameraserver排他性衝突;血淚遺產「sleep 5 秒」與掛斷通話黑屏死鎖真相;終極破局法:永遠不關相機,以單一相機常駐源 +ExternalVideoCapturer+ 3 槽安全物件池,切換耗時從 5000ms 降至 0ms。 - 第 14 篇:門禁機當 BLE Peripheral 的現場踩坑記
施工現場無觸控、強光反光情境;角色倒轉為 BLE Peripheral(0% CPU 開銷保護 30fps 辨識);31-Byte 雙層廣播拆分;死守 20-Byte 保底與 2-Byte 狀態機;7-Byte TLV 靜態 IP 配置。
三、 核心工程心法總結
- 先把系統壓到剩骨頭,AI 才能長肌肉:不要期待在臃腫的 AOSP 預設系統上跑重型神經網路,系統裁剪是邊緣運算的第一道防線。
- 記憶體是物理世界的有限資源:Java Heap 只是表面,DMA Buffer、ION 記憶體、Native Alloc 與 Page Cache 才是引發 OOM 的深水區。
- 零拷貝是唯一的高頻通道:DirectBuffer 貫穿 Java、JNI、C++ 與 GPU,消滅所有無意義的
memcpy。 - 永遠懷疑硬體的穩定性:Watchdog、GPIO 硬體電擊、斷線重連狀態機,是在工控現場安穩睡覺的唯一依靠。
發佈留言