Android 的定位框架是整個行動生態系的基石之一。從地圖導航、運動追蹤、相機地理標記,到智慧家居自動化與行銷推播,幾乎所有需要「地理位置」的功能,都依賴於 LocationManagerService (LMS) 這項系統服務。
Android 的定位系統架構可分為以下幾層:
+----------------------------------------------------+
| Applications |
| (Google Maps, Fitness, Ride-hailing, etc.) |
+----------------------------------------------------+
| LocationManager & FusedLocationProvider |
| (Java Framework API) |
+----------------------------------------------------+
| LocationManagerService (System) |
| - Provider 管理 (GPS / Network / Passive / Fused) |
| - 權限控制、Request 排程、Callback 分派 |
+----------------------------------------------------+
| Location Providers (Native 層模組) |
| - GpsLocationProvider / GnssLocationProvider |
| - NetworkLocationProvider / FusedProvider |
+----------------------------------------------------+
| HAL (Hardware Abstraction Layer) |
| - android.hardware.gnss@X.Y |
+----------------------------------------------------+
| Linux Kernel |
| - GNSS Driver / Modem Interface / Power Control |
+----------------------------------------------------+
requestLocationUpdates()
getLastKnownLocation()
removeUpdates()
hardware/interfaces/gnss/1.1/
以下是 Android 定位的一般流程圖:
+--------------------------------+
| App (LocationManager) |
| requestLocationUpdates() |
+--------------|-----------------+
|
Binder IPC
v
+--------------------------+
| LocationManagerService |
| - 驗證權限 |
| - 選擇 Provider |
| - 維護 Request 列表 |
+--------------|-----------+
|
Binder / JNI 呼叫
v
+-------------------------+
| GnssLocationProvider |
| (或 NetworkProvider) |
+--------------|----------+
|
HAL interface (AIDL/HIDL)
v
+-------------------------+
| GNSS HAL / Driver |
| (與衛星晶片互動) |
+--------------|----------+
|
v
+-------------------------+
| Hardware Layer |
| GPS Receiver Module |
+-------------------------+
當系統取得新位置時,會反向將結果回傳至:
LMS 位於:frameworks/base/services/core/java/com/android/server/location/LocationManagerService.java
(1) 啟動階段
由 SystemServer
啟動:mSystemServiceManager.startService(LocationManagerService.class);
在初始化時會:
(2) Request 與更新管理
App 透過 Binder 請求定位時,LMS 會:
(3) 多 Provider 策略
Android 支援同時啟用多種 Provider。LMS 的策略為:
定位資訊涉及隱私,因此系統在多層防護:
特性 | GPS Provider | Network Provider |
---|---|---|
資料來源 | 衛星 | Wi-Fi / 基地台 |
精確度 | 高 (< 10m) | 中等 (50~200m) |
延遲 | 高 (需定位時間) | 快速 |
室內可用性 | 弱 | 強 |
電量消耗 | 高 | 低 |
典型用途 | 導航、運動追蹤 | 城市地圖、背景定位 |
Android 系統通常會根據 LocationRequest 的優先等級自動選擇最適 Provider:
雖然 AOSP 提供基本的 LMS,但實際上多數裝置會採用 Google Play Services 的 FusedLocationProvider,其特點:
定位是耗電大戶,因此 LMS 會與 PowerManagerService 與 AlarmManagerService 協同控制:
過去 Android 提供 Battery Historian 分析定位耗電,但目前已不再維護。Google 官方建議改用:
層級 | 模組 | 功能摘要 |
---|---|---|
應用層 | LocationManager | 開發者 API,向系統請求定位 |
Framework | LocationManagerService | 管理權限、Provider、回傳結果 |
Native 層 | Gnss / Network Provider | 與 HAL 互動,獲取位置資料 |
HAL 層 | GNSS HAL | 與硬體 GPS 晶片通訊 |
Kernel | GNSS Driver | 控制接收器與功耗管理 |
Android 的定位架構是「高階封裝、低階驅動」的典範,它整合了軟硬體協作、權限與能耗策略,並提供一致的 API 給開發者使用。
而在現代裝置中,Google 的 FusedLocationProvider 進一步將多源感測資料融合,使定位更智慧、更節能。