Настроить удаленный доступ

В Android 14 представлена ​​новая функция удаленного доступа, которая позволяет партнерам удаленно активировать Android в автомобиле для выполнения определенных задач. Например, для включения режима «Гараж» на ночь для применения обновлений программного обеспечения. Для полного цикла работы требуется множество компонентов, не относящихся к Android. Android не определяет и не предоставляет реализацию для таких компонентов (эта ответственность лежит на вас).

Для получения более подробной информации см. следующие разделы:

Архитектура

Приведенное ниже содержание предполагает использование следующей гипотетической архитектуры, которая может не отражать реальную архитектуру. Производителям оборудования следует адаптировать реальную реализацию к архитектуре своих автомобилей и серверов.

image

Рисунок 1. Пример архитектуры.

Пример архитектуры состоит из следующих аппаратных компонентов:

Аппаратный компонент Описание
процессор приложений Процессор, на котором работает Android. На этом процессоре Android может работать в виртуальной памяти (VM) (а не на реальном оборудовании).
Автомобильный процессор Процессор, отвечающий за управление питанием процессора приложения.
Блок управления телематикой (TCU) Процессор в автомобиле всегда способен принимать удаленные сообщения из облака. Предполагается, что блок управления трансмиссией (TCU) всегда включен или находится в режиме пониженного энергопотребления. Используйте удаленные сообщения для активации блока управления трансмиссией.
Сервер пробуждения Удаленный сервер, работающий в облаке и отвечающий за связь с блоком управления трансмиссией (TCU) в автомобиле для выдачи команд пробуждения.
Удаленный сервер задач Сервер удаленных задач работает в облаке, взаимодействует с пользователями и управляет удаленными задачами.

Пример архитектуры состоит из следующих программных компонентов, все из которых работают на Android:

Программный компонент на Android Описание
Автосервис Сервис платформы AAOS, предоставляющий API для удаленного доступа.
Клиент удаленной задачи Разработанный сторонним поставщиком класс Service , выполняющий удалённые задачи. Одна система Android может запускать несколько клиентов для удалённых задач.
Удаленный доступ HAL Необходимо реализовать функцию удалённого доступа.
Абстрактный слой для связи между AAOS и компонентом, не относящимся к Android, таким как TCU.

Ниже описаны программные компоненты, не относящиеся к Android :

Не-Android программный компонент Описание
Пробуждение клиента Программное обеспечение, работающее на блоке управления трансмиссией (TCU), поддерживает долговременное соединение с сервером пробуждения. Оно также поддерживает соединение с модулем удаленного доступа HAL для передачи удаленных задач в службу Car Service.
Реализация сервера пробуждения Сервер, взаимодействующий с клиентом пробуждения, работающим на TCU. Может отправлять запросы на пробуждение клиенту пробуждения.
Реализация удаленного сервера задач Сервер, управляющий удаленными задачами. Пользователи взаимодействуют с этим сервером для запуска и мониторинга удаленных задач.

Рабочий процесс

В этом разделе перечислены шаги примерного рабочего процесса.

Пример рабочего процесса

Подробный алгоритм действий может выглядеть следующим образом:

  1. Пользователь паркует автомобиль в гараже.

  2. Партнер стремится обновлять информацию о транспортном средстве в течение ночи, когда взаимодействие с транспортными средствами маловероятно.

  3. Партнерский облачный сервер отправляет удаленное задание на обновление системы в транспортное средство. В частности, в блок телематического управления (TCU).

  4. Блок управления трансмиссией (TCU) автомобиля активирует электронный блок управления (ECU) на базе Android, а сервисное обслуживание от производителя запускает режим «Гараж».

  5. В Android используется режим «Гараж» для загрузки и установки обновлений через Google Play.

  6. После применения обновления Android помечает задачу как выполненную и либо разрывает соединение, либо истекает указанный тайм-аут.

Подробный рабочий процесс

Для удаленного доступа необходимы два важных шага. Первый — регистрация клиента, то есть привязка конкретного пользователя к конкретному клиенту удаленного доступа, работающему на конкретном транспортном средстве. Второй — выполнение задачи, то есть доставка удаленной задачи для конкретного пользователя конкретному клиенту удаленного доступа, работающему на конкретном транспортном средстве.

Зарегистрировать клиента

Для использования функции удаленного доступа пользователю необходимо хотя бы один раз открыть клиентское приложение для удаленных задач и завершить процесс регистрации клиента ( выделенный жирным шрифтом текст указывает на задачи, реализованные AAOS):

  1. При загрузке система Car Service получает информацию об автомобиле от HAL удаленного доступа.

  2. При загрузке система Car Service запускает все клиенты удаленных задач на основе фильтра намерений и разрешений.

  3. При запуске клиента удаленного выполнения, клиент удаленного выполнения регистрируется в службе Car Service.

  4. Сервис Car Service уведомляет клиента, выполняющего удаленное задание, о регистрационных данных, включая идентификатор транспортного средства и идентификатор клиента. Идентификатор клиента является уникальным и присваивается сервисом Car Service данному клиенту. Гарантируется его уникальность среди всех клиентов, выполняющих удаленные задания на одном и том же транспортном средстве.

  5. Пользователь входит на удаленный сервер задач через удаленный клиент задач и активирует функцию удаленного доступа для данного транспортного средства. Этот шаг обычно включает аутентификацию через удаленный сервер задач.

  6. Клиент удаленного задания загружает информацию о пользователе, а также идентификатор транспортного средства и идентификатор клиента на сервер удаленного задания и запрашивает у него связь пользователя с этим конкретным клиентом и этим конкретным транспортным средством.

    При желании этот шаг может включать дополнительную двухфакторную аутентификацию пользователя.

    Удаленный сервер задач должен проверить, совпадает ли предоставленный в запросе идентификатор транспортного средства с идентификатором транспортного средства отправителя, что может быть выполнено посредством аттестации транспортного средства.

Если не производится сброс к заводским настройкам, регистрация клиента требуется один раз для каждого пользователя и каждого автомобиля. Идентификатор клиента хранится локально в системе Car Service и остается неизменным для одного и того же клиента.

image

Рисунок 2. Регистрация клиента.

Отменить регистрацию клиента

Пользователь может отвязать транспортное средство от своей учетной записи либо непосредственно от транспортного средства, либо от удаленного сервера задач:

  • На транспортном средстве пользователи могут открыть приложение удаленного управления задачами и отправить запрос на отмену привязки, чтобы отвязать это транспортное средство от ранее связанных учетных записей пользователей.

  • На сервере удаленных задач пользователи могут войти в свою учетную запись и отменить привязку ранее связанного транспортного средства к этой учетной записи.

Если пользователь отключает транспортное средство от своей учетной записи, удаленный сервер задач должен удалить сохраненные настройки для данного пользователя.

Выполнение задач

В облаке:

  1. Пользователь использует сервер удаленных задач для отправки удаленной задачи конкретному транспортному средству.

  2. Удаленный сервер задач сопоставляет идентификатор пользователя с идентификатором транспортного средства и идентификатором клиента. Он отправляет данные задачи, идентификатор транспортного средства и идентификатор клиента на сервер пробуждения.

  3. Сервер пробуждения находит конкретный блок управления транспортным средством (TCU) для идентификатора транспортного средства (при условии, что регистрация TCU уже завершена) и отправляет данные задачи и идентификатор клиента в TCU.

На транспортном средстве ( выделенный жирным шрифтом текст указывает на задачи, выполняемые AAOS):

  1. Блок управления терминалом (TCU) получает удаленные задачи от удаленного сервера.

  2. Если процессор приложения (AP), на котором работает AAOS, выключен, блок управления трансмиссией (TCU) использует процессор автомобиля (VP) для пробуждения AP.

  3. Автосервис получает заказы от TCU.

  4. Сервис Car Service распределяет задачи между соответствующими удаленными клиентами.

  5. Клиент удаленного задания получает и выполняет задание.

    ( Необязательно ) Клиент удаленного задания связывается с сервером заданий для получения более подробной информации о задании и выполняет его.

  6. ( Необязательно ) Служба клиента удаленного выполнения задач передает результаты выполнения задачи на сервер задач.

  7. Клиент удаленного управления уведомляет службу Car Service о завершении задачи.

  8. При необходимости автосервис восстанавливает электропитание автомобиля.

image

Рисунок 3. Выполнение задач.

Напишите клиент для удалённой задачи

CarRemoteAccessManager предоставляет API для функций удаленного доступа. Для получения дополнительной информации см. CarRemoteAccessManager . Клиент удаленных задач — это служба Android, которая выполняет удаленные задачи и использует CarRemoteAccessManager . Для этого требуются PERMISSION_USE_REMOTE_ACCESS и PERMISSION_CONTROL_REMOTE_ACCESS , а также необходимо объявить фильтр намерений для RemoteTaskClientService , например:

<service android:name=".remoteaccess.RemoteTaskClientService"
         android:directBootAware="true"
         android:exported="true">
    <intent-filter>
       <action android:name="android.car.remoteaccess.RemoteTaskClientService" />
    </intent-filter>
</service>

Клиент удаленной задачи должен зарегистрироваться в службе Car Service во время создания:

public final class RemoteTaskClientService extends Service {
    @Override
    public void onCreate() {
        // mCar = Car.createCar()...
        mRemoteAccessManager = (CarRemoteAccessManager)
            mcar.getCarManager(Car.CAR_REMOTE_ACCESS_SERVICE);
        if (mRemoteAccessManager == null) {
            // Remote access feature is not supported.
            return;
        }
        mRemoteAccessManager.setRemoteTaskClient(executor, mRemoteTaskClient);
    }
}

Необходимо переопределить функцию onBind, чтобы она возвращала null.

@Override
public IBinder onBind(Intent intent) {
    return null;
}

Сервис Car Service управляет своим жизненным циклом. Car Service подключается к этому сервису при запуске и при поступлении удалённой задачи. Car Service отключается от этого сервиса после завершения задачи. Для получения дополнительной информации см. раздел «Управление жизненным циклом сервиса» .

Клиент удаленных задач запускается от имени системного пользователя, поэтому он не имеет доступа к каким-либо пользовательским данным.

В следующем примере показано, как обрабатывать зарегистрированные обратные вызовы:

private final class RemoteTaskClient
    implements CarRemoteAccessManager.RemoteTaskClientCallback {
    @Override
    public void onRegistrationUpdated(
        RemoteTaskClientRegistrationInfo info) {
        // Register to remote task server using info.
    }
    @Override
    public void onRemoteTaskRequested(String taskId,
        byte[] data, int remainingTimeSec) {
        // Parses the data and execute the task.
        // Report task result to remote task server.
        mRemoteAccessManager.reportRemoteTaskDone(taskId);
    }
    @Override
    public void onShutdownStarting(CompleteableRemoteTaskFuture future) {
        // Stop the executing task.
        // Clear the pending task queue.
        future.complete();
    }
}

Внедрение поставщика

Функция удалённого доступа является необязательной и отключена по умолчанию. Чтобы включить эту функцию, добавьте запрос на удалённый доступ (RRO) следующим образом:

// res/xml/overlays.xml
<?xml version="1.0" encoding="utf-8"?>
<overlay>
    <item target="array/config_allowed_optional_car_features" value="@array/config_allowed_optional_car_features" />
</overlay>

// res/values/config.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string-array translatable="false" name="config_allowed_optional_car_features">
        <item>car_remote_access_service</item>
    </string-array>
</resources>

// Android.bp
runtime_resource_overlay {
    name: "RemoteAccessOverlay",
    resource_dirs: ["res"],
    manifest: "AndroidManifest.xml",
    sdk_version: "current",
    product_specific: true
}

Или используйте следующую команду adb для сборки userdebug/eng:

adb shell cmd car_service enable-feature car_remote_access_service

Требования к Android

Удаленный доступ HAL

Уровень аппаратной абстракции удаленного доступа (HAL) — это реализованный производителем уровень абстракции для связи между AAOS и другим ЭБУ (например, блоком управления трансмиссией). Он является обязательным для поддержки функции удаленного доступа. Его реализация не требуется, если функция удаленного доступа не реализована.

Интерфейс определен в файле IRemoteAccess.aidl и включает следующие методы:

Сорт Описание
String getVehicleId() Получает уникальный идентификатор транспортного средства, который может быть распознан сервером пробуждения.
String getWakeupServiceName() Получает имя удаленного сервера пробуждения.
String getProcessorId() Получает уникальный идентификатор процессора, который можно распознать, разбудив клиент.
void setRemoteTaskCallback(IRemoteTaskCallback callback)

Устанавливает функцию обратного вызова, которая будет вызываться при запросе удаленной задачи.

void clearRemoteTaskCallback() Сбрасывает ранее установленный обратный вызов удаленной задачи.
void notifyApStateChange(in ApState state)

Определяет, готов ли процессор приложений к приему удаленных задач.

Интерфейс обратного вызова определен в файле IRemoteTaskCallback.aid .

Сорт Описание
oneway void onRemoteTaskRequested(String clientId, in byte[] data)

Функция обратного вызова, которая вызывается при запросе удаленной задачи.

См. эталонную реализацию с внешним блоком управления TCU. В реализации используется долговременный поток чтения для приема удаленных задач и поддерживается следующая команда debug :

dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default

Транспортное средство HAL

Для поддержки функции удалённого доступа VHAL должен обладать следующими свойствами:

Сорт Описание
SHUTDOWN_REQUEST Запрашивает выключение головного устройства.
VEHICLE_IN_USE
  • Определяет, используется ли транспортное средство.
  • После того, как пользователь разблокирует транспортное средство или когда пользователь приблизится к транспортному средству. Должно быть true .
  • Конкретный период времени после выключения пользователем транспортного средства или после блокировки транспортного средства. Должно быть false .
  • В true AAOS не пытается выключить автомобиль после завершения удаленной задачи.

Для получения более подробной информации см. раздел «Поддерживаемые системные свойства» .

Бесшумный режим

Для функции удаленного доступа необходимо поддерживать бесшумный режим, чтобы автомобиль мог загружаться в бесшумном режиме и выполнять удаленные задачи, когда пользователь отсутствует. В бесшумном режиме устройство AAOS загружается с выключенными дисплеем и звуком.

Управление бесшумным режимом осуществляется с помощью двух файлов sysfs ядра Linux.

Сорт Описание
/sys/kernel/silent_boot/pm_silentmode_kernel_state

Отображает текущий бесшумный режим.

/sys/kernel/silent_boot/pm_silentmode_hw_state

Представляет собой аппаратный сигнал для установки нового бесшумного режима.

Процессор автомобиля отправляет аппаратный сигнал на SoC Android для включения/выключения бесшумного режима. Сигнал (0 или 1) записывается в /sys/kernel/silent_boot/pm_silentmode_hw_state . Затем платформа AAOS соответствующим образом обновляет /sys/kernel/silent_boot/pm_silentmode_kernel_state , который отображает текущий бесшумный режим. Модули AAOS проверяют /sys/kernel/silent_boot/pm_silentmode_kernel_state чтобы узнать, находится ли система в бесшумном режиме или нет.

Когда получено удаленное задание и запущена система AAOS, автомобильный процессор устанавливает бесшумный режим и запускает AAOS таким образом, чтобы система загружалась с выключенным дисплеем/звуком.

Компоненты, не относящиеся к Android, установленные в автомобиле.

Автомобильный процессор

Автомобильный процессор — это процессор в автомобиле, который может управлять питанием процессора приложений, работающего под управлением Android. В приведенной архитектуре блок управления трансмиссией (TCU) активирует процессор приложений, отправляя сигнал автомобильному процессору.

Компоненты, не относящиеся к Android, установленные в автомобиле.

Блок управления трансмиссией автомобиля всегда может принимать удаленные сообщения.

Клиент пробуждения работает на блоке управления терминалом (TCU), обеспечивая длительное соединение с удаленным сервером пробуждения.

AAOS, работающий на точке доступа, может взаимодействовать с клиентом пробуждения, работающим на блоке управления терминалом (TCU), через HAL удаленного доступа.

image

Рисунок 4. TCU (клиент, пробуждающийся после пробуждения).

Облачные компоненты

Сервер пробуждения

Сервер пробуждения взаимодействует с клиентом пробуждения на блоке управления терминалом (TCU) следующим образом:

  • Поддерживайте долговременную связь с блоком управления трансмиссией автомобиля.
  • Найдите конкретный блок управления трансмиссией (TCU) по идентификатору автомобиля.
  • Сообщайте на удаленный сервер задач информацию о состоянии транспортного средства. Например, подключено оно или нет, или время последнего подключения.

В практической реализации сервер пробуждения может быть объединен с сервером удаленных задач.

Удаленный сервер задач

Сервер удалённых задач управляет этими удалёнными задачами.

  • Пользователь взаимодействует с сервером для запуска новых удаленных задач и для мониторинга удаленных задач.

  • Использует удаленный сервер пробуждения для активации процессора приложения в транспортных средствах.

  • Взаимодействует с клиентом удаленного выполнения задач, работающим на транспортном средстве.

  • Хранит информацию о регистрации клиента. Это позволяет связать конкретного пользователя с конкретным клиентом для выполнения удаленных задач на конкретном транспортном средстве.

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

Требования к конфиденциальности и безопасности

Задача Состояние Требование
TCU (клиент пробуждения) ДОЛЖЕН
  • Проведите аутентификацию сервера пробуждения.
  • Доверьтесь коду.
Сервер пробуждения ДОЛЖЕН
  • Разрешите подключение только удаленным серверам задач, указанным в списке разрешенных.
  • Проведите аутентификацию клиента, запускающего процесс пробуждения.
  • Отправьте сообщение для пробуждения только целевому транспортному средству.
Клиент удаленной задачи ДОЛЖЕН
  • Аутентификация пользователя должна выполняться во время регистрации.
  • Проведите аутентификацию удаленного сервера задач.
  • Соответствовать всем требованиям безопасности для служб Android. Например, иметь ограниченные права доступа.
Удаленный сервер задач ДОЛЖЕН
  • Необходимо аутентифицировать сервер пробуждения.
  • Предоставьте подтверждение права собственности на транспортное средство. То есть, убедитесь, что идентификатор транспортного средства, указанный в запросе, совпадает с идентификатором транспортного средства отправителя. Если подтверждение права собственности на транспортное средство невозможно, необходимо использовать другие средства для проверки того, что пользователь в настоящее время является владельцем транспортного средства.
  • Подтвердите личность пользователя.
  • Сервер, обрабатывающий информацию о пользователях, должен соответствовать всем требованиям безопасности.

Сброс к заводским настройкам и передача прав собственности

Если пользователь выполняет сброс к заводским настройкам, идентификатор клиента, хранящийся в Car Service, удаляется. Однако серверы (сервер удаленных задач и сервер удаленного пробуждения) об этом не уведомляются. Серверы сохраняют сопоставление между истекшим идентификатором клиента и автомобилем. В результате, если пользователь запускает новую удаленную задачу для автомобиля, она использует истекший идентификатор клиента. Автомобиль пробуждается, но удаленная задача не может быть выполнена, поскольку у клиента удаленной задачи другой идентификатор клиента, который не совпадает.

Ниже описан один из возможных вариантов выполнения сброса к заводским настройкам.

Когда пользователь выполняет сброс к заводским настройкам, поставщик предлагает ему войти на удаленный сервер задач и отвязать автомобиль от своей учетной записи, если пользователь ранее уже связывал автомобиль с учетной записью. Доступ к сети во время сброса к заводским настройкам не гарантируется. Поэтому отправка запроса на отвязку с устройства во время сброса к заводским настройкам может быть нецелесообразной.

При каждой передаче права собственности на транспортное средство необходимо выполнить ряд действий, чтобы убедиться, что предыдущий владелец больше не сможет удаленно управлять транспортным средством. Например, новому владельцу может быть предложено:

  • Выполните сброс до заводских настроек. Это гарантирует восстановление идентификатора клиента. После этого шага предыдущий владелец по-прежнему сможет активировать автомобиль, но больше не сможет выполнять удаленные задачи.

  • Откройте приложение «Удалённое управление» и выполните процедуру «Отменить регистрацию клиента» , чтобы отвязать транспортное средство от учётной записи предыдущего владельца. Новый владелец может выполнить процедуру «Зарегистрировать клиента», чтобы привязать транспортное средство к своей учётной записи и заменить ранее привязанную учётную запись.

  • Новый владелец может использовать процедуру регистрации клиента , чтобы привязать транспортное средство к своей учетной записи и заменить ранее привязанную учетную запись.

Протестируйте клиент удалённой задачи

Мы предоставляем эталонный каталог HAL удаленного доступа default для тестирования клиентов удаленных задач. Вы можете использовать следующую команду debug , чтобы внедрить фиктивную удаленную задачу в HAL, которая будет перенаправлена ​​вашему клиенту удаленной задачи, если вы укажете правильный идентификатор клиента. Вы можете получить идентификатор клиента, записав информацию о регистрации в вашей реализации клиента удаленной задачи.

adb root && adb shell dumpsys android.hardware.automotive.remoteaccess.IRemoteAccess/default --inject-task [clientID] [taskData]