Сервис подбора домена

Для устройств под управлением Android 15 или выше можно реализовать выбор домена между службой IMS и устаревшими службами по сетям с коммутацией каналов с помощью системного API DomainSelectionService . DomainSelectionService — это четко определенный интерфейс между платформой Android и реализацией выбора домена, предоставленной поставщиком. Этот интерфейс позволяет реализации поставщика предоставлять платформе сигнальную информацию, например домен, на который направляются исходящие вызовы и SMS, и предпочтительный тип сети при сканировании сети.

архитектура-выбора-домена

Рисунок 1. Архитектурная схема для функции выбора домена

Примеры и источник

Android предоставляет эталонную реализацию для функции выбора домена в AOSP в TelephonyDomainSelectionService . Подробную документацию по API DomainSelectionService см. в 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 , может привязываться к приложению. Это предотвращает привязку мошеннического приложения к службе, поскольку только системные приложения могут получить разрешение от фреймворка.

Служба также должна указать элемент intent-filter с действием android.telephony.DomainSelectionService . Это позволяет фреймворку найти службу 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 , запустите тесты CTS в DomainSelectionServiceTestOnMockModem .