核心原因:Android 碎片化
魅族正常、小米死機、三星 ANR,本質是 **系統版本差異 + 廠商定制 ROM 修改 + 硬件能力差異** 綜合作用。
三大維度深度分析
1. 系統 API 版本差異
- Android 6.0 (API 23) 引入**運行時權限**,`targetSdkVersion >= 23` 必須動態申請權限,否則崩潰/無效。
- API 28+ 限制非 SDK 接口調用 (灰名單/黑名單),反射調用隱藏 API 會崩潰。
- API 29+ 分區存儲,直接訪問外部存儲路徑失效,需用 `MediaStore` / `SAF`。
- 低版本棄用組件:`TabHost`、`Gallery`、`ActionBarActivity` 等在高版本移除/不可用。
2. 廠商 ROM 定制 (最隱蔽)
- 權限管理:小米/華為/OPPO/vivo 等有獨立「權限管理」App,默認拒絕自啟動、後台彈窗、讀取通訊錄等,導致功能失效而不崩潰。
- 進程保活機制:各家自帶「安全中心/電池優化」強殺後台服務,`Service`、`AlarmManager`、`JobScheduler` 行為差異巨大。
- 系統組件替換:相機、相冊、文件選擇器 Intent 動作/返回數據格式不一致 (如 `MediaStore.EXTRA_OUTPUT` 無效)。
- API 刪減/修改:部分 ROM 刪減 `TelephonyManager` 某些方法、修改 `Build.MODEL` 規則等。
3. 硬件能力差異
- 屏幕密度 (ldpi~xxxhdpi) 導致圖片縮放失真、佈局溢出。
- CPU 架構 (arm64/armeabi-v7a/x86) 原生庫 `.so` 缺失導致 `UnsatisfiedLinkError`。
- 傳感器、NFC、指紋、紅外等硬件缺失,調用相關 API 拋異常或回調失敗。
- 內存限制:低端機 Dalvik/ART 堆上限小 (如 16MB/32MB),圖片加載易 OOM。
通用適配策略
- 最低版本防護:`Build.VERSION.SDK_INT` 判斷分支,動態權限、分區存儲、非 SDK 接口均需版本適配代碼。
- 廠商跳轉頁面:集成「自啟動管理」、「權限管理」、「電池優化白名單」跳轉邏輯 (如 `AutoStartManager` 庫),引導用戶手動開啟。
- 資源多規格提供:`drawable-xxxhdpi` 到 `drawable-ldpi` 全覆蓋,佈局用 `dp`/`sp`、約束佈局/PercentFrameLayout 適配。
- 動態加載 .so:`split abi` 打包或運行時下載對應架構原生庫。
- 嚴格測試矩陣:覆蓋「主流品牌 (小米/華為/OPPO/vivo/三星/魅族) × 主流版本 (Android 10/11/12/13/14) × 低/高內存機型」最小測試集。
- 異常上報體系:集成 Bugly/Sentry/Firebase Crashlytics,按 `Build.MANUFACTURER`、`Build.MODEL`、`Build.VERSION.RELEASE` 多維度聚合崩潰,快速定位機型專屬問題。
總結
Android 碎片化無法消除,只能通過 **版本分支代碼 + 廠商專項適配 + 完善測試矩陣 + 實時崩潰分析** 組合拳,將「不同手機不同問題」控制在可接受範圍內。