域名选择服务

对于运行 Android 15 或更高版本的设备,您可以使用 DomainSelectionService 系统 API 在 IMS 服务和传统服务之间通过电路交换网络实现域名选择。DomainSelectionService 是 Android 平台与供应商提供的域名选择实现之间的明确定义的接口。此接口允许供应商实现提供信令信息(例如,拨出电话和短信放置的域以及网络扫描中的网络类型偏好设置)到平台。

domain-selection-architecture

图 1. 域名选择功能架构图

示例和源代码

Android 在 AOSP 中的 TelephonyDomainSelectionService 中为域名选择功能提供了参考实现。有关 DomainSelectionService API 的详细文档,请参阅 DomainSelectionService 以及 API 中的其他类。

实现

要在 Android 设备上实现域名选择功能,需要执行以下步骤

  1. 创建域名选择应用。必须在 AndroidManifest.xml 文件中定义该服务。

  2. 向设备叠加层添加配置,以允许平台绑定到 DomainSelectionService 实现。

  3. 支持域名选择功能所需的无线 HAL 接口。

本节提供这些步骤的更多详细信息。

在 AndroidManifest.xml 中添加服务条目

为了让您的域名选择应用向框架注册 DomainSelectionService 服务,请使用以下格式在清单文件中添加服务条目

<service
     android:name="com.example.domainselection.DomainSelectionService"
     android:directBootAware="true"
     android:persistent="true"
     …
     android:permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
     …
    <intent-filter>
        <action android:name="android.telephony.DomainSelectionService"/>
    </intent-filter>
    …
</service>

AndroidManifest.xml 中的服务定义必须定义以下属性,域名选择功能才能运行。

  • directBootAware="true":允许电话服务在用户解锁设备之前发现并运行该服务。在用户解锁设备之前,该服务无法访问设备加密存储空间。有关详情,请参阅 支持直启动模式基于文件的加密

  • persistent="true":允许服务持久运行,且不会被系统终止以回收内存。此属性在应用构建为系统应用时有效。

  • permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE":确保只有被授予 BIND_DOMAIN_SELECTION_SERVICE 权限的进程才能绑定到该应用。这可以防止恶意应用绑定到该服务,因为只有系统应用才能被框架授予此权限。

该服务还必须指定包含 android.telephony.DomainSelectionService 操作的 intent-filter 元素。这使框架能够找到 DomainSelectionService 服务。

在设备叠加层中定义配置

为了让平台安全地绑定到 DomainSelectionService 服务,请将以下配置添加到设备叠加层

因为 Android 不支持具有第三方可下载 DomainSelectionService 实现的应用,所以域名选择应用必须是位于 /system_ext/priv-app//product/priv-app/ 文件夹中的系统应用。框架会验证实现的软件包名称是否与设备叠加层值匹配,以确保仅绑定受信任的预安装应用。

支持无线装置 HAL 接口

要启用域名选择功能,请支持以下必需的无线装置 HAL 接口

  • IRadioNetwork

    void setEmergencyMode(int serial, EmergencyMode emcModeType);
    void triggerEmergencyNetworkScan(int serial,
            EmergencyNetworkScanTrigger request);
    void cancelEmergencyNetworkScan(int serial, boolean resetScan);
    void exitEmergencyMode(int serial);
    
  • IRadioNetworkIndication

    void emergencyNetworkScanResult(RadioIndicationType type,
            EmergencyRegResult result);
    

验证

要测试电话服务框架是否正确响应 DomainSelectionService 接口,请运行 DomainSelectionServiceTestOnMockModem 中的 CTS 测试。