Внедрение ИСМ

В Android 9 представлен новый интерфейс SystemApi под названием ImsService , который поможет вам внедрить подсистему IP-мультимедиа (IMS). ImsService API — это четко определенный интерфейс между платформой Android и реализацией IMS, предоставляемой поставщиком или оператором связи.

Обзор ImsService

Рисунок 1. Обзор ImsService

С помощью интерфейса ImsService разработчик IMS может предоставить платформе важную сигнальную информацию, такую ​​как регистрационная информация IMS, интеграция SMS через IMS и интеграция функций MmTel для обеспечения голосовых и видеовызовов. API ImsService также является системным API Android, что означает, что его можно создавать непосредственно для Android SDK, а не для исходного кода. Приложение IMS, предварительно установленное на устройстве, также можно настроить для обновления в Play Store.

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

Android предоставляет приложение на AOSP, которое реализует части API ImsService для целей тестирования и разработки. Вы можете найти приложение в /testapps/ImsTestService .

Вы можете найти документацию по ImsService API в ImsService и других классах API.

Реализация

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

Совместимость со старыми реализациями IMS

Хотя Android 9 включает ImsService API, устройства, использующие более старую реализацию IMS, не могут поддерживать этот API. Для этих устройств старые интерфейсы AIDL и классы-оболочки были перемещены в пространство имен android.telephony.ims.compat . При обновлении до Android 9 старые устройства должны выполнить следующие действия, чтобы продолжить поддержку старого API.

  • Измените пространство имен реализации ImsService, чтобы расширить API пространства имен android.telephony.ims.compat .
  • Измените определение службы ImsService в AndroidManifest.xml, чтобы использовать действие фильтра намерений android.telephony.ims.compat.ImsService вместо действия android.telephony.ims.ImsService .

Затем платформа привяжется к ImsService, используя уровень совместимости, предоставленный в Android 9, для работы с устаревшей реализацией ImsService .

Регистрация ImsService с фреймворком

ImsService API реализован как служба, к которой привязывается инфраструктура Android для взаимодействия с реализацией IMS. Для регистрации приложения, реализующего ImsService, в платформе необходимо выполнить три шага. Во-первых, реализация ImsService должна зарегистрироваться на платформе с помощью AndroidManifest.xml приложения; во-вторых, он должен определить, какие функции IMS поддерживает реализация (MmTel или RCS); и в-третьих, он должен быть проверен как доверенная реализация IMS либо в конфигурации оператора связи, либо в наложении устройства.

Определение услуги

Приложение IMS регистрирует ImsService в инфраструктуре, добавляя запись service в манифест, используя следующий формат:

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

Определение service в AndroidManifest.xml определяет следующие атрибуты, необходимые для корректной работы:

  • directBootAware="true" : позволяет обнаруживать службу и запускать ее по telephony до того, как пользователь разблокирует устройство. Служба не может получить доступ к зашифрованному хранилищу устройства , пока пользователь не разблокирует устройство. Дополнительные сведения см. в разделе Поддержка режима прямой загрузки и шифрования на основе файлов .
  • persistent="true" : позволяет этой службе работать постоянно и не прерываться системой для освобождения памяти. Этот атрибут работает ТОЛЬКО, если приложение построено как системное приложение.
  • permission="android.permission.BIND_IMS_SERVICE" : гарантирует, что только процесс, которому предоставлено разрешение BIND_IMS_SERVICE , может связываться с приложением. Это предотвращает привязку мошеннического приложения к службе, так как платформа может предоставить разрешение только системным приложениям.

Служба также должна указать элемент intent-filter с действием android.telephony.ims.ImsService . Это позволяет платформе найти ImsService .

Спецификация функций IMS

После того как ImsService определен как служба Android в файле AndroidManifest.xml, ImsService должен определить, какие функции IMS он поддерживает. В настоящее время Android поддерживает функции MmTel и RCS, однако в инфраструктуру интегрирован только MmTel. Несмотря на то, что в инфраструктуру не интегрированы API-интерфейсы RCS, все же есть преимущества в объявлении их как функции ImsService.

Ниже приведены допустимые функции, определенные в android.telephony.ims.ImsFeature , которые может предоставить ImsService, а также объяснение и пример того, почему приложение IMS может захотеть реализовать одну или все эти функции. После определения каждой функции на этой странице показано, как ImsService объявляет набор функций, которые он определяет для каждого слота SIM-карты.

FEATURE_MMTEL

ImsService реализует функцию IMS MMTEL, которая содержит поддержку всех носителей IMS (спецификации IR.92 и IR.94), кроме аварийного подключения к PDN IMS для экстренных вызовов. Любая реализация ImsService , которая хочет поддерживать функции MMTEL, должна расширять базовый класс android.telephony.ims.MmTelFeature и возвращать пользовательскую реализацию MmTelFeature в ImsService#createMmTelFeature .

FEATURE_EMERGENCY_MMTEL

Объявление этой функции только сообщает платформе, что возможно экстренное подключение к IMS PDN для экстренных служб. Если эта функция не объявлена ​​для вашего ImsService , платформа по умолчанию всегда будет использовать резервный коммутатор Circuit Switch для экстренных служб. Функция FEATURE_MMTEL должна быть определена, чтобы эта функция была определена.

FEATURE_RCS

ImsService API не реализует какие-либо функции IMS RCS, но базовый класс android.telephony.ims.RcsFeature все же может быть полезен. Платформа автоматически привязывается к ImsService и вызывает ImsService#createRcsFeature когда обнаруживает, что пакет должен предоставлять RCS. Если SIM-карта, связанная со службой RCS, удалена, платформа автоматически вызывает RcsFeature#onFeatureRemoved а затем очищает ImsService связанную с функцией RCS. Эта функциональность может удалить часть пользовательской логики обнаружения/привязки, которую в противном случае должна была бы предоставлять функция RCS.

Регистрация поддерживаемых функций

Платформа телефонии сначала привязывается к ImsService для запроса функций, которые она поддерживает, с помощью API ImsService#querySupportedImsFeatures . После того, как фреймворк рассчитает, какие функции будет поддерживать ImsService, он вызовет ImsService#create[...]Feature для каждой функции, за которую будет отвечать ImsService. Если функции, поддерживаемые приложением IMS, изменяются, вы можете использовать ImsService#onUpdateSupportedImsFeatures , чтобы сигнализировать платформе о перерасчете поддерживаемых функций. См. диаграмму ниже для получения дополнительной информации об инициализации и привязке ImsService.

Инициализация и привязка ImsService

Рисунок 2: Инициализация и привязка ImsService

Обнаружение платформы и проверка реализации ImsService

Как только ImsService будет правильно определен в AndroidManifest.xml, платформа должна быть настроена для (безопасной) привязки к ImsService, когда это необходимо. Существует два типа ImsServices, к которым привязывается фреймворк:

  1. Оператор «отменяет» ImsService: эти ImsServices предварительно загружены на устройство, но привязаны к одному или нескольким операторам сотовой связи и будут привязаны только при установке соответствующей SIM-карты. Это настраивается с помощью
  2. ImsService устройства «по умолчанию»: это ImsService по умолчанию, который загружается на устройство OEM-производителем и должен быть предназначен для предоставления услуг IMS во всех ситуациях, когда ImsService оператора связи недоступен, и полезен в ситуациях, когда на устройстве нет SIM-карты. вставлена ​​или на вставленной SIM-карте не установлен оператор ImsService. Это определяется в наложении устройства с использованием следующих конфигураций:

Android не поддерживает приложения со сторонними загружаемыми реализациями ImsService, поэтому любые реализации ImsService, определенные здесь, должны быть системными приложениями и должны находиться в папке /system/priv-app/ или /product/priv-app/, чтобы предоставить соответствующие разрешения (а именно разрешения на доступ к телефону, микрофону, местоположению, камере и контактам). При проверке того, соответствует ли имя пакета реализации IMS значениям CarrierConfig или наложения устройства, определенным выше, привязываются только доверенные предварительно установленные приложения.

Настройка

Приложения, реализующие ImsService, привязаны только к устройствам, на которых они настроены как «переопределяющие» ImsService оператора или конфигурации ImsService «по умолчанию» устройства для функций MMTEL или RCS. ImsService также позволяет динамически включать и отключать поддерживаемые им функции IMS (MMTEL и RCS) с помощью обновлений с помощью метода ImsService#onUpdateSupportedImsFeatures . Это запускает платформу для пересчета того, какие ImsServices привязаны и какие функции они поддерживают. Если приложение IMS обновляет платформу без поддерживаемых функций, ImsService будет отключен до тех пор, пока телефон не будет перезагружен или не будет вставлена ​​новая SIM-карта, соответствующая приложению IMS.

Приоритет привязки для нескольких ImsService

Платформа не может поддерживать привязку ко всем возможным ImsServices, предварительно загруженным на устройство, и будет привязываться к двум ImsServices на слот SIM-карты (по одному ImsService для каждой функции) в следующем порядке для каждой функции:

  1. Имя пакета ImsService, определяемое значением config_ims_[mmtel/rcs]_package_override_string при вставленной SIM-карте.
  2. Имя пакета ImsService, определенное в значении наложения устройства для config_ims_[mmtel/rcs]_package включая случай, когда SIM-карта не вставлена. Этот ImsService ДОЛЖЕН поддерживать функцию Emergency MmTel.

У вас должно быть либо имя пакета вашего ImsService, определенное в CarrierConfig для каждого из операторов связи, которые будут использовать этот пакет, либо в наложении устройства, если ваш ImsService будет использоваться по умолчанию, как определено выше.

Давайте разберем это для каждой функции. Для устройства (с одной или несколькими SIM-картами) с одной загруженной SIM-картой возможны две функции IMS: MMTel и RCS. Платформа попытается выполнить привязку в порядке, указанном выше для каждой функции, и если эта функция недоступна для ImsService, определенного в переопределении конфигурации оператора связи, платформа вернется к ImsService по умолчанию. Так, например, в приведенной ниже таблице описано, какую функцию IMS будет использовать инфраструктура с учетом трех приложений IMS, реализующих ImsServices, установленных в системе со следующими функциями:

  • Оператор связи A ImsService поддерживает RCS
  • Оператор связи B ImsService поддерживает RCS и MMTel
  • OEM ImsService поддерживает RCS и MMTel
SIM-карта вставлена Функция RCS Функция ММТел
Перевозчик А Перевозчик А ОЕМ
Перевозчик Б Перевозчик Б Перевозчик Б
Нет SIM-карты ОЕМ ОЕМ

Проверка

Инструменты для проверки самой реализации IMS не включены, поскольку спецификации IMS чрезвычайно велики и используют специальное оборудование для проверки. Тесты могут только подтвердить, что инфраструктура телефонии правильно реагирует на ImsService API.