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

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

Более подробную информацию можно найти в следующих разделах:

Архитектура

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

image

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

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

Аппаратный компонент Описание
Процессор приложений Процессор, на котором работает Android. На этом процессоре Android может работать на виртуальной памяти (ВМ) (а не на реальном оборудовании).
Процессор транспортного средства Процессор, отвечающий за управление питанием процессора приложения.
Блок управления телематикой (TCU) Процессор в автомобиле всегда способен получать удаленные сообщения из облака. Предполагается, что 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 автомобиля активирует электронный блок управления Android (ECU), а OEM-сервис активирует режим «Гараж».

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

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

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

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

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

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

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

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

  3. При запуске удаленного клиента задачи он регистрируется в автосервисе.

  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. Автосервис распределяет задания между соответствующими удаленными клиентами.

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

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

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

  7. Клиент удаленной задачи уведомляет автосервис о завершении задачи.

  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 и другим ECU (например, TCU). Он обязателен для поддержки функции удаленного доступа. Его не нужно реализовывать, если функция удаленного доступа не реализована.

Интерфейс определен в 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

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

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

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

Компоненты, не относящиеся к Android, для бортового компьютера

Процессор транспортного средства

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

Компоненты, не относящиеся к Android, для бортового компьютера

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

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

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

image

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

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

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

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

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

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

Сервер удаленных задач

Удаленный сервер задач управляет этими удаленными задачами.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тестирование клиента удаленных задач

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

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