基于之前的分析经验,我这次将更系统地深入挖掘卫星通信的所有组件。让我从多个维度进行更全面的搜索。
现在深入搜索 Telephony 服务层和框架层的卫星实现。
现在搜索构建系统、配置标志、权限定义和设备特定配置。
重大发现!在 frameworks/opt/telephony/ 目录下有卫星通信相关的对比分析报告和配置文件。让我读取这些关键文件。
极其关键的发现!文档指出 Android 16 的卫星通信实现在 frameworks/opt/telephony/src/java/com/android/internal/telephony/satellite/。让我直接查看源码。
找到了!satellite/ 目录存在!让我列出所有卫星通信源码文件。
完整发现!24个卫星通信Java源码文件。让我读取关键文件并搜索关联的HAL接口和框架API。
现在让我读取 SatelliteManager 公开 API 和 HAL 接口定义。
找到了!frameworks/base/telephony/java/android/telephony/satellite/ 目录包含 52 个文件!这就是公开 API 层。
现在让我搜索 Connectivity 模块中的卫星接入控制和权限定义。
现在我已经获取了所有需要的信息。让我更新经验记忆并输出最终文档。
现在让我输出最终的技术分析文档。
Android 16 卫星通信(Satellite Communication)功能 — 深度技术分析报告
分析对象:
y:\build\ssd-1\google16— Tangor Pro AOSP Android 16 分析日期: 2026-04-24 分析方法: 全路径覆盖搜索 + 源码精读 + 对比分析报告交叉验证
一、卫星通信整体架构
1.1 四层架构全景
┌──────────────────────────────────────────────────────────────────────────────┐
│ 应用层: Emergency SOS App / Satellite Gateway App / Satellite Hub │
│ ↓ Context.SATELLITE_SERVICE │
├──────────────────────────────────────────────────────────────────────────────┤
│ 公开API层: SatelliteManager (SDK, @SystemService) │
│ ├── SatelliteCapabilities / NtnSignalStrength (5级离散模型) │
│ ├── SatelliteDatagram / AntennaPosition / PointingInfo │
│ ├── SatelliteSubscriberProvisionStatus / SatelliteInfo │
│ └── SatelliteManager.SatelliteModemState (9态) │
│ 代码路径: frameworks/base/telephony/java/android/telephony/satellite/ │
│ (52个文件) │
│ ↓ ITelephony [Binder IPC] │
├──────────────────────────────────────────────────────────────────────────────┤
│ 服务实现层: SatelliteController (com.android.phone进程) │
│ ├── SatelliteSessionController — 9态状态机 │
│ │ UnavailableState / PowerOffState / EnablingState │
│ │ DisablingState / IdleState / TransferringState │
│ │ ListeningState / NotConnectedState / ConnectedState │
│ ├── DatagramController → DatagramDispatcher → DatagramReceiver │
│ │ (LinkedHashMap双优先级队列 + 重试 + MT轮询 + 节流) │
│ ├── SatelliteModemInterface (HAL交互, ExponentialBackoff 2s→64s) │
│ ├── PointingAppController (对星UI, 全屏/小窗口) │
│ ├── SatelliteSOSMessageRecommender (紧急SOS, T911/SOS双模式) │
│ ├── NtnCapabilityResolver / SatelliteConfigParser │
│ ├── SatelliteOptimizedApplicationsTracker / DemoSimulator │
│ └── Metrics体系 (8个类): ControllerMetrics / SessionMetrics / ... │
│ 代码路径: frameworks/opt/telephony/src/java/com/android/internal/ │
│ telephony/satellite/ (20+Java文件) │
│ ↓ ISatellite / ISatelliteGateway AIDL [Binder] │
├──────────────────────────────────────────────────────────────────────────────┤
│ HAL层: ISatellite.aidl + ISatelliteListener.aidl (标准化HAL) │
│ ├── SatelliteImplBase (厂商抽象基类, 零默认实现) │
│ ├── requestSatelliteMode / sendSatelliteDatagram │
│ ├── pollPendingDatagrams / setSatellitePlmn │
│ └── onNtnSignalStrengthChanged / onPendingDatagrams / ... │
│ 代码路径: frameworks/base/telephony/java/android/telephony/satellite/ │
│ stub/ (24个文件) │
│ ↓ │
│ Radio HAL: IRadioNetwork AIDL — 卫星PLMN/载波级控制 │
│ ├── setSatellitePlmn(carrierPlmnArray, allSatellitePlmnArray) │
│ ├── setSatelliteEnabledForCarrier(satelliteEnabled) │
│ └── isSatelliteEnabledForCarrier() │
│ 代码路径: hardware/interfaces/radio/aidl/.../network/ │
│ ↓ │
│ Google RIL Extension: IRilExt — 运营商配置下发 │
│ ├── sendCarrierConfigs(carrierConfigs) │
│ └── sendPlmnBasedCarrierConfigs(plmnType, carrierConfigs) │
│ 代码路径: hardware/google/interfaces/ril_ext/ │
│ ↓ │
│ Modem: 3GPP NTN 协议栈 (NB-IoT NTN / NR NTN / eMTC NTN) │
└──────────────────────────────────────────────────────────────────────────────┘
1.2 模块组成清单
| 层级 | 模块 | 文件数 | 代码路径 |
|---|---|---|---|
| 公开API | SatelliteManager + 回调/数据类 | 52 | frameworks/base/telephony/java/android/telephony/satellite/ |
| HAL接口 | ISatellite + ISatelliteListener + Stub | 24 | frameworks/base/telephony/java/android/telephony/satellite/stub/ |
| 服务实现 | SatelliteController + 全部子模块 | 20+8 | frameworks/opt/telephony/src/java/com/android/internal/telephony/satellite/ |
| Radio HAL | IRadioNetwork 卫星方法 | 2 | hardware/interfaces/radio/aidl/.../network/ |
| RIL Extension | IRilExt 运营商配置 | 7 | hardware/google/interfaces/ril_ext/ |
| 配置标志 | satellite.aconfig | 18 flags | frameworks/opt/telephony/flags/satellite.aconfig |
二、核心 API 接口
2.1 SatelliteManager — 公开SDK入口
文件: SatelliteManager.java (3891行, 170KB)
通过 Context.SATELLITE_SERVICE 获取,需要 PackageManager.FEATURE_TELEPHONY_SATELLITE 特性。
核心方法:
| 方法 | 功能 | 返回/回调 |
|---|---|---|
requestSatelliteEnabled() | 开/关卫星模式 | OutcomeReceiver<Void, SatelliteException> |
sendDatagram() | 发送数据报(SOS/SMS/KeepAlive) | OutcomeReceiver<Void, SatelliteException> |
registerSatelliteDatagramCallback() | 注册消息接收回调 | SatelliteDatagramCallback |
requestSatelliteCapabilities() | 查询卫星能力 | SatelliteCapabilities |
requestIsEnabled() | 查询卫星启用状态 | Bundle[KEY_SATELLITE_ENABLED] |
requestIsSupported() | 查询设备是否支持卫星 | Bundle[KEY_SATELLITE_SUPPORTED] |
provisionSatellite() / deprovisionSatellite() | 订阅/退订卫星服务 | OutcomeReceiver |
requestSatelliteAccessConfigurationForCurrentLocation() | 获取当前位置接入配置 | SatelliteAccessConfiguration |
startSatellitePositionUpdates() | 卫星位置更新 | SatelliteTransmissionUpdateCallback |
requestNtnSignalStrength() | NTN信号强度 | NtnSignalStrength (5级离散模型) |
registerForSatelliteModemStateChanged() | Modem状态变化监听 | SatelliteModemStateCallback |
9态 Modem 状态定义 (SatelliteManager.SatelliteModemState):
| 状态 | 含义 |
|---|---|
SATELLITE_MODEM_STATE_UNKNOWN | 未知 |
SATELLITE_MODEM_STATE_OFF | 卫星Modem关闭 |
SATELLITE_MODEM_STATE_ENABLING_SATELLITE | 正在启用 |
SATELLITE_MODEM_STATE_NOT_CONNECTED | 已注册但未连接 |
SATELLITE_MODEM_STATE_IDLE | 空闲等待收发 |
SATELLITE_MODEM_STATE_LISTENING | 监听中(等待入站页) |
SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING | 数据报传输中 |
SATELLITE_MODEM_STATE_CONNECTED | 网络附着完成 |
2.2 ISatellite HAL 接口
文件: ISatellite.aidl (460行)
| 方法 | 功能 |
|---|---|
setSatelliteListener() | 注册HAL事件回调 |
requestSatelliteEnabled() | 开/关卫星Modem(含Demo模式) |
requestIsSatelliteEnabled() | 查询卫星启用状态 |
requestIsSatelliteSupported() | 查询设备支持情况 |
requestSatelliteCapabilities() | 查询卫星能力 |
startSendingSatellitePointingInfo() | 开始对星信息上报 |
stopSendingSatellitePointingInfo() | 停止对星信息上报 |
pollPendingSatelliteDatagrams() | 拉取待接收数据报 |
sendSatelliteDatagram() | 发送数据报 |
requestSatelliteModemState() | 查询当前Modem状态 |
requestTimeForNextSatelliteVisibility() | 下次卫星可见时间 |
setSatellitePlmn() | 设置卫星PLMN列表 |
setSatelliteEnabledForCarrier() | 按运营商启停卫星 |
requestIsSatelliteEnabledForCarrier() | 查询运营商卫星状态 |
requestSignalStrength() | 查询NTN信号强度 |
startSendingNtnSignalStrength() | 开始NTN信号上报 |
stopSendingNtnSignalStrength() | 停止NTN信号上报 |
abortSendingSatelliteDatagrams() | 中止所有待发送数据报 |
updateSatelliteSubscription() | 更新卫星订阅 |
updateSystemSelectionChannels() | 更新系统选择信道 |
2.3 ISatelliteListener HAL 回调
| 回调 | 触发条件 |
|---|---|
onSatelliteDatagramReceived() | 收到卫星数据报 |
onSatellitePositionChanged() | 卫星位置/对星信息变化 |
onSatelliteModemStateChanged() | Modem状态变化 |
onNtnSignalStrengthChanged() | NTN信号强度变化 |
onSatelliteCapabilitiesChanged() | 卫星能力变化 |
onPendingDatagrams() | 有待接收数据报 |
onTerrestrialNetworkAvailableChanged() | 地面网络可用性变化 |
三、底层驱动和硬件抽象层
3.1 双HAL架构
Android 16 卫星通信采用双HAL架构:
(1) ISatellite HAL — 卫星专用HAL接口(OEM卫星模式)
- 通过
SatelliteImplBase抽象基类实现 - 厂商继承
SatelliteImplBase并实现所有抽象方法 - 支持绑定式服务(
SatelliteService)或直连HAL两种模式 SatelliteModemInterface通过ExponentialBackoff(2s→4s→8s→...→64s) 管理重连
(2) IRadioNetwork HAL — 蜂窝Radio HAL的卫星扩展(NTN漫游模式)
IRadioNetwork.setSatellitePlmn()— 设置卫星PLMNIRadioNetwork.setSatelliteEnabledForCarrier()— 按运营商启停IRadioNetwork.isSatelliteEnabledForCarrier()— 查询运营商卫星状态- 注释声明: "All functions apply to both terrestrial and extraterrestrial (satellite) based cellular networks"
3.2 Google RIL Extension
文件: hardware/google/interfaces/ril_ext/
IRilExt.aidl 提供运营商配置下发通道:
sendCarrierConfigs()— 转发运营商配置键值对sendPlmnBasedCarrierConfigs()— 按PLMN类型转发配置(SIM/NETWORK来源)- 用于将
CarrierConfigManager的卫星相关配置下发至Modem
四、协议栈和数据传输机制
4.1 NTN 协议栈架构
遵循 3GPP Release 17 NTN 规范,支持多制式:
| NTN 制式 | 场景 | aconfig flag |
|---|---|---|
| NB-IoT NTN | 窄带物联网卫星(主要) | carrier_roaming_nb_iot_ntn |
| NR NTN | 5G新空口卫星 | N/A |
| eMTC NTN | 增强机器通信卫星 | N/A |
核心特征:卫星 LTE 服务 — 使用标准3GPP LTE/NR空中接口通过卫星提供连接。
4.2 9态状态机 — SatelliteSessionController
文件: SatelliteSessionController.java (2056行)
UnavailableState ──(设备不支持)──→ 终态
│
PowerOffState ──requestSatelliteEnabled(true)──→ EnablingState
│
EVENT_SET_SATELLITE_ENABLED_DONE
│
┌────────────────┼────────────────┐
▼ ▼ ▼
IdleState NotConnectedState ConnectedState
(等待收发) (已注册未连接) (网络附着完成)
│ │
sendDatagram() onPendingDatagrams()
│ │
▼ ▼
TransferringState ←────────────────────────┘
│
发送完成,等待接收
▼
ListeningState (发送后180s/接收后30s分级超时)
│
超时或收到新数据
▼
IdleState
DisablingState ←── requestSatelliteEnabled(false) ←── 任何状态
│ (清理资源、解绑GatewayService、禁用干扰源恢复)
▼
PowerOffState
关键超时参数:
- 灭屏30s自动省电 (
DEFAULT_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC = 30) - P2P SMS 180s不活动超时 (
DEFAULT_P2P_SMS_INACTIVITY_TIMEOUT_SEC = 180) - ESOS 600s不活动超时 (
DEFAULT_ESOS_INACTIVITY_TIMEOUT_SEC = 600) - 发送后Listening 180s → 接收后Listening 30s 分级超时
4.3 Datagram 消息传输
发送流程 (DatagramDispatcher, 66KB):
App → SatelliteManager.sendDatagram()
→ SatelliteController.sendDatagram()
→ DatagramController.sendSatelliteDatagram()
→ DatagramDispatcher.sendDatagram()
├── 排入 LinkedHashMap 双优先级队列
│ (紧急优先 > 普通)
├── CMD_SEND_SATELLITE_DATAGRAM Handler消息
→ SatelliteModemInterface.sendSatelliteDatagram()
→ ISatellite.sendSatelliteDatagram()
→ [厂商RIL → Modem → 卫星上行]
→ EVENT_SEND_SATELLITE_DATAGRAM_DONE
├── 成功: SEND_SUCCESS → 回调App → 触发MT轮询
└── 失败: 保留队列 → retrySendingDatagrams() → 超时
接收流程 (DatagramReceiver, 44.8KB):
Modem → ISatelliteListener.onPendingDatagrams(count)
→ DatagramReceiver.pollPendingSatelliteDatagrams()
→ ISatellite.pollPendingSatelliteDatagrams()
→ EVENT_POLL_PENDING_DONE
├── 有数据: 解析SatelliteDatagram → 写入SmsProvider → 通知App
└── 无数据: 结束轮询
└── 节流: 最小轮询间隔10s
└── SharedPreferences datagramId 去重
4.4 双路径信号上报
| 路径 | 模式 | 触发源 | 通知链路 |
|---|---|---|---|
| 路径A | OEM卫星模式 | ISatellite HAL | ISatelliteListener.onNtnSignalStrengthChanged() → SatelliteController → INtnSignalStrengthCallback |
| 路径B | Carrier NTN漫游 | IRadio AIDL | RIL_UNSOL_SIGNAL_STRENGTH → SignalStrengthController → SatelliteController |
NtnSignalStrength (5级离散模型):
NONE(0)/POOR(1)/FAIR(2)/GOOD(3)/EXCELLENT(4)- 包含 rssi(dBm) 和 snr(dB) 原始值
- 滞后滤波防止等级频繁跳变
五、系统集成点与用户接口
5.1 系统服务注册
// Context.java:7088
public static final String SATELLITE_SERVICE = "satellite";
// PackageManager.java:4089
public static final String FEATURE_TELEPHONY_SATELLITE = "android.hardware.telephony.satellite";
5.2 CarrierConfig 集成
SatelliteController.java 引用了大量 CarrierConfig 键值:
| 配置键 | 功能 |
|---|---|
KEY_SATELLITE_ATTACH_SUPPORTED_BOOL | 卫星附着支持 |
KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT | NTN连接类型(自动/手动) |
KEY_SATELLITE_SUPPORTED_MSG_APPS_STRING_ARRAY | 支持的消息应用 |
KEY_SATELLITE_ROAMING_P2P_SMS_SUPPORTED_BOOL | P2P SMS支持 |
KEY_SATELLITE_ESOS_SUPPORTED_BOOL | ESOS紧急SOS支持 |
KEY_SATELLITE_DATA_SUPPORT_MODE_INT | 卫星数据模式 |
KEY_REGIONAL_SATELLITE_EARFCN_BUNDLE | 区域卫星EARFCN |
KEY_SATELLITE_CONFIGS_PER_PLMN_BUNDLE | 按PLMN的卫星配置 |
KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL | 卫星资格支持 |
KEY_SATELLITE_DISPLAY_NAME_STRING | 卫星显示名称 |
5.3 对星UI — PointingAppController
文件: PointingAppController.java (27.4KB)
- 管理全屏/小窗口两种对星模式
- 通过
AntennaPosition/PointingInfo数据类提供对准引导 AntennaDirection提供天线方向信息
5.4 地面/卫星智能切换
地面网络恢复 → ISatelliteListener.onTerrestrialNetworkAvailableChanged(true)
→ SatelliteController → 评估是否应关闭卫星
├── CarrierConfig允许自动切换: → requestSatelliteEnabled(false) → DisablingState
└── 需手动确认: → 通知提示用户
并发地面扫描: IdleState中isConcurrentTnScanningSupported()
→ enableCellularModemWhileSatelliteModeIsOn(true)
→ 卫星运行期间保持地面Modem可用
5.5 紧急SOS — SatelliteSOSMessageRecommender
文件: SatelliteSOSMessageRecommender.java (40.6KB)
- T911/SOS 双模式紧急呼叫推荐
- ESOS Profile 支持
DATAGRAM_TYPE_SOS_MESSAGE紧急数据报类型
六、安全性和权限管理
6.1 功能特性声明
// 设备必须声明卫星特性
PackageManager.FEATURE_TELEPHONY_SATELLITE = "android.hardware.telephony.satellite"
6.2 运营级访问控制
- 卫星通信权限: 应用需持有卫星相关权限
- 订阅资格验证:
provisionSatellite()/deprovisionSatellite()管理订阅 SatelliteSubscriberProvisionStatus跟踪订阅状态- 位置访问控制:
requestIsCommunicationAllowedForCurrentLocation()检查当前位置是否允许卫星通信 - 收费告知: 系统弹窗告知用户卫星服务可能产生费用
- 干扰源自动禁用: 卫星启用期间自动禁用BT/WiFi/NFC/UWB以避免射频干扰
6.3 数据安全
- Modem层: 3GPP AKA认证 + 空中接口加密
- PLMN级接入控制:
setSatellitePlmn(carrierPlmnArray, allSatellitePlmnArray)防止未授权附着 - 运营商级控制:
setSatelliteEnabledForCarrier()按载波粒度开关 setNullCipherAndIntegrityEnabled()适用于卫星网络的安全上下文
七、配置标志体系
文件: satellite.aconfig — 18个功能标志
| Flag | 目标季度 | 功能 |
|---|---|---|
oem_enabled_satellite_flag | 24Q3 | OEM卫星通信支持 |
carrier_enabled_satellite_flag | 24Q3 | 运营商卫星通信支持 |
carrier_roaming_nb_iot_ntn | 24Q3 | NB-IoT NTN运营商漫游 |
oem_enabled_satellite_phase_2 | 24Q4 | OEM卫星Phase 2 |
geofence_enhancement_for_better_ux | 24Q4 | 地理围栏UX增强 |
satellite_system_apis | 25Q2 | 隐藏API转System API |
satellite_state_change_listener | 25Q2 | 状态变化监听API |
satellite_25q4_apis | 25Q4 | 25Q4新API |
starlink_data_bugfix | 25Q2 | Starlink数据Bug修复 |
satellite_exit_p2p_session_outside_geofence | 25Q3 | 围栏外退出P2P会话 |
satellite_improve_multi_thread_design | 25Q3 | 多线程设计改进 |
satellite_data_metrics | 25Q3 | 卫星数据Metrics |
telephony_satellite_mainline_phase1 | 26Q2 | Mainline APEX Phase1 |
ast_skylo_fallback | 26Q1 | AST Skylo回退 |
vzw_ast_skylo_fallback | 25Q4 | VZW AST Skylo回退 |
support_carrier_ids_in_geofence | 25Q4 | 地理围栏支持Carrier ID |
satellite_26q2_apis | 26Q2 | 26Q2新API |
telephony_satellite_apis | 26Q2 | 卫星公开API支持 |
八、关键代码文件索引
| 文件 | 大小 | 核心内容 |
|---|---|---|
SatelliteManager.java | 170KB | 公开SDK API, 3891行 |
SatelliteController.java | 474KB | 服务总控, 10361行 |
SatelliteSessionController.java | 87KB | 9态状态机, 2056行 |
DatagramDispatcher.java | 66KB | 发送队列+重试, 1546行 |
SatelliteModemInterface.java | 63KB | HAL交互, 1433行 |
DatagramReceiver.java | 45KB | 接收轮询, 1050行 |
SatelliteSOSMessageRecommender.java | 41KB | 紧急SOS推荐 |
SatelliteServiceUtils.java | 36KB | 类型转换工具 |
ISatellite.aidl | 22KB | HAL接口, 20个方法 |
SatelliteImplBase.java | 31KB | 厂商抽象基类 |
IRadioNetwork.aidl | 33KB | Radio HAL, 含3个卫星方法 |
九、Radio HAL 版本信息
文件: hardware/interfaces/radio/aidl/Android.bp
- 当前最高版本: 版本 4
frozen: false— 接口尚未冻结RELEASE_ALWAYS_USE_UNFROZEN_RADIO_HAL编译标志控制是否使用未冻结版本- 卫星方法(
setSatellitePlmn等)存在于当前开发分支但尚未纳入版本4 API快照
十、总结
Android 16 的卫星通信功能是一套完整的、模块化的、标准化的卫星通信框架,核心设计特点包括:
-
9态严格状态机 —
SatelliteSessionController提供完整的状态转换守卫和超时处理 -
双HAL架构 — ISatellite专用HAL(OEM卫星模式) + IRadioNetwork HAL(NTN漫游模式)
-
双优先级消息队列 — 紧急消息优先、重试机制、MT轮询节流
-
双路径信号上报 — 5级离散模型 + 滞后滤波
-
精细功耗管理 — 灭屏30s/分级超时/干扰源自动禁用/并发地面扫描
-
8维Metrics体系 — 全链路可观测性
-
18个aconfig标志 — 支持功能阶段性发布和OEM/运营商级控制
-
零侵入设计 — 独立
android.telephony.satellite包,不修改核心Telephony接口 分析报告已完成。与上次分析相比,这次的关键突破在于: -
发现了完整的卫星通信源码 — 在
frameworks/opt/telephony/src/java/com/android/internal/telephony/satellite/下找到了 20+ 个 Java 实现文件 + 8 个 Metrics 类 -
发现了公开 API 层 — 在
frameworks/base/telephony/java/android/telephony/satellite/下有 52 个文件,包含完整的SatelliteManagerSDK -
发现了 HAL 接口定义 —
stub/ISatellite.aidl包含 20 个 HAL 方法 -
发现了 18 个功能标志 —
satellite.aconfig控制卫星功能的阶段性发布 -
发现了对比分析报告 — 源码树中自带了 Kylin Android 13 与 Android 16 AOSP 的卫星通信对比分析文档
Android 16 的卫星通信是一个功能完整、架构成熟的技术框架,核心聚焦于紧急SOS消息和低带宽数据报传输,采用9态状态机、双HAL架构、双优先级消息队列等先进设计模式。