Android 13代码仓库:
| 仓库名 | 路径 | 文件 |
|---|---|---|
| RIL | vendor/cnt/RilXW | packages/service/XwosTeleService/src/com/starkylin/xwos/teleservice/TeleLocationService.java |
| platform/vendor/xwos | ||
| platform/frameworks/base | telephony/java/com/android/internal/telephony/XWRadioConstants.java | |
| device/sprd | ||
| platform/packages/apps/Settings | src_starkylin/com/starkylin/settings/deviceinfo/ProcessorInfoPreferenceController.java | |
| platform/packages/services/Telephony |
frameworks\base\telephony
一、概览
| 项目 | 信息 |
|---|---|
| 文件夹路径 | y:\build\ssd-1\tanzhoumei\code\frameworks\base\telephony |
| 卫星通信相关文件总数 | 7 个(含 AIDL/Java) |
| 卫星通信相关类/接口总数 | 11 个 |
| 分类统计 | API 类 1 / 数据模型类 1 / 常量定义接口 1 / AIDL 回调接口 5 / AIDL 服务接口 1 / 内部接口/类 2 |
说明:本目录下不存在标准 AOSP 的
satellite/子包,卫星通信功能以 XWOS(星网卫星 操作系统 ) 定制扩展的形式实现,代码集中在xwos子包和XWRadioConstants接口中,并通过TelephonyManager和ITelephony.aidl暴露接口。
二、详细清单
| 类/接口名 | 类型 | 文件路径 | 核心职责 | 稳定性注解 |
|---|---|---|---|---|
android.telephony.xwos.CallState | class (Parcelable) | java/android/telephony/xwos/CallState.java | XWOS 卫星通话状态数据结构,承载通话 ID、方向、状态、模式等 | @hide |
android.telephony.xwos.CallState | AIDL parcelable | java/android/telephony/xwos/CallState.aidl | CallState 的 AIDL 序列化声明 | 无 |
com.android.internal.telephony.xwos.ICallStateListener | AIDL interface (oneway) | java/com/android/internal/telephony/xwos/ICallStateListener.aidl | 卫星通话状态变化的跨进程回调接口 | @hide |
com.android.internal.telephony.XWRadioConstants | interface | java/com/android/internal/telephony/XWRadioConstants.java | XW 卫星通信全部常量定义(CP 状态、RIL 请求码、自定义请求 ID、事件 ID 等) | @hide |
com.android.internal.telephony.ITelephony (XW 部分) | AIDL interface | java/com/android/internal/telephony/ITelephony.aidl | Telephony 服务的 Binder 接口,包含 16 个 XW 卫星相关方法 | @hide |
com.android.internal.telephony.IIntegerConsumer | AIDL interface (oneway) | java/com/android/internal/telephony/IIntegerConsumer.aidl | 异步返回整数结果的跨进程回调 | @hide |
com.android.internal.telephony.IBooleanConsumer | AIDL interface (oneway) | java/com/android/internal/telephony/IBooleanConsumer.aidl | 异步返回布尔结果的跨进程回调 | @hide |
com.android.internal.telephony.IBiIntegerConsumer | AIDL interface (oneway) | java/com/android/internal/telephony/IBiIntegerConsumer.aidl | 异步返回双整数结果的跨进程回调 | @hide |
com.android.internal.telephony.ICustomRequestCallback | AIDL interface (oneway) | java/com/android/internal/telephony/ICustomRequestCallback.aidl | 自定义卫星功能请求的异步结果回调 | @hide |
com.android.internal.telephony.ICustomEventListener | AIDL interface (oneway) | java/com/android/internal/telephony/ICustomEventListener.aidl | 卫星自定义事件(如网络注册、预警上报等)的监听回调 | @hide |
TelephonyManager (XWOS 扩展部分) | class (内部含 2 个 interface + 2 个内部类) | java/android/telephony/TelephonyManager.java L17086-L17844 | 卫星通信公开 API 入口,封装所有 XW 卫星操作方法 | 全部 @hide |
三、核心类/接口详解
3.1 公开 API 层 — TelephonyManager XWOS 扩展
类名:android.telephony.TelephonyManager(XWOS 扩展部分)
-
继承 关系:无特殊继承(TelephonyManager 本身继承自 Object)
-
关键成员:
| 成员 | 类型 | 说明 |
|---|---|---|
sXwCallStateListeners | ConcurrentHashMap<XwCallStateListener, ICallStateListener> | 通话状态监听器注册表 |
sCustomEventListeners | HashMap<CustomEventListener, ICustomEventListener> | 自定义事件监听器注册表 |
KEY_SECTF_XW_HANDLE | String 常量 | 安全卡状态异步结果 Key |
KEY_POSTIME_XW_HANDLE | String 常量 | 位置时间异步结果 Key |
KEY_EXECUTE_STUN_XW_HANDLE | String 常量 | 摇晕操作异步结果 Key |
KEY_EXECUTE_KILL_XW_HANDLE | String 常量 | 摇毙操作异步结果 Key |
-
关键方法:
| 方法 | 功能说明 |
|---|---|
getRadioSlotIdXw(Executor, Consumer<Integer>) | 获取 XW 卫星模块的 Slot ID |
setRadioPowerXw(boolean, Executor, Consumer<Boolean>) | 开启/关闭卫星 CP 电源 |
getRadioPowerStateXw() | 获取卫星 CP 电源状态(同步) |
setCommunicationTypeXw(int, Executor, Consumer<Boolean>) | 设置高低轨类型(XW_SATELLITE_S 高轨 / XW_SATELLITE_L 低轨) |
getCommunicationTypeXw(Executor, Consumer<Integer>) | 获取当前高低轨类型 |
setUsbDebuggingTypeXw(int, Executor, Consumer<Boolean>) | 设置 USB 调试模式(AP/CP) |
getUsbDebuggingTypeXw(Executor, Consumer<Integer>) | 获取 USB 调试模式 |
getSectfXw() / getSectfXwAsync(...) | 获取安全卡状态 |
getPostimeXwAsync(int, Executor, OutcomeReceiver) | 获取卫星位置与时间信息 |
setPostimeXwAsync(int, String, Executor, OutcomeReceiver) | 设置卫星位置与时间信息 |
getPowerStateXwAsync(int, Executor, OutcomeReceiver) | 获取卫星终端电源状态 |
executeStunXwAsync(int, int, int, Executor, OutcomeReceiver) | 执行摇晕操作(功率控制) |
executeKillXwAsync(int, Executor, OutcomeReceiver) | 执行摇毙操作 |
customRequest(int, byte[], Executor, CustomRequestCallback) | 发送自定义卫星功能请求(通用扩展接口) |
registerForCustomEventListener(Handler, CustomEventListener) | 注册卫星自定义事件监听 |
unregisterForCustomEventListener(CustomEventListener) | 注销卫星自定义事件监听 |
dialXw(String, int, int, Executor, Consumer<Integer>) | 卫星拨号接口(号码、语音类型、编码速率) |
registerCallStateListener(Executor, XwCallStateListener) | 注册卫星通话状态监听 |
unregisterCallStateListener(XwCallStateListener) | 注销卫星通话状态监听 |
setCarrierMode(int, Executor, Consumer<Integer>) | 设置窄带终端载波模式 |
getCarrierMode(Executor, BiConsumer<Integer, Integer>) | 获取窄带终端载波模式 |
getSatellitePhoneId() | 获取卫星 Phone ID(默认为 getPhoneCount() - 1) |
isSatellitePhoneId(int) | 判断给定 phoneId 是否为卫星 Phone |
-
内部接口/类:
| 名称 | 类型 | 说明 |
|---|---|---|
XwCallStateListener | interface | 卫星通话状态变化监听器,回调 onCallStateChanged(CallState) |
XwCallStateListenerWrapper | class | 将 XwCallStateListener 包装为 ICallStateListener.Stub 的 Binder 适配器 |
CustomRequestCallback | interface | 自定义请求结果回调,onResult(int errorno, int result, byte[] extrasData) |
CustomEventListener | interface | 自定义事件监听器,onEvent(int event, byte[] extrasData) |
CustomEventListenerWrapper | class | 将 CustomEventListener 包装为 ICustomEventListener.Stub 的 Binder 适配器 |
-
交互对象:通过
ITelephonyAIDL 接口(Binder)与 Telephony 服务进程通信;使用IIntegerConsumer、IBooleanConsumer、IBiIntegerConsumer、ICustomRequestCallback、ICallStateListener、ICustomEventListener等 AIDL 回调接口接收异步结果。
3.2 数据模型层 — CallState
类名:android.telephony.xwos.CallState
-
继承 关系:实现
Parcelable接口 -
关键成员:
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 通话 ID |
dir | int | 呼叫方向(呼入/呼出) |
stat | int | 通话状态 |
mode | int | 通话模式 |
mpty | int | 是否多方通话 |
number | String | 电话号码 |
num_type | int | 号码类型 |
rate | int | 编码速率 |
-
关键方法:
-
writeToParcel(Parcel, int)— 序列化 -
describeContents()— Parcelable 描述 -
equals(Object)/hashCode()— 对象比较 -
toString()— 调试输出
-
-
交互对象:被
ICallStateListener.aidl作为回调参数传递,被TelephonyManager.XwCallStateListener消费。
3.3 常量定义层 — XWRadioConstants
接口名:com.android.internal.telephony.XWRadioConstants
-
继承 关系:无(纯常量接口)
-
关键常量分组:
| 分组 | 常量数量 | 说明 |
|---|---|---|
| CP 状态 | 7 | XW_RADIO_STATE_UNAVAILABLE ~ XW_RADIO_STATE_CONNECED |
| USB 切换类型 | 2 | XW_USB_AP / XW_USB_CP |
| 高低轨类型 | 2 | XW_SATELLITE_S(高轨)/ XW_SATELLITE_L(低轨) |
| XW Message codes | 34 | CMD/EVENT 命令码(CMD_EVENT_BASE = 10000) |
| RIL XW Request | 18 | RIL 请求码(RIL_XW_REQUEST_BASE = 80000) |
| RIL XW Unsolicited | 5 | RIL 主动上报码(RIL_XW_UNSOL_RESPONSE_BASE = 90000) |
| Custom Request SET | 41 | 自定义设置请求 ID(CUSTOM_REQUEST_SET_BASE = 0) |
| Custom Request GET | 57 | 自定义查询请求 ID(CUSTOM_REQUEST_GET_BASE = 100) |
| Custom Request DATA | 6 | 数据获取请求 ID(CUSTOM_REQUEST_DATA_BASE = 0x100000) |
| Custom Request HH | 3 | HH 项目专用请求 ID(CUSTOM_REQUEST_HH_BASE = 0x200000) |
-
交互对象:被
TelephonyManager静态导入(import static XWRadioConstants.*),作为所有 XW 方法的参数/返回值常量来源。
3.4 AIDL 回调接口层
接口名:com.android.internal.telephony.xwos.ICallStateListener
-
类型:AIDL oneway interface
-
关键方法:
void onCallStateChanged(in @nullable CallState callState)— 通话状态变化时由服务端回调 -
交互对象:由
TelephonyManager.XwCallStateListenerWrapper实现 Stub,通过ITelephony.registerCallStateListener()注册到服务端
接口名:com.android.internal.telephony.ICustomRequestCallback
-
类型:AIDL oneway interface
-
关键方法:
void onResult(int errorno, int result, in @nullable byte[] extrasData)— 自定义请求完成时回调 -
交互对象:由
TelephonyManager内部匿名类实现 Stub,通过ITelephony.customRequest()传递
接口名:com.android.internal.telephony.ICustomEventListener
-
类型:AIDL oneway interface
-
关键方法:
void onEvent(int event, in @nullable byte[] extrasData)— 自定义事件上报时回调 -
交互对象:由
TelephonyManager.CustomEventListenerWrapper实现 Stub,通过ITelephony.addCustomEventChanged()注册
接口名:IIntegerConsumer / IBooleanConsumer / IBiIntegerConsumer
-
类型:AIDL oneway interface(通用异步回调)
-
关键方法:
accept(int)/accept(boolean)/accept(int, int)— 分别返回单整数、布尔值、双整数结果 -
交互对象:被
TelephonyManager中大量 XW 方法用作异步回调包装
3.5 AIDL 服务接口层 — ITelephony (XW 部分)
接口名:com.android.internal.telephony.ITelephony(XW 卫星方法部分)
-
类型:AIDL interface
-
关键方法(共 16 个 XW 相关):
| 方法 | 说明 |
|---|---|
getRadioSlotIdXw(IIntegerConsumer) | 获取卫星 Slot ID |
setRadioPowerXw(boolean, IBooleanConsumer) | 设置卫星 CP 电源 |
getRadioPowerStateXw() | 获取卫星 CP 电源状态(同步) |
setCommunicationTypeXw(int, IBooleanConsumer) | 设置高低轨类型 |
getCommunicationTypeXw(IIntegerConsumer) | 获取高低轨类型 |
setUsbDebuggingTypeXw(int, IBooleanConsumer) | 设置 USB 调试模式 |
getUsbDebuggingTypeXw(IIntegerConsumer) | 获取 USB 调试模式 |
getSectfXw() | 获取安全卡状态(同步) |
getSectfXwAsync(ResultReceiver) | 获取安全卡状态(异步) |
getPostimeXwAsync(int, ResultReceiver) | 获取位置时间 |
setPostimeXwAsync(int, String, ResultReceiver) | 设置位置时间 |
getPowerStateXwAsync(int, ResultReceiver) | 获取电源状态 |
executeStunXwAsync(int, int, int, ResultReceiver) | 执行摇晕 |
executeKillXwAsync(int, ResultReceiver) | 执行摇毙 |
customRequest(int, byte[], ICustomRequestCallback) | 自定义功能请求 |
addCustomEventChanged(ICustomEventListener) / removeCustomEventChanged(ICustomEventListener) | 注册/注销自定义事件 |
dialXw(String, int, int, IIntegerConsumer) | 卫星拨号 |
registerCallStateListener(ICallStateListener) / unregisterCallStateListener(ICallStateListener) | 注册/注销通话状态监听 |
setCarrierMode(int, IIntegerConsumer) / getCarrierMode(IBiIntegerConsumer) | 设置/获取载波模式 |
-
交互对象:由
PhoneInterfaceService(不在本目录)实现,TelephonyManager通过getITelephony()获取代理调用。
四、依赖关系图
graph TD
subgraph "公开 API 层"
TM["TelephonyManager<br/>(XWOS 扩展方法)"]
XCSL["XwCallStateListener<br/>(interface)"]
CRCB["CustomRequestCallback<br/>(interface)"]
CEL["CustomEventListener<br/>(interface)"]
end
subgraph "数据模型层"
CS["CallState<br/>(Parcelable)"]
end
subgraph "常量定义层"
XWRC["XWRadioConstants<br/>(interface)"]
end
subgraph "AIDL 回调接口层"
ICSL["ICallStateListener<br/>(AIDL oneway)"]
ICRC["ICustomRequestCallback<br/>(AIDL oneway)"]
ICEL["ICustomEventListener<br/>(AIDL oneway)"]
IIC["IIntegerConsumer<br/>(AIDL oneway)"]
IBC["IBooleanConsumer<br/>(AIDL oneway)"]
IBIC["IBiIntegerConsumer<br/>(AIDL oneway)"]
end
subgraph "AIDL 服务接口层"
IT["ITelephony.aidl<br/>(XW 方法部分)"]
end
TM -->|"静态导入常量"| XWRC
TM -->|"getITelephony()"| IT
TM -->|"定义内部接口"| XCSL
TM -->|"定义内部接口"| CRCB
TM -->|"定义内部接口"| CEL
TM -->|"XwCallStateListenerWrapper<br/>实现 Stub"| ICSL
TM -->|"匿名类实现 Stub"| ICRC
TM -->|"CustomEventListenerWrapper<br/>实现 Stub"| ICEL
TM -->|"匿名类实现 Stub"| IIC
TM -->|"匿名类实现 Stub"| IBC
TM -->|"匿名类实现 Stub"| IBIC
XCSL -->|"回调参数"| CS
ICSL -->|"回调参数"| CS
IT -->|"参数/返回值"| ICSL
IT -->|"参数/返回值"| ICRC
IT -->|"参数/返回值"| ICEL
IT -->|"参数/返回值"| IIC
IT -->|"参数/返回值"| IBC
IT -->|"参数/返回值"| IBIC
style TM fill:#4CAF50,color:#fff
style CS fill:#2196F3,color:#fff
style XWRC fill:#FF9800,color:#fff
style IT fill:#9C27B0,color:#fff
暂时无法在飞书文档外展示此内容
调用流程说明:
-
应用层调用
TelephonyManager的 XW 方法(如dialXw()) -
TelephonyManager通过getITelephony()获取ITelephonyBinder 代理 -
调用
ITelephony.aidl中定义的对应方法(如dialXw()),传入 AIDL 回调接口(如IIntegerConsumer) -
Telephony 服务端(
PhoneInterfaceService)接收请求,转发至 RIL 层 -
RIL 层通过
RIL_XW_REQUEST_*常量与卫星 CP 通信 -
结果通过 AIDL 回调接口异步返回给
TelephonyManager -
TelephonyManager通过 Executor 切换线程,调用应用层注册的回调
五、总结与建议
当前覆盖的卫星通信功能范围
本目录下的 XWOS 卫星通信代码覆盖了以下功能领域:
| 功能领域 | 覆盖情况 | 对应方法/常量 |
|---|---|---|
| 卫星电源管理 | ✅ 完整 | setRadioPowerXw, getRadioPowerStateXw, getPowerStateXwAsync |
| 高低轨切换 | ✅ 完整 | setCommunicationTypeXw, getCommunicationTypeXw |
| 卫星语音通话 | ✅ 完整 | dialXw, registerCallStateListener, CallState |
| USB 调试模式 | ✅ 完整 | setUsbDebuggingTypeXw, getUsbDebuggingTypeXw |
| 安全模块 | ✅ 完整 | getSectfXw, getSectfXwAsync |
| 位置与时间 | ✅ 完整 | getPostimeXwAsync, setPostimeXwAsync |
| 功率控制(摇晕/摇毙) | ✅ 完整 | executeStunXwAsync, executeKillXwAsync |
| 自定义扩展请求 | ✅ 完整 | customRequest, ICustomRequestCallback, ICustomEventListener |
| 载波模式 | ✅ 完整 | setCarrierMode, getCarrierMode |
| 卫星网络注册 | ✅ 通过 customRequest | CUSTOM_REQUEST_SET_CREGXW / CUSTOM_REQUEST_GET_CREGXW |
| 卫星 QoS | ✅ 通过 customRequest | CUSTOM_REQUEST_SET_CQOSXW / CUSTOM_REQUEST_GET_CQOSXW |
| 导航增强 | ✅ 通过 customRequest | CUSTOM_REQUEST_SET_SSRINFOXW / CUSTOM_REQUEST_GET_SSRMODEXW |
| 星历信息 | ✅ 通过 customRequest | CUSTOM_REQUEST_SET_EPHEMXW / CUSTOM_REQUEST_GET_EPHEMXW |
| 物联网数据传输 | ✅ 通过 customRequest | CUSTOM_REQUEST_SET_IOTULDATAXW / CUSTOM_REQUEST_GET_IOTDLDATAXW |
| 窄带终端 | ✅ 通过 customRequest | CUSTOM_REQUEST_SET_CARRIERMODEXW / CUSTOM_REQUEST_SET_REGIONXW |
| 宽带终端 | ✅ 通过 customRequest | CUSTOM_REQUEST_SET_DUDIAXW / CUSTOM_REQUEST_SET_ANTOTAXW |
明显缺失的功能或接口
-
无独立卫星 API 管理类:标准 AOSP 提供了
SatelliteManager作为卫星通信的统一入口,本代码库将所有卫星功能直接挂在TelephonyManager上,缺乏模块化隔离。如果后续 AOSP 升级引入标准SatelliteManager,将产生冲突。 -
无卫星数据业务 API:当前仅有语音通话(
dialXw)和数据传输(通过customRequest的物联网数据包),缺少标准化的卫星数据连接(Data Call)管理接口,如卫星数据会话的建立、断开、状态查询等。 -
无卫星短信 API:缺少卫星 SMS 收发接口,
SmsManager中未发现 XW 扩展。 -
无卫星紧急呼叫标识:
dialXw未区分普通呼叫与紧急呼叫,缺少紧急呼叫优先级处理机制。 -
缺少卫星信号强度/状态公开 API:虽然有
CUSTOM_REQUEST_RSSI/CUSTOM_REQUEST_SNR等常量,但没有封装为独立的信号强度查询 API(类似CellSignalStrength体系)。 -
CallState字段全部为 int 缺少枚举定义:dir、stat、mode等字段均为裸int,缺少@IntDef注解或枚举类来约束合法值,容易导致调用方传入错误值。 -
所有接口均标记
@hide:没有任何公开 SDK 接口,第三方应用无法直接使用卫星功能。
代码质量/注释完整度评价
| 维度 | 评价 | 说明 |
|---|---|---|
| 注释完整度 | ⭐⭐⭐ 中等 | 方法有中文注释说明用途和参数,但缺少 Javadoc 标准格式(@param/@return),CallState 字段缺少值域说明 |
| 代码规范 | ⭐⭐ 偏低 | 方法命名不统一(部分用 Xw 后缀,部分用 XwAsync 后缀);getSectfXw() 同步方法与异步方法混用不同返回模式(int vs ResultReceiver vs IIntegerConsumer);customRequest 使用裸 byte[] 传递数据,缺乏类型安全 |
| 错误处理 | ⭐⭐ 偏低 | 大部分方法仅 catch RemoteException 后打日志,未向调用方传递错误;setPostimeXwAsync 的 catch 日志写的是 getPostimeXwAsync(复制粘贴错误) |
| 线程安全 | ⭐⭐⭐ 中等 | 监听器注册表使用了 ConcurrentHashMap/synchronized,但 sCustomEventListeners 使用普通 HashMap + synchronized 而非 ConcurrentHashMap,与 sXwCallStateListeners 风格不一致 |
| Binder 生命周期 | ⭐⭐⭐ 中等 | registerCallStateListener 中添加了 linkToDeath 处理,但 registerForCustomEventListener 未添加死亡通知清理 |
packages\services\Telephony
一、概览
| 项目 | 内容 |
|---|---|
| 文件夹路径 | y:\build\ssd-1\tanzhoumei\code\packages\services\Telephony |
| 源码文件总数 | 约 120+ 个 .java 文件(src/ 目录下) |
| 卫星通信相关类/接口总数 | 1 个核心类 + 5 个外部依赖接口/常量类(定义在 com.android.internal.telephony 包中,不在本文件夹内) |
| 分类统计 | API 类: 1 / 服务类: 1 / 数据类: 0 / HAL 类: 0 / 回调类: 0(内部) / 其他: 5(外部依赖) |
重要说明
本文件夹(packages/services/Telephony)是 AOSP 中 Telephony Phone 应用的实现,并非卫星通信框架的核心目录。卫星通信的框架层代码通常位于 frameworks/base/telephony/java/android/telephony/satellite/ 和 frameworks/opt/telephony/src/java/com/android/internal/telephony/satellite/ 中。
本文件夹中的卫星通信功能体现为 UNISOC(展锐)自定义的"星网"(XW)卫星通信扩展,全部集中在 PhoneInterfaceManager.java 一个文件中,通过 ITelephony AIDL 接口对外暴露。
二、详细清单
2.1 本文件夹内的卫星通信相关类
| 类/接口名 | 类型 | 文件路径 | 核心职责 | 稳定性注解 |
|---|---|---|---|---|
PhoneInterfaceManager | class (extends ITelephony.Stub) | src/com/android/phone/PhoneInterfaceManager.java | Telephony 服务的 Binder 实现,包含所有卫星通信(XW)相关 API 的服务端实现 | @hide(内部系统类) |
2.2 本文件夹内卫星通信相关的内部组件(PhoneInterfaceManager 内部)
| 组件名 | 类型 | 所在行号 | 核心职责 | 稳定性注解 |
|---|---|---|---|---|
XWRadioState | 成员变量 (int) | L420 | 卫星通信射频状态追踪 | private |
mXWSlotId | 成员变量 (int) | L421 | 卫星通信卡槽 ID | private |
mIsXWRadioState | 成员变量 (boolean) | L422 | 卫星通信射频连接状态标志 | private |
mXwRadioReceiver | 内部 BroadcastReceiver | L12334 | 监听卫星通信射频状态变化广播 | private |
2.3 外部依赖的卫星通信相关接口/类(不在本文件夹内,但被本文件夹引用)
| 类/接口名 | 类型 | 所属包 | 核心职责 | 稳定性注解 |
|---|---|---|---|---|
XWRadioConstants | 常量类 | com.android.internal.telephony | 定义 XW 卫星通信相关常量(如 XW_RADIO_STATE_CLOSED、XW_RADIO_STATE_CONNECTING、XW_RADIO_STATE_CONNECED、XW_RADIO_STATE_UNAVAILABLE、CMD_* 命令常量等) | @hide |
ICallStateListener | AIDL interface | com.android.internal.telephony.xwos | 卫星通信通话状态监听回调接口 | @hide |
ICustomEventListener | AIDL interface | com.android.internal.telephony | 卫星通信自定义事件监听回调接口 | @hide |
ICustomRequestCallback | AIDL interface | com.android.internal.telephony | 卫星通信自定义请求结果回调接口 | @hide |
CustomResponse | 数据类 | com.android.internal.telephony | 卫星通信自定义请求响应数据模型 | @hide |
2.4 字符串资源
| 资源名 | 值 | 文件路径 |
|---|---|---|
satellite_communication | "Satellite communication" | res/values/strings.xml |
satellite_communication_data_connected | "The satellite communication data link has been successfully established." | res/values/strings.xml |
satellite_communication_data_connecting | "The satellite communication link is abnormal and is currently undergoing automatic recovery. Please wait." | res/values/strings.xml |
三、核心类/接口详解
3.1 服务实现层 — PhoneInterfaceManager
类名:com.android.phone.PhoneInterfaceManager
-
继承关系:
extends ITelephony.Stub(实现 ITelephony AIDL 接口) -
关键成员:
| 成员 | 类型 | 说明 |
|---|---|---|
XWRadioState | int | 卫星通信射频当前状态,初始值 XW_RADIO_STATE_CLOSED |
mXWSlotId | int | 卫星通信卡槽 ID,初始值 -1 |
mIsXWRadioState | boolean | 卫星通信射频是否已连接,初始值 false |
mXwRadioReceiver | BroadcastReceiver | 监听 ACTION_PRIVATE_XWRADIO_STATE_CHANGE 广播,更新射频状态并发送通知 |
-
关键方法(卫星通信相关) :
| 方法签名 | 功能说明 |
|---|---|
getRadioSlotIdXw(IIntegerConsumer) | 获取卫星通信卡槽 ID,异步回调 |
setRadioPowerXw(boolean, IBooleanConsumer) | 开关卫星通信射频电源,同时更新 Settings.Global.XW_CP_ON |
getRadioPowerStateXw() | 获取卫星通信射频电源状态(同步) |
setCommunicationTypeXw(int, IBooleanConsumer) | 设置卫星通信类型 |
getCommunicationTypeXw(IIntegerConsumer) | 获取卫星通信类型 |
setUsbDebuggingTypeXw(int, IBooleanConsumer) | 设置卫星通信 USB 调试类型 |
getUsbDebuggingTypeXw(IIntegerConsumer) | 获取卫星通信 USB 调试类型 |
getSectfXw() | 获取卫星通信 SECTF 值(同步) |
getSectfXwAsync(ResultReceiver) | 获取卫星通信 SECTF 值(异步) |
getPostimeXwAsync(int, ResultReceiver) | 获取卫星通信位置时间信息(异步) |
setPostimeXwAsync(int, String, ResultReceiver) | 设置卫星通信位置时间信息(异步) |
getPowerStateXwAsync(int, ResultReceiver) | 获取卫星通信电源状态(异步) |
executeStunXwAsync(int, int, int, ResultReceiver) | 执行卫星通信 STUN 操作(异步) |
executeKillXwAsync(int, ResultReceiver) | 执行卫星通信 KILL 操作(异步) |
customRequest(int, byte[], ICustomRequestCallback) | 发送自定义卫星通信请求 |
addCustomEventChanged(ICustomEventListener) | 注册卫星通信自定义事件监听 |
removeCustomEventChanged(ICustomEventListener) | 注销卫星通信自定义事件监听 |
registerCallStateListener(ICallStateListener) | 注册卫星通信通话状态监听 |
unregisterCallStateListener(ICallStateListener) | 注销卫星通信通话状态监听 |
dialXw(String, int, int, IIntegerConsumer) | 发起卫星通信拨号 |
setCarrierMode(int, IIntegerConsumer) | 设置卫星通信载波模式 |
getCarrierMode(IBiIntegerConsumer) | 获取卫星通信载波模式 |
sendSalliteSwitchChangedNotification(Context, boolean) | 发送卫星通信状态切换通知(private 方法) |
-
交互对象:
-
TelephonyManager.getDefault().getSatellitePhoneId():获取卫星通信 Phone 实例 ID -
PhoneFactory.getPhone(satellitePhoneId):获取卫星通信 Phone 对象 -
Phone接口的 XW 扩展方法:如phone.getSlotIdXW()、phone.setRadioPowerXw()、phone.setCommunicationTypeXw()、phone.dialXw()等 -
Intent.ACTION_PRIVATE_XWRADIO_STATE_CHANGE:接收射频状态变化广播 -
Settings.Global.XW_CP_ON:持久化卫星通信射频开关状态 -
NotificationChannelController.CHANNEL_ID_SALLITE_SWITCH:卫星通信通知渠道 -
TelephonyManager的 Key 常量:KEY_SECTF_XW_HANDLE、KEY_POSTIME_XW_HANDLE、KEY_EXECUTE_STUN_XW_HANDLE、KEY_EXECUTE_KILL_XW_HANDLE
-
3.2 外部依赖接口层 — AIDL 回调与常量
com.android.internal.telephony.XWRadioConstants
-
类型:常量类
-
核心职责:定义卫星通信(XW)相关的状态常量和命令常量
-
关键常量:
-
XW_RADIO_STATE_CLOSED— 射频关闭 -
XW_RADIO_STATE_CONNECTING— 射频连接中 -
XW_RADIO_STATE_CONNECED— 射频已连接(注意:拼写错误,应为 CONNECTED) -
XW_RADIO_STATE_UNAVAILABLE— 射频不可用 -
CMD_GET_SLOTID、CMD_SET_RADIO_POWER、CMD_SET_COMMUNICATION_TYPE、CMD_GET_COMMUNICATION_TYPE等命令常量
-
com.android.internal.telephony.xwos.ICallStateListener
-
类型:AIDL interface
-
核心职责:卫星通信通话状态变化回调接口
-
交互对象:由
PhoneInterfaceManager通过Phone.registerForXwCallStateChanged()/Phone.unregisterForXwCallStateChanged()注册/注销
com.android.internal.telephony.ICustomEventListener
-
类型:AIDL interface
-
核心职责:卫星通信自定义事件监听回调
-
交互对象:由
PhoneInterfaceManager通过Phone.addCustomEventChanged()/Phone.removeCustomEventChanged()注册/注销
com.android.internal.telephony.ICustomRequestCallback
-
类型:AIDL interface
-
核心职责:卫星通信自定义请求结果回调
-
关键方法:
onResult(int errorno, int result, byte[] extrasData)
四、依赖关系图
graph TD
subgraph "本文件夹 (packages/services/Telephony)"
PIM["PhoneInterfaceManager<br/>(extends ITelephony.Stub)"]
XWRCV["mXwRadioReceiver<br/>(BroadcastReceiver)"]
NOTIF["sendSalliteSwitchChangedNotification<br/>(Notification)"]
STRINGS["strings.xml<br/>(satellite_communication*)"]
end
subgraph "com.android.internal.telephony (外部依赖)"
XWRC["XWRadioConstants<br/>(常量类)"]
ICSL["ICallStateListener<br/>(AIDL interface)"]
ICEL["ICustomEventListener<br/>(AIDL interface)"]
ICRC["ICustomRequestCallback<br/>(AIDL interface)"]
CR["CustomResponse<br/>(数据类)"]
end
subgraph "framework 层 (外部依赖)"
TM["TelephonyManager<br/>.getSatellitePhoneId()"]
IIC["IIntegerConsumer / IBiIntegerConsumer<br/>IBooleanConsumer"]
end
subgraph "RIL/Modem 层 (外部依赖)"
PHONE["Phone (XW扩展方法)<br/>getSlotIdXW / setRadioPowerXw<br/>dialXw / setCommunicationTypeXw<br/>registerForXwCallStateChanged"]
end
PIM -->|"import static"| XWRC
PIM -->|"implements ITelephony"| ICSL
PIM -->|"implements ITelephony"| ICEL
PIM -->|"implements ITelephony"| ICRC
PIM -->|"uses"| CR
PIM -->|"gets satellite Phone"| TM
PIM -->|"calls XW methods"| PHONE
PIM -->|"uses callbacks"| IIC
PIM -->|"contains"| XWRCV
PIM -->|"calls"| NOTIF
NOTIF -->|"uses strings"| STRINGS
XWRCV -->|"updates"| PIM
PHONE -->|"AsyncResult callback"| PIM
交互流程说明
-
API 调用链路:外部应用 →
ITelephony.Stub(Binder) →PhoneInterfaceManager→PhoneFactory.getPhone(satellitePhoneId)→Phone(XW 扩展方法) → RIL/Modem -
状态监听链路:Modem 状态变化 →
Intent.ACTION_PRIVATE_XWRADIO_STATE_CHANGE广播 →mXwRadioReceiver→ 更新XWRadioState→ 发送通知 -
通话状态链路:Modem 通话状态变化 →
Phone.registerForXwCallStateChanged()→ICallStateListener回调 → 外部应用
五、总结与建议
当前文件夹覆盖的卫星通信功能范围
本文件夹中的卫星通信功能属于 UNISOC(展锐)厂商自定义扩展,命名以 "XW"(星网)为前缀,主要覆盖以下功能:
| 功能领域 | 覆盖情况 | 说明 |
|---|---|---|
| 卫星射频控制 | ✅ 已覆盖 | 开关射频、获取射频状态 |
| 卫星通信类型设置 | ✅ 已覆盖 | 设置/获取通信类型 |
| 卫星拨号 | ✅ 已覆盖 | dialXw 方法支持号码、类型、速率参数 |
| 卫星位置时间 | ✅ 已覆盖 | 获取/设置位置时间信息 |
| 卫星电源管理 | ✅ 已覆盖 | STUN/KILL 操作、电源状态查询 |
| 卫星 SECTF | ✅ 已覆盖 | 安全相关功能 |
| 卫星 USB 调试 | ✅ 已覆盖 | USB 调试类型设置 |
| 卫星载波模式 | ✅ 已覆盖 | 载波模式设置/查询 |
| 卫星自定义请求 | ✅ 已覆盖 | 通用自定义请求接口 |
| 卫星通话状态监听 | ✅ 已覆盖 | 注册/注销通话状态监听 |
| 卫星状态通知 | ✅ 已覆盖 | 状态栏通知显示 |
明显缺失的功能或接口
-
缺少独立的卫星通信服务类:所有卫星通信逻辑都嵌入在
PhoneInterfaceManager中(超过 500 行),未拆分为独立的SatelliteController或XwCommunicationController,违反单一职责原则。 -
缺少卫星通信数据模型类:没有定义
XwCallState、XwCommunicationType、XwRadioState等枚举或数据类,全部使用int常量。 -
缺少卫星通话连接管理:
TelephonyConnectionService和TelephonyConnection中完全没有卫星通话相关代码,意味着卫星通话可能未通过标准 Telecom 框架管理。 -
缺少卫星短信功能:没有看到卫星短信发送/接收相关代码。
-
缺少卫星 SOS/紧急通信:
EmergencyDialer和EmergencyTonePlayer中没有卫星紧急通信相关逻辑。 -
缺少 AOSP 标准卫星通信框架集成:没有引用
android.telephony.SatelliteManager或SatelliteState等 AOSP U 版本引入的标准卫星通信 API。 -
拼写错误:
XW_RADIO_STATE_CONNECED应为XW_RADIO_STATE_CONNECTED;sendSalliteSwitchChangedNotification应为sendSatelliteSwitchChangedNotification;CHANNEL_ID_SALLITE_SWITCH应为CHANNEL_ID_SATELLITE_SWITCH。
代码质量/注释完整度评价
| 评价维度 | 评分 | 说明 |
|---|---|---|
| 代码组织 | ⭐⭐ | 所有卫星通信代码集中在 PhoneInterfaceManager 中,未做模块化拆分 |
| 注释完整度 | ⭐⭐ | 方法缺少 Javadoc 注释,参数含义不明确(如 commType、usbDebuggingType 的取值范围未说明) |
| 命名规范 | ⭐⭐ | "XW" 前缀含义不明确;多处拼写错误(CONNECED、SALLITE) |
| 错误处理 | ⭐⭐⭐ | Phone 为 null 时有基本的错误回调处理,但异常信息不够详细 |
| 线程安全 | ⭐⭐⭐ | 使用 Binder.clearCallingIdentity() 正确处理了 Binder 线程切换,XWRadioState 未做同步保护 |
| AOSP 规范兼容性 | ⭐ | 完全是厂商自定义扩展,未与 AOSP 标准卫星通信框架对齐 |
-
卫星通信代码高度集中:所有卫星通信功能仅在 PhoneInterfaceManager.java 一个文件中实现,约 22 个公开方法 + 1 个通知方法 + 1 个广播接收器。
-
属于 UNISOC 厂商自定义扩展:以 "XW"(星网)为前缀,不是 AOSP 标准卫星通信框架的一部分。标准 AOSP 卫星通信框架(
SatelliteManager等)的代码位于frameworks/base/和frameworks/opt/telephony/中,不在本文件夹范围内。 -
主要改进方向:
- 将卫星通信逻辑从
PhoneInterfaceManager拆分为独立的 Controller 类 - 修复多处拼写错误(CONNECED → CONNECTED、SALLITE → SATELLITE)
- 补充方法注释和参数说明
- 考虑与 AOSP 标准卫星通信框架对齐
- 将卫星通信逻辑从
vendor\xwos
一、概览
-
文件夹路径:
y:\build\ssd-1\tanzhoumei\code\vendor\xwos -
源文件总数: 约 120+ 个(去重后核心文件约 50 个)
-
卫星通信相关类/接口总数: 30 个
-
分类统计:
| 分类 | 数量 | 说明 |
|---|---|---|
| API 类 | 2 | XwTelephonyManager, CallState |
| 服务类 | 5 | TeleService, TeleDataService, TeleVoiceService, TeleLocationService, TeleStatsService |
| 数据模型类 | 7 | XwRadioVoiceState, XwRadioVoiceData, XwCallState, XwRadioResponseInfo, PosTime, UeStatus, CqosRdp |
| HAL 接口类 | 6 | IXwRadio, IXwRadioResponse, IXwRadioIndication, IXwRadioVoice, IXwRadioVoiceResponse, IXwRadioVoiceIndication |
| 枚举/常量类 | 5 | XwRadioState, XwRadioError, XwRadioIndicationType, XwRadioResponseType, XwosTeleServiceConstants |
| 回调接口类 | 3 | VoiceDataListener, ITeleVoice, ITeleStats |
| JNI/Native 类 | 2 | AudioStreamer, fakeril |
二、详细清单
| 类/接口名 | 类型 | 文件路径 | 核心职责 | 稳定性注解 |
|---|---|---|---|---|
vendor.xwos.telephony.XwTelephonyManager | class | platform/frameworks/base/vendor/xwos/telephony/XwTelephonyManager.java | 卫星通信管理器,封装卫星特有接口 | @UnsupportedAppUsage |
vendor.xwos.telephony.CallState | class (Parcelable) | platform/frameworks/base/vendor/xwos/telephony/CallState.java | 卫星通话状态数据结构 | @UnsupportedAppUsage |
com.starkylin.xwos.teleservice.TeleService | class (Service) | packages/service/.../TeleService.java | 主服务入口,管理所有子服务 | @SystemApi |
com.starkylin.xwos.teleservice.TeleDataService | class | packages/service/.../TeleDataService.java | 卫星数据网络监控(IMS/OAM/VPN) | internal |
com.starkylin.xwos.teleservice.TeleVoiceService | class | packages/service/.../TeleVoiceService.java | 卫星语音通话服务 | internal |
com.starkylin.xwos.teleservice.TeleLocationService | class | packages/service/.../TeleLocationService.java | 卫星位置上报服务 | internal |
com.starkylin.xwos.teleservice.TeleStatsService | class | packages/service/.../TeleStatsService.java | 卫星通话统计服务 | internal |
com.starkylin.xwos.teleservice.RadioVoiceConnection | class | packages/service/.../RadioVoiceConnection.java | 语音 HAL 交互封装 | internal |
com.starkylin.xwos.teleservice.AudioStreamer | class | packages/service/.../AudioStreamer.java | 音频编解码流管理(JNI) | internal |
com.starkylin.xwos.teleservice.ApnServer | class | packages/service/.../ApnServer.java | APN HTTP 管理服务器 | internal |
com.starkylin.xwos.teleservice.TeleServiceAutoBoot | class (BroadcastReceiver) | packages/service/.../TeleServiceAutoBoot.java | 开机自启动 | internal |
com.starkylin.xwos.teleservice.LocalCallRecord | class (Room Entity) | packages/service/.../LocalCallRecord.java | 通话记录数据库模型 | internal |
com.starkylin.xwos.teleservice.XwosTeleServiceConstants | class | export/java/.../XwosTeleServiceConstants.java | 统计常量定义 | public |
vendor.xwos.hardware.radio.IXwRadio | AIDL interface (HAL) | interfaces/radio/aidl/.../IXwRadio.aidl | 卫星无线电主 HAL 接口 | @VintfStability |
vendor.xwos.hardware.radio.IXwRadioResponse | AIDL interface (HAL) | interfaces/radio/aidl/.../IXwRadioResponse.aidl | 卫星无线电响应接口 | @VintfStability |
vendor.xwos.hardware.radio.IXwRadioIndication | AIDL interface (HAL) | interfaces/radio/aidl/.../IXwRadioIndication.aidl | 卫星无线电事件上报接口 | @VintfStability |
vendor.xwos.hardware.radio.voice.IXwRadioVoice | AIDL interface (HAL) | interfaces/radio/aidl/.../voice/IXwRadioVoice.aidl | 卫星语音 HAL 主接口 | @VintfStability |
vendor.xwos.hardware.radio.voice.IXwRadioVoiceResponse | AIDL interface (HAL) | interfaces/radio/aidl/.../voice/IXwRadioVoiceResponse.aidl | 卫星语音响应接口 | @VintfStability |
vendor.xwos.hardware.radio.voice.IXwRadioVoiceIndication | AIDL interface (HAL) | interfaces/radio/aidl/.../voice/IXwRadioVoiceIndication.aidl | 卫星语音事件上报接口 | @VintfStability |
vendor.xwos.hardware.radio.XwRadioState | AIDL enum (HAL) | interfaces/radio/aidl/.../XwRadioState.aidl | CP 状态枚举 | @VintfStability |
vendor.xwos.hardware.radio.XwCallState | AIDL parcelable (HAL) | interfaces/radio/aidl/.../XwCallState.aidl | 通话状态数据结构 | @VintfStability |
vendor.xwos.hardware.radio.XwRadioError | AIDL enum (HAL) | interfaces/radio/aidl/.../XwRadioError.aidl | 错误码枚举 | @VintfStability |
vendor.xwos.hardware.radio.XwRadioResponseInfo | AIDL parcelable (HAL) | interfaces/radio/aidl/.../XwRadioResponseInfo.aidl | 响应信息结构 | @VintfStability |
vendor.xwos.hardware.radio.voice.XwRadioVoiceState | AIDL parcelable (HAL) | interfaces/radio/aidl/.../voice/XwRadioVoiceState.aidl | 语音状态结构 | @VintfStability |
vendor.xwos.hardware.radio.voice.XwRadioVoiceData | AIDL parcelable (HAL) | interfaces/radio/aidl/.../voice/XwRadioVoiceData.aidl | 语音数据结构(共享内存) | @VintfStability |
vendor.xwos.hardware.radio.voice.XwRadioVoiceDataBufferInfo | AIDL parcelable (HAL) | interfaces/radio/aidl/.../voice/XwRadioVoiceDataBufferInfo.aidl | 语音缓冲区信息 | @VintfStability |
com.starkylin.xwos.teleservice.ITeleVoice | AIDL interface | export/aidl/.../ITeleVoice.aidl | 语音服务对外接口 | public |
com.starkylin.xwos.teleservice.ITeleStats | AIDL interface | export/aidl/.../ITeleStats.aidl | 统计服务对外接口 | public |
com.starkylin.xwos.teleservice.VoiceDataListener | AIDL interface | export/aidl/.../VoiceDataListener.aidl | 语音数据回调接口 | public |
fakeril | C library | packages/service/.../ril-audio-streamer/fakeril/fakeril.h | 伪 RIL 通信库 | internal |
三、核心类/接口详解
3.1 公开 API 层
XwTelephonyManager
-
继承关系: 无(工具类,通过 TelephonyManager 代理)
-
关键成员:
XW_RADIO_STATE_CLOSED/OPENING/OPENED/CONNECTING/CONNECED— CP 状态常量XW_SATELLITE_S/L— 高低轨卫星类型PosTime— 卫星位置时间信息(GNSS类型、经纬度、ECEF坐标)UeStatus— 终端状态(RSRP、SINR、TAC、卫星ID、方位角、仰角)CqosRdp— 卫星服务质量动态参数UeCatRel— 能力等级(载波类型、扩频模式、语音速率支持)
-
关键方法:
dial(str, type, rate, executor, callback)— 卫星拨号(支持落地语音/T2T语音,800bps/2.4kbps/4.8kbps编码)registerCallStateListener(executor, listener)— 注册通话状态监听registerCustomEventListener(executor, listener)— 注册自定义事件监听
-
交互对象: TelephonyManager(通过
dialXw()等 XW 扩展方法), ITelephony Binder
CallState
-
继承关系: implements Parcelable
-
关键成员:
id— 通话IDdir— 呼叫方向(0=MO主叫, 1=MT被叫)stat— 通话状态(0=激活, 2=拨号, 3=振铃, 4=来电, 6=结束, 7=网络放音)rate— 编码速率(0=800bps, 1=2.4kbps, 2=4.8kbps)num_type— 号码类型(5=XW系统号码)
-
交互对象: XwTelephonyManager, TeleStatsService
3.2 服务实现层
TeleVoiceService
-
继承关系: 无
-
关键成员:
mRadioVoiceConnection— HAL 语音连接封装mMode— 运行模式枚举(DISABLED/IN_PROCESS/RAW/COMPRESSED)mCurrentCallingState/mCurrentCallingMode/mCurrentBitrate— 当前通话状态globalSerial— HAL 请求序列号
-
关键方法:
initialize(segmentSize)— 初始化语音服务,连接 HALsendUplinkVoiceData(data)— 发送上行语音数据到 HALsetDownlinkVoiceDataListener(listener)— 设置下行语音数据监听setVoiceState(callingState, callingMode, bitrate)— 设置通话状态
-
交互对象: RadioVoiceConnection(HAL交互), AudioStreamer(编解码), ITeleVoice AIDL(对外)
TeleDataService
-
继承关系: 无
-
关键成员:
NETWORK_TYPE_MAP— 网络类型映射(IMS/OAM/DEFAULT/USER_VPN)mNetworkCallbacks— 各网络类型的 ConnectivityManager 回调mApnServer— 内置 APN HTTP 服务器DEFAULT_APN_AUTO_SETUP = "ims,oam,uservpn"— 默认自动注册网络类型
-
关键方法:
setupApnPoller()— 根据 Settings 配置网络轮询registerNetworkCallback(type)— 注册指定网络类型回调startApnServer()— 启动 APN HTTP 服务器
-
交互对象: ConnectivityManager, Settings, ApnServer
TeleLocationService
-
继承关系: 无
-
关键成员:
ELAPSEDTIME_THRESHOLD_SECONDS— 位置上报时间阈值(默认100s)DISTANCE_THRESHOLD_METER— 位置上报距离阈值(默认1500m)mLocationManager— 系统位置管理器
-
关键方法:
- 位置变化监听与卫星位置上报
- 距离/时间阈值控制的位置更新
-
交互对象: LocationManager, TelephonyManager
TeleStatsService
-
继承关系: 无
-
关键成员:
mCallRecordDao— Room 数据库 DAOsBootTime— 开机时间
-
关键方法:
getLong(statisticType)— 查询本次开机统计数据getLongBetween(start, end, type)— 查询指定时间范围统计数据- 通话状态监听与统计(主叫/被叫/振铃/接通/掉话/单双通)
-
交互对象: TelephonyManager, LocalCallRecordDao, ITeleStats AIDL
3.3 HAL 接口层
IXwRadio(卫星无线电主 HAL 接口)
-
类型: AIDL
oneway interface,@VintfStability -
核心职责: 卫星 CP(通信处理器)的控制接口
-
关键方法:
setRadioPowerXW(serial, enable)— 开关卫星 CP 电源getRadioPowerStateXW(serial)— 查询 CP 电源状态setCommunicationTypeXW(serial, commType)— 设置通信类型(高低轨)getPostimeXW(serial)/setPostimeXW(serial, info)— 获取/设置位置时间getPowerStateXW(serial)— 查询 CP 功耗状态executeStunXW(serial, mode, value)— 执行 STUN 唤醒executeKillXW(serial)— 执行 KILL 关机dialXW(serial, str, type, rate)— 卫星拨号setCarrierModeXW(serial, mode)/getCarrierModeXW(serial)— 设置/获取载波模式sendCustomRequest(serial, request, extraData)— 自定义请求
-
交互对象: IXwRadioResponse, IXwRadioIndication
IXwRadioVoice(卫星语音 HAL 接口)
-
类型: AIDL
oneway interface,@VintfStability -
核心职责: 卫星语音数据的传输控制
-
关键方法:
setResponseFunctions(response, indication)— 设置回调sendUplinkVoiceData(serial, data)— 发送上行压缩语音数据acquireVoiceDataBuffer(serial, bufferSize)— 申请共享内存缓冲区releaseVoiceDataBuffer(serial)— 释放缓冲区
-
交互对象: IXwRadioVoiceResponse, IXwRadioVoiceIndication
XwRadioState(CP 状态枚举)
-
类型: AIDL enum,@VintfStability
-
值:
-
XW_RADIO_STATE_CLOSED— CP未上电 -
XW_RADIO_STATE_CLOSING— CP关闭中 -
XW_RADIO_STATE_OPENNING— CP启动中,串口未ready -
XW_RADIO_STATE_OPENED— CP已启动,串口已ready -
XW_RADIO_STATE_CONNECTING— CP入网中 -
XW_RADIO_STATE_CONNECED— CP已建立数据业务
-
XwCallState(HAL 通话状态)
-
类型: AIDL parcelable,@VintfStability
-
字段: id, dir(0=MO/1=MT), stat(0=激活/2=拨号/3=振铃/4=来电/10=失败/11=结束), mode, mpty, number, num_type, rate(0=800bps/1=2.4kbps/2=4.8kbps)
3.4 Native/JNI 层
AudioStreamer
-
继承关系: 无(静态 JNI 桥接类)
-
关键成员:
UplinkVoiceDataCallback— 上行语音数据回调接口
-
关键方法:
nativeStart(rilVoiceRate)— 启动音频流(支持800/2400/4800bps)nativeStop()— 停止音频流nativeOnNewDownlinkVoiceData(data)— 处理下行语音数据nativeGetVoiceSegmentSize(rilVoiceRate)— 获取语音段大小
-
交互对象: libxwosteleservicejni.so, TeleVoiceService
fakeril(伪 RIL 库)
-
类型: C 语言库
-
核心职责: 模拟 RIL 通信,提供注册/通话/短信/数据业务的 API
-
关键 API:
fakeril_register(imsi)/fakeril_unregister(imsi)— 注册/注销fakeril_dial(number, type, rate)/fakeril_hangup()/fakeril_answer()— 通话控制fakeril_send_uplinkvoicedata(data, len)— 发送上行语音fakeril_send_sms(number, pdu, len)— 发送短信fakeril_activate_datacall(apnName)/fakeril_deactivate_datacall()— 数据业务
-
回调类型:
regstate_cb,callstate_cb,voice_cb,sms_cb,net_cb
四、依赖关系图
graph TB
subgraph "应用层"
APP[第三方应用]
end
subgraph "公开 API 层"
XTM[XwTelephonyManager]
CS[CallState]
end
subgraph "Framework 层"
TM[TelephonyManager<br/>dialXw/XwCallStateListener]
end
subgraph "XwosTeleService 进程"
TS[TeleService<br/>主服务入口]
TDS[TeleDataService<br/>数据网络监控]
TVS[TeleVoiceService<br/>语音服务]
TLS[TeleLocationService<br/>位置服务]
TSS[TeleStatsService<br/>统计服务]
RVC[RadioVoiceConnection<br/>HAL交互封装]
AS[AudioStreamer<br/>JNI音频编解码]
APS[ApnServer<br/>APN HTTP服务器]
DB[AppDatabase<br/>Room数据库]
end
subgraph "AIDL 对外接口"
ITV[ITeleVoice]
ITS[ITeleStats]
VDL[VoiceDataListener]
end
subgraph "HAL AIDL 接口 @VintfStability"
IXR[IXwRadio<br/>卫星无线电主接口]
IXRR[IXwRadioResponse]
IXRI[IXwRadioIndication]
IXRV[IXwRadioVoice<br/>卫星语音接口]
IXRVR[IXwRadioVoiceResponse]
IXRVI[IXwRadioVoiceIndication]
end
subgraph "HAL 数据结构"
XRS[XwRadioState<br/>CP状态枚举]
XCS[XwCallState<br/>通话状态]
XVS[XwRadioVoiceState<br/>语音状态]
XVD[XwRadioVoiceData<br/>语音数据/共享内存]
end
subgraph "Native 层"
JNI[libxwosteleservicejni.so]
FAKERIL[fakeril<br/>伪RIL库]
CODEC[libril_voice_codec<br/>语音编解码]
end
APP --> XTM
XTM --> TM
XTM --> CS
APP --> ITV
APP --> ITS
TS --> TDS
TS --> TVS
TS --> TLS
TS --> TSS
TVS --> RVC
TVS --> AS
TDS --> APS
TSS --> DB
ITV --> TVS
ITS --> TSS
VDL --> TVS
RVC --> IXRV
RVC --> IXRVR
RVC --> IXRVI
TM --> IXR
TM --> IXRR
TM --> IXRI
IXRV --> XVS
IXRV --> XVD
IXRI --> XCS
IXRI --> XRS
IXRR --> XRS
AS --> JNI
JNI --> CODEC
JNI --> FAKERIL
五、总结与建议
当前覆盖的卫星通信功能范围
| 功能模块 | 覆盖情况 | 说明 |
|---|---|---|
| 卫星 CP 电源管理 | ✅ 完整 | 开关机、STUN唤醒、KILL关机 |
| 卫星注册/入网 | ✅ 完整 | XwRadioState 完整状态机 |
| 卫星语音通话 | ✅ 完整 | 拨号/挂断/接听,800bps/2.4kbps/4.8kbps编码 |
| 卫星语音数据传输 | ✅ 完整 | 共享内存缓冲区 + 压缩语音数据 |
| 卫星数据网络 | ✅ 完整 | IMS/OAM/USER_VPN/APN自动配置 |
| 卫星位置上报 | ✅ 完整 | GNSS位置 + ECEF坐标 + 时间同步 |
| 卫星通话统计 | ✅ 完整 | 主叫/被叫/振铃/接通/掉话/单双通 |
| 高低轨切换 | ✅ 有接口 | XW_SATELLITE_S/L + setCommunicationTypeXW |
| 载波模式管理 | ✅ 有接口 | setCarrierModeXW/getCarrierModeXW |
| 终端状态查询 | ✅ 完整 | RSRP/SINR/TAC/卫星ID/方位角/仰角 |
| 卫星短信 | ⚠️ 仅 fakeril | HAL 层无 SMS 专用接口 |
| 卫星 QoS | ⚠️ 仅数据结构 | CqosRdp 定义但未完整实现 |
明显缺失的功能或接口
-
卫星短信 HAL 接口:
IXwRadio和IXwRadioVoice均无 SMS 相关方法,仅 fakeril 有fakeril_send_sms(),说明 SMS 功能尚未通过正式 HAL 接口暴露 -
卫星数据业务 HAL 接口:
IXwRadio无数据呼叫建立/释放方法(数据业务走标准 RIL 而非 XW HAL) -
卫星搜星/波束管理: 缺少卫星搜索、波束切换相关接口
-
卫星紧急呼叫: 无紧急呼叫优先级处理
-
卫星 SIM 卡管理: 无卫星专用 SIM 卡操作接口
代码质量评价
| 方面 | 评价 |
|---|---|
| 架构设计 | ✅ 分层清晰:API → Service → HAL,符合 Android Treble 架构 |
| AIDL 规范 | ✅ 正确使用 @VintfStability、@Backing、@JavaDerive 注解 |
| 注释完整度 | ✅ 核心类有详细 Javadoc,HAL 接口有中文注释 |
| 数据结构设计 | ✅ 与接口规范文档对应(附录C.x) |
| 错误处理 | ⚠️ XwRadioError 枚举完整但部分场景未使用 |
| 版本管理 | ✅ HAL AIDL 有版本目录(v1/current) |
| 测试覆盖 | ❌ 缺少单元测试和集成测试代码 |
packages/modules/Connectivity
一、执行摘要
Android 16(当前 AOSP 主线)在流量统计框架中新增了对卫星通信( TRANSPORT_SATELLITE )的识别支持,但尚未提供独立的卫星流量统计 API。卫星流量目前被归类为移动网络(type_mobile)的子集,通过 NetworkIdentity.mTransportTypesBits 位字段区分。核心变更包括:NetworkTemplate.Builder 新增 setTransportType() 方法(受 FLAG_NETSTATS_TRANSPORT_TYPE Feature Flag 控制)支持按传输类型构建查询模板;NetworkStatsService 在网络状态处理中将卫星传输视为移动网络的变体;NetworkStatsManager.getMobileUidStats() 的文档明确声明其返回值包含卫星流量。SatelliteAccessController 与流量统计模块无直接集成,仅负责控制卫星网络的访问权限。
二、通用流量统计差异(Android 13 vs Android 16)
2.1 API 变化
TrafficStats
-
Android 13 (T) :提供基础的
getMobileRxBytes()、getUidRxBytes()等方法,基于/proc/net/xt_qtaguid/stats或 eBPF maps 读取数据。 -
Android 16 (V) :TrafficStats 类本身无重大 API 变更,未新增卫星相关方法。底层仍通过 JNI(
framework-connectivity-tiramisu-jni)读取 eBPF 统计数据。
NetworkStatsManager
-
Android 13 (T) :查询方法(
querySummaryForDevice、queryDetailsForUid等)基于NetworkTemplate的旧式MATCH_MOBILE、MATCH_WIFI等匹配规则。 -
Android 16 (V) :新增关键特性:
-
getMobileUidStats()— 返回蜂窝和卫星的实时 UID 统计(NetworkStatsManager.java:755) -
getWifiUidStats()— 返回 Wi-Fi 的实时 UID 统计 -
两者底层均调用
INetworkStatsService.getUidStatsForTransport(int transport)
-
NetworkTemplate
-
Android 13 (T) :仅支持
MATCH_MOBILE、MATCH_WIFI、MATCH_ETHERNET等基于传统网络类型的匹配规则。 -
Android 16 (V) :重大变更:
-
新增
MATCH_ALL = 12匹配规则,配合setTransportType()使用 -
新增
Builder()默认构造函数 +setTransportType(@Transport int)方法(NetworkTemplate.java:1285-1292) -
@Transport注解包含TRANSPORT_SATELLITE(NetworkTemplate.java:772) -
受
Flags.FLAG_NETSTATS_TRANSPORT_TYPEFeature Flag 控制 -
matchesTransportTypes()方法:模板的传输类型位必须全部包含在 NetworkIdentity 的传输类型位中才算匹配
-
NetworkStats / NetworkStats.Bucket
-
Android 13 (T) → Android 16 (V) :无新增卫星相关字段。
Entry和Bucket中没有TYPE_SATELLITE常量。卫星流量通过NetworkIdentity.mTransportTypesBits区分,而非通过独立的网络类型字段。
2.2 系统服务变化
NetworkStatsService
-
Android 13 (T) :仅识别
TRANSPORT_CELLULAR作为移动网络。 -
Android 16 (V) :关键变更:
-
handleNetworkStateChanged()中新增卫星传输识别逻辑(NetworkStatsService.java:2357-2360):-
final boolean isMobile = NetworkCapabilities.TRANSPORT_CELLULAR == displayTransport || NetworkCapabilities.TRANSPORT_SATELLITE == displayTransport;
-
-
卫星网络接口被添加到
mAllMobileIfacesSinceBoot集合中 -
getSubIdForCellularOrSatellite()方法同时处理蜂窝和卫星网络(NetworkStatsService.java:2472-2480) -
getRatTypeForStateSnapshot()同时检查TRANSPORT_CELLULAR和TRANSPORT_SATELLITE -
getUidStatsForTransport(TRANSPORT_CELLULAR)返回的接口集合包含卫星接口
-
NetworkStatsFactory
-
Android 13 (T) → Android 16 (V) :无卫星相关变更。底层仍从 eBPF maps 读取统计数据,不感知传输类型。
2.3 底层实现变化
-
eBPF 已完全替代
xt_qtaguid(Android 16 中xt_qtaguid已废弃) -
NetworkStatsFactory不再解析/proc/net/xt_qtaguid/stats -
卫星流量的底层采集与蜂窝流量共享同一套 eBPF 管道,区分依赖于上层的
NetworkIdentity匹配
三、卫星通信相关的流量统计差异
3.1 卫星网络类型识别
| 维度 | Android 13 (T) | Android 16 (V) |
|---|---|---|
NetworkStats.Bucket 中的卫星类型常量 | ❌ 不存在 | ❌ 仍不存在 |
NetworkStats.Entry 中的卫星字段 | ❌ 不存在 | ❌ 仍不存在 |
NetworkIdentity.mTransportTypesBits | 不包含 TRANSPORT_SATELLITE | ✅ 包含 TRANSPORT_SATELLITE 位 |
NetworkTemplate 匹配卫星 | ❌ 不支持 | ✅ 通过 MATCH_ALL + setTransportType(TRANSPORT_SATELLITE) |
| 卫星流量的 legacy type | N/A | 归类为 TYPE_MOBILE |
关键发现:Android 16 中没有 TYPE_SATELLITE 这样的独立网络类型常量。卫星网络在传统类型字段中仍被标记为 TYPE_MOBILE,但通过 NetworkIdentity.mTransportTypesBits 中的 TRANSPORT_SATELLITE 位进行区分。这意味着:
-
卫星流量被统计为移动网络流量的一部分
-
通过
NetworkTemplate.Builder().setTransportType(TRANSPORT_SATELLITE)构建的模板可以专门匹配卫星流量 -
但
MATCH_MOBILE模板不会自动匹配卫星流量(因为matchesMobile()仅匹配TYPE_MOBILE+ 特定 RAT 类型)
3.2 API 新增与变更
| API | Android 13 | Android 16 | 卫星支持 |
|---|---|---|---|
NetworkTemplate.Builder.setTransportType() | ❌ | ✅ (Flagged) | ✅ 支持 TRANSPORT_SATELLITE |
NetworkStatsManager.getMobileUidStats() | ❌ | ✅ | 文档声明包含卫星流量 |
NetworkStatsManager.getWifiUidStats() | ❌ | ✅ | 不包含卫星 |
INetworkStatsService.getUidStatsForTransport() | ❌ | ✅ | 理论上可传入 TRANSPORT_SATELLITE |
NetworkStatsManager.querySummaryForDevice() | ✅ | ✅ | 通过模板间接支持 |
NetworkStatsManager.queryDetailsForUid() | ✅ | ✅ | 通过模板间接支持 |
专用 getSatelliteUidStats() | ❌ | ❌ | 未实现 |
专用 querySummaryForSatellite() | ❌ | ❌ | 未实现 |
重要细节:
-
getMobileUidStats()内部调用mService.getUidStatsForTransport(TRANSPORT_CELLULAR),而getAllIfacesSinceBoot(TRANSPORT_CELLULAR)返回mAllMobileIfacesSinceBoot,该集合包含卫星接口(NetworkStatsService.java:1921-1922) -
因此
getMobileUidStats()实际返回蜂窝+卫星的合并统计 -
目前没有
getUidStatsForTransport(TRANSPORT_SATELLITE)的公开调用入口,但 AIDL 接口理论上支持
3.3 统计策略差异
| 策略维度 | Android 13 | Android 16 |
|---|---|---|
| 卫星流量专属轮询频率 | N/A | ❌ 无独立策略 |
| 卫星流量前台/后台区分 | N/A | ✅ 与蜂窝相同(通过 SET_FOREGROUND/SET_DEFAULT) |
| 按卫星波束/运营商统计 | N/A | ❌ 不支持 |
| 低功耗模式统计延迟 | N/A | ❌ 无特殊处理 |
| 卫星流量计费标记 | N/A | ✅ 卫星网络被标记为 metered(NET_CAPABILITY_NOT_METERED 被移除) |
关键发现:Android 16 未引入卫星流量专属的统计策略。卫星流量与蜂窝流量共享相同的轮询机制和聚合算法。卫星网络的计费属性通过 NetworkCapabilities 中的 NET_CAPABILITY_NOT_METERED 缺失来标记为 metered。
3.4 与卫星框架的集成
| 集成点 | 状态 | 说明 |
|---|---|---|
SatelliteAccessController → NetworkStatsService | ❌ 无直接集成 | SAC 仅通过回调通知 ConnectivityService 更新网络偏好,不涉及流量统计 |
SatelliteAccessController → 流量统计重置/标记 | ❌ 不存在 | 启用/禁用卫星网络时不通知 NetworkStatsService |
ConnectivityService 卫星网络请求 → 流量统计 | ✅ 间接关联 | 卫星网络通过 TRANSPORT_SATELLITE 注册到 ConnectivityService,NetworkStatsService 通过网络状态快照感知 |
| 卫星消息字节数记录 | ❌ 不存在 | SatelliteManager/SatelliteController 中无流量统计调用 |
关键发现:SatelliteAccessController(SatelliteAccessController.java)与流量统计模块完全解耦。它仅负责:
-
监控默认短信应用的角色变更
-
检查
SATELLITE_COMMUNICATION权限 -
通知 ConnectivityService 创建多层网络请求
3.5 调试支持
| 调试功能 | Android 13 | Android 16 |
|---|---|---|
adb shell dumpsys netstats | ✅ | ✅ |
| 卫星专属 dump 选项 | ❌ | ❌ 无 --satellite-stats 选项 |
| 卫星接口列表 | N/A | ✅ 包含在 "All mobile interfaces" 中 |
mAllMobileIfacesSinceBoot | N/A | ✅ 包含卫星接口(dump 输出中可见) |
| 模拟卫星网络测试钩子 | ❌ | ❌ 未发现 |
四、差异总结表
| 功能 | Android 13 (T) | Android 16 (V) | 变更类型 |
|---|---|---|---|
TRANSPORT_SATELLITE 定义 | ✅ (API 33引入) | ✅ | 无变更 |
NetworkIdentity.mTransportTypesBits 含卫星位 | ❌ 未使用 | ✅ 使用 | 新增 |
NetworkTemplate.Builder.setTransportType() | ❌ | ✅ (Flagged) | 新增 |
NetworkTemplate.MATCH_ALL 匹配规则 | ❌ | ✅ | 新增 |
NetworkStatsManager.getMobileUidStats() | ❌ | ✅ (含卫星) | 新增 |
NetworkStatsService 识别卫星为移动网络 | ❌ | ✅ | 新增 |
getSubIdForCellularOrSatellite() | ❌ | ✅ | 新增 |
| 独立卫星流量统计 API | ❌ | ❌ | 未实现 |
TYPE_SATELLITE 网络类型常量 | ❌ | ❌ | 未实现 |
| 卫星专属统计策略 | ❌ | ❌ | 未实现 |
| 卫星流量阈值回调 | ❌ | ❌ | 未实现 |
SatelliteAccessController → 流量统计集成 | ❌ | ❌ | 未实现 |
五、兼容性与适配建议
5.1 兼容性影响
-
旧应用查询行为:针对 Android 13 开发的应用使用
querySummaryForDevice(TYPE_MOBILE, ...)时,在 Android 16 上不会自动包含卫星流量(因为MATCH_MOBILE规则仅匹配TYPE_MOBILE+ RAT 类型,不匹配TRANSPORT_SATELLITE)。 -
卫星流量误归类风险:由于卫星网络在 legacy type 字段中被标记为
TYPE_MOBILE,如果底层 telephony 将卫星接口注册为移动网络,则使用MATCH_MOBILE模板的旧查询可能包含卫星流量。当前代码中isMobile = (TRANSPORT_CELLULAR == displayTransport || TRANSPORT_SATELLITE == displayTransport)确保了卫星接口被添加到mAllMobileIfacesSinceBoot。 -
getMobileUidStats()行为:该方法文档明确声明返回"cellular and satellite"统计,调用方需注意此合并行为。
5.2 OEM 厂商适配建议
-
内核/HAL 层:
-
确保卫星网络接口被正确注册到
TelephonyNetworkSpecifier中,包含正确的subscriptionId -
卫星 Modem 需要通过
PhoneStateListener上报 RAT 类型 -
eBPF 程序无需修改,卫星流量通过标准网络接口采集
-
-
Framework 层:
-
启用
FLAG_NETSTATS_TRANSPORT_TYPEFeature Flag 以支持基于传输类型的模板查询 -
在
getDisplayTransport()实现中正确映射卫星传输类型 -
确保卫星网络的
NetworkCapabilities包含TRANSPORT_SATELLITE
-
-
流量统计区分:
-
如需独立统计卫星流量,使用:
-
NetworkTemplate template = new NetworkTemplate.Builder() .setTransportType(NetworkCapabilities.TRANSPORT_SATELLITE) .build(); NetworkStatsManager.querySummaryForDevice(template, start, end);
-
-
注意:此功能受 Feature Flag 控制,需确认设备已启用
-
六、关键代码路径索引(AOSP)
| 文件 | 关键行 | 说明 |
|---|---|---|
| NetworkTemplate.java | L31, L772, L785, L1174, L1285-1292 | TRANSPORT_SATELLITE 导入、@Transport 注解、setTransportType() |
| NetworkIdentity.java | L75, L99 | mTransportTypesBits 字段及 Builder 中的 setTransportTypes() |
| NetworkStatsManager.java | L755, L769-771 | getMobileUidStats() 文档声明含卫星流量 |
| NetworkStatsService.java | L1921-1922, L2357-2360, L2403, L2472-2480, L2493-2500 | 卫星接口识别、isMobile 判断、getSubId、getRatType |
| INetworkStatsService.aidl | L55 | getUidStatsForTransport(int transport) 接口定义 |
| SatelliteAccessController.java | 全文 | 卫星访问控制(与流量统计无直接关联) |
| ConnectivityService.java | L660-663, L14327-14345 | PREFERENCE_ORDER_SATELLITE_FALLBACK、卫星多层网络请求 |
| NetworkStats.java | 全文 | 无卫星相关字段 |
| TrafficStats.java | 全文 | 无卫星相关内容 |
总结:Android 16 在流量统计框架中为卫星通信搭建了基础识别架构(通过 mTransportTypesBits 和 NetworkTemplate.Builder.setTransportType()),但尚未实现完整的卫星流量统计体系。卫星流量目前与蜂窝流量合并统计,缺乏独立的查询 API、专属统计策略和与卫星框架的深度集成。这反映了卫星通信在 Android 生态中仍处于早期阶段,后续版本预计将逐步完善。