A13卫通关键实现

5 阅读36分钟

Android 13代码仓库:

仓库名路径文件
RILvendor/cnt/RilXWpackages/service/XwosTeleService/src/com/starkylin/xwos/teleservice/TeleLocationService.java
platform/vendor/xwos
platform/frameworks/basetelephony/java/com/android/internal/telephony/XWRadioConstants.java
device/sprd
platform/packages/apps/Settingssrc_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 接口中,并通过 TelephonyManagerITelephony.aidl 暴露接口。


二、详细清单

类/接口名类型文件路径核心职责稳定性注解
android.telephony.xwos.CallStateclass (Parcelable)java/android/telephony/xwos/CallState.javaXWOS 卫星通话状态数据结构,承载通话 ID、方向、状态、模式等@hide
android.telephony.xwos.CallStateAIDL parcelablejava/android/telephony/xwos/CallState.aidlCallState 的 AIDL 序列化声明
com.android.internal.telephony.xwos.ICallStateListenerAIDL interface (oneway)java/com/android/internal/telephony/xwos/ICallStateListener.aidl卫星通话状态变化的跨进程回调接口@hide
com.android.internal.telephony.XWRadioConstantsinterfacejava/com/android/internal/telephony/XWRadioConstants.javaXW 卫星通信全部常量定义(CP 状态、RIL 请求码、自定义请求 ID、事件 ID 等)@hide
com.android.internal.telephony.ITelephony (XW 部分)AIDL interfacejava/com/android/internal/telephony/ITelephony.aidlTelephony 服务的 Binder 接口,包含 16 个 XW 卫星相关方法@hide
com.android.internal.telephony.IIntegerConsumerAIDL interface (oneway)java/com/android/internal/telephony/IIntegerConsumer.aidl异步返回整数结果的跨进程回调@hide
com.android.internal.telephony.IBooleanConsumerAIDL interface (oneway)java/com/android/internal/telephony/IBooleanConsumer.aidl异步返回布尔结果的跨进程回调@hide
com.android.internal.telephony.IBiIntegerConsumerAIDL interface (oneway)java/com/android/internal/telephony/IBiIntegerConsumer.aidl异步返回双整数结果的跨进程回调@hide
com.android.internal.telephony.ICustomRequestCallbackAIDL interface (oneway)java/com/android/internal/telephony/ICustomRequestCallback.aidl自定义卫星功能请求的异步结果回调@hide
com.android.internal.telephony.ICustomEventListenerAIDL 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)

  • 关键成员

成员类型说明
sXwCallStateListenersConcurrentHashMap<XwCallStateListener, ICallStateListener>通话状态监听器注册表
sCustomEventListenersHashMap<CustomEventListener, ICustomEventListener>自定义事件监听器注册表
KEY_SECTF_XW_HANDLEString 常量安全卡状态异步结果 Key
KEY_POSTIME_XW_HANDLEString 常量位置时间异步结果 Key
KEY_EXECUTE_STUN_XW_HANDLEString 常量摇晕操作异步结果 Key
KEY_EXECUTE_KILL_XW_HANDLEString 常量摇毙操作异步结果 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
  • 内部接口/类

名称类型说明
XwCallStateListenerinterface卫星通话状态变化监听器,回调 onCallStateChanged(CallState)
XwCallStateListenerWrapperclassXwCallStateListener 包装为 ICallStateListener.Stub 的 Binder 适配器
CustomRequestCallbackinterface自定义请求结果回调,onResult(int errorno, int result, byte[] extrasData)
CustomEventListenerinterface自定义事件监听器,onEvent(int event, byte[] extrasData)
CustomEventListenerWrapperclassCustomEventListener 包装为 ICustomEventListener.Stub 的 Binder 适配器
  • 交互对象:通过 ITelephony AIDL 接口(Binder)与 Telephony 服务进程通信;使用 IIntegerConsumerIBooleanConsumerIBiIntegerConsumerICustomRequestCallbackICallStateListenerICustomEventListener 等 AIDL 回调接口接收异步结果。


3.2 数据模型层 — CallState

类名:android.telephony.xwos.CallState
  • 继承 关系:实现 Parcelable 接口

  • 关键成员

字段类型说明
idint通话 ID
dirint呼叫方向(呼入/呼出)
statint通话状态
modeint通话模式
mptyint是否多方通话
numberString电话号码
num_typeint号码类型
rateint编码速率
  • 关键方法

    • writeToParcel(Parcel, int) — 序列化

    • describeContents() — Parcelable 描述

    • equals(Object) / hashCode() — 对象比较

    • toString() — 调试输出

  • 交互对象:被 ICallStateListener.aidl 作为回调参数传递,被 TelephonyManager.XwCallStateListener 消费。


3.3 常量定义层 — XWRadioConstants

接口名:com.android.internal.telephony.XWRadioConstants
  • 继承 关系:无(纯常量接口)

  • 关键常量分组

分组常量数量说明
CP 状态7XW_RADIO_STATE_UNAVAILABLE ~ XW_RADIO_STATE_CONNECED
USB 切换类型2XW_USB_AP / XW_USB_CP
高低轨类型2XW_SATELLITE_S(高轨)/ XW_SATELLITE_L(低轨)
XW Message codes34CMD/EVENT 命令码(CMD_EVENT_BASE = 10000
RIL XW Request18RIL 请求码(RIL_XW_REQUEST_BASE = 80000
RIL XW Unsolicited5RIL 主动上报码(RIL_XW_UNSOL_RESPONSE_BASE = 90000
Custom Request SET41自定义设置请求 ID(CUSTOM_REQUEST_SET_BASE = 0
Custom Request GET57自定义查询请求 ID(CUSTOM_REQUEST_GET_BASE = 100
Custom Request DATA6数据获取请求 ID(CUSTOM_REQUEST_DATA_BASE = 0x100000
Custom Request HH3HH 项目专用请求 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

暂时无法在飞书文档外展示此内容

调用流程说明

  1. 应用层调用 TelephonyManager 的 XW 方法(如 dialXw()

  2. TelephonyManager 通过 getITelephony() 获取 ITelephony Binder 代理

  3. 调用 ITelephony.aidl 中定义的对应方法(如 dialXw()),传入 AIDL 回调接口(如 IIntegerConsumer

  4. Telephony 服务端(PhoneInterfaceService)接收请求,转发至 RIL 层

  5. RIL 层通过 RIL_XW_REQUEST_* 常量与卫星 CP 通信

  6. 结果通过 AIDL 回调接口异步返回给 TelephonyManager

  7. 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
卫星网络注册✅ 通过 customRequestCUSTOM_REQUEST_SET_CREGXW / CUSTOM_REQUEST_GET_CREGXW
卫星 QoS✅ 通过 customRequestCUSTOM_REQUEST_SET_CQOSXW / CUSTOM_REQUEST_GET_CQOSXW
导航增强✅ 通过 customRequestCUSTOM_REQUEST_SET_SSRINFOXW / CUSTOM_REQUEST_GET_SSRMODEXW
星历信息✅ 通过 customRequestCUSTOM_REQUEST_SET_EPHEMXW / CUSTOM_REQUEST_GET_EPHEMXW
物联网数据传输✅ 通过 customRequestCUSTOM_REQUEST_SET_IOTULDATAXW / CUSTOM_REQUEST_GET_IOTDLDATAXW
窄带终端✅ 通过 customRequestCUSTOM_REQUEST_SET_CARRIERMODEXW / CUSTOM_REQUEST_SET_REGIONXW
宽带终端✅ 通过 customRequestCUSTOM_REQUEST_SET_DUDIAXW / CUSTOM_REQUEST_SET_ANTOTAXW

明显缺失的功能或接口

  1. 无独立卫星 API 管理类:标准 AOSP 提供了 SatelliteManager 作为卫星通信的统一入口,本代码库将所有卫星功能直接挂在 TelephonyManager 上,缺乏模块化隔离。如果后续 AOSP 升级引入标准 SatelliteManager,将产生冲突。

  2. 无卫星数据业务 API:当前仅有语音通话(dialXw)和数据传输(通过 customRequest 的物联网数据包),缺少标准化的卫星数据连接(Data Call)管理接口,如卫星数据会话的建立、断开、状态查询等。

  3. 无卫星短信 API:缺少卫星 SMS 收发接口,SmsManager 中未发现 XW 扩展。

  4. 无卫星紧急呼叫标识dialXw 未区分普通呼叫与紧急呼叫,缺少紧急呼叫优先级处理机制。

  5. 缺少卫星信号强度/状态公开 API:虽然有 CUSTOM_REQUEST_RSSI/CUSTOM_REQUEST_SNR 等常量,但没有封装为独立的信号强度查询 API(类似 CellSignalStrength 体系)。

  6. CallState 字段全部为 int 缺少枚举定义dirstatmode 等字段均为裸 int,缺少 @IntDef 注解或枚举类来约束合法值,容易导致调用方传入错误值。

  7. 所有接口均标记 @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 本文件夹内的卫星通信相关类

类/接口名类型文件路径核心职责稳定性注解
PhoneInterfaceManagerclass (extends ITelephony.Stub)src/com/android/phone/PhoneInterfaceManager.javaTelephony 服务的 Binder 实现,包含所有卫星通信(XW)相关 API 的服务端实现@hide(内部系统类)

2.2 本文件夹内卫星通信相关的内部组件(PhoneInterfaceManager 内部)

组件名类型所在行号核心职责稳定性注解
XWRadioState成员变量 (int)L420卫星通信射频状态追踪private
mXWSlotId成员变量 (int)L421卫星通信卡槽 IDprivate
mIsXWRadioState成员变量 (boolean)L422卫星通信射频连接状态标志private
mXwRadioReceiver内部 BroadcastReceiverL12334监听卫星通信射频状态变化广播private

2.3 外部依赖的卫星通信相关接口/类(不在本文件夹内,但被本文件夹引用)

类/接口名类型所属包核心职责稳定性注解
XWRadioConstants常量类com.android.internal.telephony定义 XW 卫星通信相关常量(如 XW_RADIO_STATE_CLOSEDXW_RADIO_STATE_CONNECTINGXW_RADIO_STATE_CONNECEDXW_RADIO_STATE_UNAVAILABLE、CMD_* 命令常量等)@hide
ICallStateListenerAIDL interfacecom.android.internal.telephony.xwos卫星通信通话状态监听回调接口@hide
ICustomEventListenerAIDL interfacecom.android.internal.telephony卫星通信自定义事件监听回调接口@hide
ICustomRequestCallbackAIDL interfacecom.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 接口)

  • 关键成员

成员类型说明
XWRadioStateint卫星通信射频当前状态,初始值 XW_RADIO_STATE_CLOSED
mXWSlotIdint卫星通信卡槽 ID,初始值 -1
mIsXWRadioStateboolean卫星通信射频是否已连接,初始值 false
mXwRadioReceiverBroadcastReceiver监听 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_HANDLEKEY_POSTIME_XW_HANDLEKEY_EXECUTE_STUN_XW_HANDLEKEY_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_SLOTIDCMD_SET_RADIO_POWERCMD_SET_COMMUNICATION_TYPECMD_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

交互流程说明

  1. API 调用链路:外部应用 → ITelephony.Stub (Binder) → PhoneInterfaceManagerPhoneFactory.getPhone(satellitePhoneId)Phone (XW 扩展方法) → RIL/Modem

  2. 状态监听链路:Modem 状态变化 → Intent.ACTION_PRIVATE_XWRADIO_STATE_CHANGE 广播 → mXwRadioReceiver → 更新 XWRadioState → 发送通知

  3. 通话状态链路:Modem 通话状态变化 → Phone.registerForXwCallStateChanged()ICallStateListener 回调 → 外部应用


五、总结与建议

当前文件夹覆盖的卫星通信功能范围

本文件夹中的卫星通信功能属于 UNISOC(展锐)厂商自定义扩展,命名以 "XW"(星网)为前缀,主要覆盖以下功能:

功能领域覆盖情况说明
卫星射频控制✅ 已覆盖开关射频、获取射频状态
卫星通信类型设置✅ 已覆盖设置/获取通信类型
卫星拨号✅ 已覆盖dialXw 方法支持号码、类型、速率参数
卫星位置时间✅ 已覆盖获取/设置位置时间信息
卫星电源管理✅ 已覆盖STUN/KILL 操作、电源状态查询
卫星 SECTF✅ 已覆盖安全相关功能
卫星 USB 调试✅ 已覆盖USB 调试类型设置
卫星载波模式✅ 已覆盖载波模式设置/查询
卫星自定义请求✅ 已覆盖通用自定义请求接口
卫星通话状态监听✅ 已覆盖注册/注销通话状态监听
卫星状态通知✅ 已覆盖状态栏通知显示

明显缺失的功能或接口

  1. 缺少独立的卫星通信服务类:所有卫星通信逻辑都嵌入在 PhoneInterfaceManager 中(超过 500 行),未拆分为独立的 SatelliteControllerXwCommunicationController,违反单一职责原则。

  2. 缺少卫星通信数据模型类:没有定义 XwCallStateXwCommunicationTypeXwRadioState 等枚举或数据类,全部使用 int 常量。

  3. 缺少卫星通话连接管理TelephonyConnectionServiceTelephonyConnection 中完全没有卫星通话相关代码,意味着卫星通话可能未通过标准 Telecom 框架管理。

  4. 缺少卫星短信功能:没有看到卫星短信发送/接收相关代码。

  5. 缺少卫星 SOS/紧急通信EmergencyDialerEmergencyTonePlayer 中没有卫星紧急通信相关逻辑。

  6. 缺少 AOSP 标准卫星通信框架集成:没有引用 android.telephony.SatelliteManagerSatelliteState 等 AOSP U 版本引入的标准卫星通信 API。

  7. 拼写错误XW_RADIO_STATE_CONNECED 应为 XW_RADIO_STATE_CONNECTEDsendSalliteSwitchChangedNotification 应为 sendSatelliteSwitchChangedNotificationCHANNEL_ID_SALLITE_SWITCH 应为 CHANNEL_ID_SATELLITE_SWITCH

代码质量/注释完整度评价

评价维度评分说明
代码组织⭐⭐所有卫星通信代码集中在 PhoneInterfaceManager 中,未做模块化拆分
注释完整度⭐⭐方法缺少 Javadoc 注释,参数含义不明确(如 commTypeusbDebuggingType 的取值范围未说明)
命名规范⭐⭐"XW" 前缀含义不明确;多处拼写错误(CONNECED、SALLITE)
错误处理⭐⭐⭐Phone 为 null 时有基本的错误回调处理,但异常信息不够详细
线程安全⭐⭐⭐使用 Binder.clearCallingIdentity() 正确处理了 Binder 线程切换,XWRadioState 未做同步保护
AOSP 规范兼容性完全是厂商自定义扩展,未与 AOSP 标准卫星通信框架对齐
  1. 卫星通信代码高度集中:所有卫星通信功能仅在 PhoneInterfaceManager.java 一个文件中实现,约 22 个公开方法 + 1 个通知方法 + 1 个广播接收器。

  2. 属于 UNISOC 厂商自定义扩展:以 "XW"(星网)为前缀,不是 AOSP 标准卫星通信框架的一部分。标准 AOSP 卫星通信框架(SatelliteManager 等)的代码位于 frameworks/base/frameworks/opt/telephony/ 中,不在本文件夹范围内。

  3. 主要改进方向

    1. 将卫星通信逻辑从 PhoneInterfaceManager 拆分为独立的 Controller 类
    2. 修复多处拼写错误(CONNECED → CONNECTED、SALLITE → SATELLITE)
    3. 补充方法注释和参数说明
    4. 考虑与 AOSP 标准卫星通信框架对齐

vendor\xwos

一、概览

  • 文件夹路径: y:\build\ssd-1\tanzhoumei\code\vendor\xwos

  • 源文件总数: 约 120+ 个(去重后核心文件约 50 个)

  • 卫星通信相关类/接口总数: 30 个

  • 分类统计:

分类数量说明
API 类2XwTelephonyManager, CallState
服务类5TeleService, TeleDataService, TeleVoiceService, TeleLocationService, TeleStatsService
数据模型类7XwRadioVoiceState, XwRadioVoiceData, XwCallState, XwRadioResponseInfo, PosTime, UeStatus, CqosRdp
HAL 接口类6IXwRadio, IXwRadioResponse, IXwRadioIndication, IXwRadioVoice, IXwRadioVoiceResponse, IXwRadioVoiceIndication
枚举/常量类5XwRadioState, XwRadioError, XwRadioIndicationType, XwRadioResponseType, XwosTeleServiceConstants
回调接口类3VoiceDataListener, ITeleVoice, ITeleStats
JNI/Native 类2AudioStreamer, fakeril

二、详细清单

类/接口名类型文件路径核心职责稳定性注解
vendor.xwos.telephony.XwTelephonyManagerclassplatform/frameworks/base/vendor/xwos/telephony/XwTelephonyManager.java卫星通信管理器,封装卫星特有接口@UnsupportedAppUsage
vendor.xwos.telephony.CallStateclass (Parcelable)platform/frameworks/base/vendor/xwos/telephony/CallState.java卫星通话状态数据结构@UnsupportedAppUsage
com.starkylin.xwos.teleservice.TeleServiceclass (Service)packages/service/.../TeleService.java主服务入口,管理所有子服务@SystemApi
com.starkylin.xwos.teleservice.TeleDataServiceclasspackages/service/.../TeleDataService.java卫星数据网络监控(IMS/OAM/VPN)internal
com.starkylin.xwos.teleservice.TeleVoiceServiceclasspackages/service/.../TeleVoiceService.java卫星语音通话服务internal
com.starkylin.xwos.teleservice.TeleLocationServiceclasspackages/service/.../TeleLocationService.java卫星位置上报服务internal
com.starkylin.xwos.teleservice.TeleStatsServiceclasspackages/service/.../TeleStatsService.java卫星通话统计服务internal
com.starkylin.xwos.teleservice.RadioVoiceConnectionclasspackages/service/.../RadioVoiceConnection.java语音 HAL 交互封装internal
com.starkylin.xwos.teleservice.AudioStreamerclasspackages/service/.../AudioStreamer.java音频编解码流管理(JNI)internal
com.starkylin.xwos.teleservice.ApnServerclasspackages/service/.../ApnServer.javaAPN HTTP 管理服务器internal
com.starkylin.xwos.teleservice.TeleServiceAutoBootclass (BroadcastReceiver)packages/service/.../TeleServiceAutoBoot.java开机自启动internal
com.starkylin.xwos.teleservice.LocalCallRecordclass (Room Entity)packages/service/.../LocalCallRecord.java通话记录数据库模型internal
com.starkylin.xwos.teleservice.XwosTeleServiceConstantsclassexport/java/.../XwosTeleServiceConstants.java统计常量定义public
vendor.xwos.hardware.radio.IXwRadioAIDL interface (HAL)interfaces/radio/aidl/.../IXwRadio.aidl卫星无线电主 HAL 接口@VintfStability
vendor.xwos.hardware.radio.IXwRadioResponseAIDL interface (HAL)interfaces/radio/aidl/.../IXwRadioResponse.aidl卫星无线电响应接口@VintfStability
vendor.xwos.hardware.radio.IXwRadioIndicationAIDL interface (HAL)interfaces/radio/aidl/.../IXwRadioIndication.aidl卫星无线电事件上报接口@VintfStability
vendor.xwos.hardware.radio.voice.IXwRadioVoiceAIDL interface (HAL)interfaces/radio/aidl/.../voice/IXwRadioVoice.aidl卫星语音 HAL 主接口@VintfStability
vendor.xwos.hardware.radio.voice.IXwRadioVoiceResponseAIDL interface (HAL)interfaces/radio/aidl/.../voice/IXwRadioVoiceResponse.aidl卫星语音响应接口@VintfStability
vendor.xwos.hardware.radio.voice.IXwRadioVoiceIndicationAIDL interface (HAL)interfaces/radio/aidl/.../voice/IXwRadioVoiceIndication.aidl卫星语音事件上报接口@VintfStability
vendor.xwos.hardware.radio.XwRadioStateAIDL enum (HAL)interfaces/radio/aidl/.../XwRadioState.aidlCP 状态枚举@VintfStability
vendor.xwos.hardware.radio.XwCallStateAIDL parcelable (HAL)interfaces/radio/aidl/.../XwCallState.aidl通话状态数据结构@VintfStability
vendor.xwos.hardware.radio.XwRadioErrorAIDL enum (HAL)interfaces/radio/aidl/.../XwRadioError.aidl错误码枚举@VintfStability
vendor.xwos.hardware.radio.XwRadioResponseInfoAIDL parcelable (HAL)interfaces/radio/aidl/.../XwRadioResponseInfo.aidl响应信息结构@VintfStability
vendor.xwos.hardware.radio.voice.XwRadioVoiceStateAIDL parcelable (HAL)interfaces/radio/aidl/.../voice/XwRadioVoiceState.aidl语音状态结构@VintfStability
vendor.xwos.hardware.radio.voice.XwRadioVoiceDataAIDL parcelable (HAL)interfaces/radio/aidl/.../voice/XwRadioVoiceData.aidl语音数据结构(共享内存)@VintfStability
vendor.xwos.hardware.radio.voice.XwRadioVoiceDataBufferInfoAIDL parcelable (HAL)interfaces/radio/aidl/.../voice/XwRadioVoiceDataBufferInfo.aidl语音缓冲区信息@VintfStability
com.starkylin.xwos.teleservice.ITeleVoiceAIDL interfaceexport/aidl/.../ITeleVoice.aidl语音服务对外接口public
com.starkylin.xwos.teleservice.ITeleStatsAIDL interfaceexport/aidl/.../ITeleStats.aidl统计服务对外接口public
com.starkylin.xwos.teleservice.VoiceDataListenerAIDL interfaceexport/aidl/.../VoiceDataListener.aidl语音数据回调接口public
fakerilC librarypackages/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 — 通话ID
    • dir — 呼叫方向(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) — 初始化语音服务,连接 HAL
    • sendUplinkVoiceData(data) — 发送上行语音数据到 HAL
    • setDownlinkVoiceDataListener(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 数据库 DAO
    • sBootTime — 开机时间
  • 关键方法:

    • 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/方位角/仰角
卫星短信⚠️ 仅 fakerilHAL 层无 SMS 专用接口
卫星 QoS⚠️ 仅数据结构CqosRdp 定义但未完整实现

明显缺失的功能或接口

  1. 卫星短信 HAL 接口: IXwRadioIXwRadioVoice 均无 SMS 相关方法,仅 fakeril 有 fakeril_send_sms(),说明 SMS 功能尚未通过正式 HAL 接口暴露

  2. 卫星数据业务 HAL 接口: IXwRadio 无数据呼叫建立/释放方法(数据业务走标准 RIL 而非 XW HAL)

  3. 卫星搜星/波束管理: 缺少卫星搜索、波束切换相关接口

  4. 卫星紧急呼叫: 无紧急呼叫优先级处理

  5. 卫星 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) :查询方法(querySummaryForDevicequeryDetailsForUid 等)基于 NetworkTemplate 的旧式 MATCH_MOBILEMATCH_WIFI 等匹配规则。

  • Android 16 (V)新增关键特性

    • getMobileUidStats() — 返回蜂窝和卫星的实时 UID 统计(NetworkStatsManager.java:755

    • getWifiUidStats() — 返回 Wi-Fi 的实时 UID 统计

    • 两者底层均调用 INetworkStatsService.getUidStatsForTransport(int transport)

NetworkTemplate
  • Android 13 (T) :仅支持 MATCH_MOBILEMATCH_WIFIMATCH_ETHERNET 等基于传统网络类型的匹配规则。

  • Android 16 (V)重大变更

    • 新增 MATCH_ALL = 12 匹配规则,配合 setTransportType() 使用

    • 新增 Builder() 默认构造函数 + setTransportType(@Transport int) 方法(NetworkTemplate.java:1285-1292

    • @Transport 注解包含 TRANSPORT_SATELLITENetworkTemplate.java:772

    • Flags.FLAG_NETSTATS_TRANSPORT_TYPE Feature Flag 控制

    • matchesTransportTypes() 方法:模板的传输类型位必须全部包含在 NetworkIdentity 的传输类型位中才算匹配

NetworkStats / NetworkStats.Bucket
  • Android 13 (T) → Android 16 (V)无新增卫星相关字段EntryBucket 中没有 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_CELLULARTRANSPORT_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 typeN/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 新增与变更

APIAndroid 13Android 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 13Android 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 与卫星框架的集成

集成点状态说明
SatelliteAccessControllerNetworkStatsService❌ 无直接集成SAC 仅通过回调通知 ConnectivityService 更新网络偏好,不涉及流量统计
SatelliteAccessController → 流量统计重置/标记❌ 不存在启用/禁用卫星网络时不通知 NetworkStatsService
ConnectivityService 卫星网络请求 → 流量统计✅ 间接关联卫星网络通过 TRANSPORT_SATELLITE 注册到 ConnectivityService,NetworkStatsService 通过网络状态快照感知
卫星消息字节数记录❌ 不存在SatelliteManager/SatelliteController 中无流量统计调用

关键发现SatelliteAccessControllerSatelliteAccessController.java)与流量统计模块完全解耦。它仅负责:

  1. 监控默认短信应用的角色变更

  2. 检查 SATELLITE_COMMUNICATION 权限

  3. 通知 ConnectivityService 创建多层网络请求

3.5 调试支持

调试功能Android 13Android 16
adb shell dumpsys netstats
卫星专属 dump 选项❌ 无 --satellite-stats 选项
卫星接口列表N/A✅ 包含在 "All mobile interfaces" 中
mAllMobileIfacesSinceBootN/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 兼容性影响

  1. 旧应用查询行为:针对 Android 13 开发的应用使用 querySummaryForDevice(TYPE_MOBILE, ...) 时,在 Android 16 上不会自动包含卫星流量(因为 MATCH_MOBILE 规则仅匹配 TYPE_MOBILE + RAT 类型,不匹配 TRANSPORT_SATELLITE)。

  2. 卫星流量误归类风险:由于卫星网络在 legacy type 字段中被标记为 TYPE_MOBILE,如果底层 telephony 将卫星接口注册为移动网络,则使用 MATCH_MOBILE 模板的旧查询可能包含卫星流量。当前代码中 isMobile = (TRANSPORT_CELLULAR == displayTransport || TRANSPORT_SATELLITE == displayTransport) 确保了卫星接口被添加到 mAllMobileIfacesSinceBoot

  3. getMobileUidStats() 行为:该方法文档明确声明返回"cellular and satellite"统计,调用方需注意此合并行为。

5.2 OEM 厂商适配建议

  1. 内核/HAL 层

    1. 确保卫星网络接口被正确注册到 TelephonyNetworkSpecifier 中,包含正确的 subscriptionId

    2. 卫星 Modem 需要通过 PhoneStateListener 上报 RAT 类型

    3. eBPF 程序无需修改,卫星流量通过标准网络接口采集

  2. Framework 层

    1. 启用 FLAG_NETSTATS_TRANSPORT_TYPE Feature Flag 以支持基于传输类型的模板查询

    2. getDisplayTransport() 实现中正确映射卫星传输类型

    3. 确保卫星网络的 NetworkCapabilities 包含 TRANSPORT_SATELLITE

  3. 流量统计区分

    1. 如需独立统计卫星流量,使用:

      •     NetworkTemplate template = new NetworkTemplate.Builder()
                .setTransportType(NetworkCapabilities.TRANSPORT_SATELLITE)
                .build();
            NetworkStatsManager.querySummaryForDevice(template, start, end);
        
    2. 注意:此功能受 Feature Flag 控制,需确认设备已启用


六、关键代码路径索引(AOSP)

文件关键行说明
NetworkTemplate.javaL31, L772, L785, L1174, L1285-1292TRANSPORT_SATELLITE 导入、@Transport 注解、setTransportType()
NetworkIdentity.javaL75, L99mTransportTypesBits 字段及 Builder 中的 setTransportTypes()
NetworkStatsManager.javaL755, L769-771getMobileUidStats() 文档声明含卫星流量
NetworkStatsService.javaL1921-1922, L2357-2360, L2403, L2472-2480, L2493-2500卫星接口识别、isMobile 判断、getSubId、getRatType
INetworkStatsService.aidlL55getUidStatsForTransport(int transport) 接口定义
SatelliteAccessController.java全文卫星访问控制(与流量统计无直接关联)
ConnectivityService.javaL660-663, L14327-14345PREFERENCE_ORDER_SATELLITE_FALLBACK、卫星多层网络请求
NetworkStats.java全文无卫星相关字段
TrafficStats.java全文无卫星相关内容

总结:Android 16 在流量统计框架中为卫星通信搭建了基础识别架构(通过 mTransportTypesBitsNetworkTemplate.Builder.setTransportType()),但尚未实现完整的卫星流量统计体系。卫星流量目前与蜂窝流量合并统计,缺乏独立的查询 API、专属统计策略和与卫星框架的深度集成。这反映了卫星通信在 Android 生态中仍处于早期阶段,后续版本预计将逐步完善。