원격 액세스 설정

Android 14에서는 새로운 원격 액세스 기능을 도입합니다. 이 기능을 사용하면 파트너가 원격으로 차량의 Android의 절전 모드를 해제하여 특정 작업을 실행할 수 있습니다. 예를 들어 밤새 차고 모드를 실행하여 소프트웨어 업데이트를 적용할 수 있습니다. 여러 비 Android 구성요소는 엔드 투 엔드 워크플로에 필요합니다. Android는 비 Android 구성요소의 구현을 정의하거나 제공하지 않습니다(이는 개발자 책임입니다).

자세한 내용은 다음 섹션을 참고하세요.

아키텍처

다음 콘텐츠에서는 다음 샘플 아키텍처가 사용된다고 가정합니다. 이는 가상이며 실제 아키텍처를 반영하지 않을 수도 있습니다. OEM은 차량 및 서버 아키텍처에 맞게 실제 구현을 조정해야 합니다.

이미지

그림 1. 샘플 아키텍처

샘플 아키텍처는 다음 하드웨어 구성요소로 이루어집니다.

하드웨어 구성요소 설명
앱 프로세서 Android를 실행하는 프로세서입니다. Android는 이 프로세서의 가상 메모리(VM)(실제 하드웨어가 아님)에서 실행될 수 있습니다.
차량 프로세서 앱 프로세서의 전원을 제어하는 프로세서입니다.
텔레매틱 컨트롤 유닛(TCU) 차량의 프로세서는 클라우드에서 원격 메시지를 항상 수신할 수 있습니다. TCU는 항상 켜져 있거나 저전력 모드 상태라고 간주됩니다. 원격 메시지를 사용하여 TCU의 절전 모드를 해제합니다.
Wake-up 서버 클라우드에서 실행되고, 차량의 TCU와 통신하여 wake-up 명령어를 실행하는 원격 서버입니다.
원격 작업 서버 원격 작업 서버는 클라우드에서 실행되고 사람과 상호작용하며 원격 작업을 관리합니다.

샘플 아키텍처는 모두 Android에서 실행되는 다음 소프트웨어 구성요소로 이루어집니다.

Android 소프트웨어 구성요소 설명
자동차 서비스 원격 액세스 API를 제공하는 AAOS 프레임워크 서비스입니다.
원격 작업 클라이언트 공급업체가 작성한 Service 클래스로, 원격 작업을 실행합니다. 하나의 Android 시스템에서 여러 원격 작업 클라이언트를 실행할 수 있습니다.
원격 액세스 HAL 원격 액세스를 위해 구현되어야 합니다.
AAOS와 비 Android 구성요소(예: TCU) 간의 통신을 위한 추상화 계층입니다.

비 Android 소프트웨어 구성요소는 아래에 설명되어 있습니다.

비 Android 소프트웨어 구성요소 설명
Wake-up 클라이언트 TCU에서 실행되는 소프트웨어로, wake-up 서버와의 장기간 연결을 유지합니다. 또한 원격 액세스 HAL과의 연결을 유지하여 자동차 서비스에 원격 작업을 전송합니다.
Wake-up 서버 구현 TCU에서 실행되는 wake-up 클라이언트와 통신하는 서버입니다. wake-up 클라이언트에 wake-up 요청을 보낼 수 있습니다.
원격 작업 서버 구현 원격 작업을 관리하는 서버입니다. 사용자는 이 서버와 상호작용하여 원격 작업을 실행하고 모니터링합니다.

워크플로

이 섹션에는 샘플 워크플로의 단계가 나열되어 있습니다.

샘플 워크플로

자세한 워크플로는 다음과 같을 수 있습니다.

  1. 사용자가 차량을 차고에 주차합니다.

  2. 파트너가 차량 상호작용 가능성이 없는 밤 동안에 차량을 업데이트하려고 합니다.

  3. 파트너 클라우드 서버에서 업데이트 시스템 원격 작업을 차량에 전송합니다. 구체적으로 텔레매틱 컨트롤 유닛(TCU)입니다.

  4. 차량의 TCU에서 Android 전자 제어 장치(ECU)의 절전 모드를 해제하고 OEM 서비스는 차고 모드를 트리거합니다.

  5. Android는 차고 모드를 실행하여 Google Play를 통해 업데이트를 다운로드하고 설치합니다.

  6. 업데이트를 적용한 후 Android는 작업을 완료된 것으로 표시하고 연결을 종료하거나 지정된 제한 시간에 도달합니다.

세부 워크플로

원격 액세스에는 두 가지 중요한 단계가 필요합니다. 첫 번째는 클라이언트를 등록하는 것입니다. 이는 특정 사용자를 특정 차량에서 실행되는 특정 원격 작업 클라이언트에 연결하는 것입니다. 두 번째는 작업을 전달하는 것입니다. 이는 특정 사용자의 원격 작업을 특정 차량에서 실행되는 특정 원격 작업 클라이언트에 전달하는 것입니다.

클라이언트 등록

원격 액세스 기능을 사용하려면 사용자는 원격 작업 클라이언트 앱을 한 번 이상 열고 클라이언트 등록 프로세스(굵게 표시된 텍스트는 AAOS에서 구현한 작업을 나타냄)를 완료해야 합니다.

  1. 부팅 시 자동차 서비스는 원격 액세스 HAL에서 차량 정보를 가져옵니다.

  2. 부팅 시 자동차 서비스는 인텐트 필터와 권한에 기반하여 모든 원격 작업 클라이언트를 실행합니다.

  3. 원격 작업 클라이언트가 시작되면 원격 작업 클라이언트가 자동차 서비스에 자체적으로 등록됩니다.

  4. 자동차 서비스는 원격 작업 클라이언트에 등록 정보(차량 ID, 클라이언트 ID 등)를 알립니다. 클라이언트 ID는 고유하며 자동차 서비스에서 이 클라이언트에 할당합니다. 동일한 차량의 모든 원격 작업 클라이언트 간에 고유함이 보장됩니다.

  5. 사용자는 원격 작업 클라이언트를 통해 원격 작업 서버에 로그인하고 이 차량의 원격 액세스 기능을 사용 설정합니다. 이 단계에는 일반적으로 원격 작업 서버를 통한 인증이 포함됩니다.

  6. 원격 작업 클라이언트는 사용자의 정보와 함께 차량 ID 및 클라이언트 ID를 원격 작업 서버에 업로드하고 이 특정 클라이언트 및 이 특정 차량과 사용자를 연결하도록 요청합니다.

    필요에 따라 이 단계에는 사용자의 2단계 인증이 추가로 포함될 수 있습니다.

    원격 작업 서버는 요청에 제공된 차량 ID가 발신자의 차량 ID와 일치하는지 인증해야 합니다. 이는 차량 증명을 통해 실행될 수 있습니다.

초기화가 실행되지 않는 한 클라이언트 등록 프로세스는 차량별로 사용자당 한 번 필요합니다. 클라이언트 ID는 자동차 서비스에 로컬로 저장되며 동일한 클라이언트의 경우 동일하게 유지됩니다.

이미지

그림 2. 클라이언트 등록

클라이언트 등록 취소

사용자는 차량이나 원격 작업 서버에서 계정의 차량을 연결 해제할 수 있습니다.

  • 차량에서 사용자는 원격 작업 클라이언트 앱을 열고 연결 해제 요청을 실행하여 이전에 연결된 사용자 계정에서 차량을 연결 해제할 수 있습니다.

  • 원격 작업 서버에서 사용자는 계정에 로그인하고 계정에서 이전에 연결된 차량을 연결 해제할 수 있습니다.

사용자가 계정에서 차량을 연결 해제하면 원격 작업 서버는 이 특정 사용자의 저장된 매핑을 삭제해야 합니다.

작업 전달

클라우드에서:

  1. 사용자가 원격 작업 서버를 사용하여 특정 차량으로 원격 작업을 전송합니다.

  2. 원격 작업 서버는 사용자 ID를 차량 ID 및 클라이언트 ID에 매핑하고 작업 데이터와 차량 ID, 클라이언트 ID를 wake-up 서버로 전송합니다.

  3. wake-up 서버는 차량 ID의 특정 TCU를 찾아(TCU 등록은 이미 완료된 것으로 가정) 작업 데이터와 클라이언트 ID를 TCU에 전송합니다.

차량에서(굵은 텍스트는 AAOS에서 실행된 작업을 나타냄):

  1. TCU가 원격 서버에서 원격 작업을 수신합니다.

  2. AAOS를 실행하는 앱 프로세서(AP)가 꺼져 있는 경우 TCU는 차량 프로세서(VP)를 사용하여 AP의 절전 모드를 해제합니다.

  3. 자동차 서비스가 TCU에서 작업을 수신합니다.

  4. 자동차 서비스는 작업을 해당 원격 작업 클라이언트에 배포합니다.

  5. 원격 작업 클라이언트가 작업을 수신하고 실행합니다.

    (선택사항) 원격 작업 클라이언트는 작업 서버에 접속하여 작업 세부정보를 확인하고 작업을 실행합니다.

  6. (선택사항) 원격 작업 클라이언트 서비스가 작업 결과를 작업 서버에 보고합니다.

  7. 원격 작업 클라이언트는 작업이 완료되면 자동차 서비스에 알립니다.

  8. 필요한 경우 자동차 서비스는 차량의 전원 상태를 복원합니다.

이미지

그림 3. 작업 전달

원격 작업 클라이언트 작성

CarRemoteAccessManager는 원격 작업 기능을 위한 API를 제공합니다. 자세한 내용은 CarRemoteAccessManager를 참고하세요. 원격 작업 클라이언트는 원격 작업을 실행하고 CarRemoteAccessManager를 사용하는 Android 서비스로, PERMISSION_USE_REMOTE_ACCESSPERMISSION_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>

원격 작업 클라이언트는 다음과 같이 생성 중에 자동차 서비스에 자체적으로 등록해야 합니다.

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);
    }
}

null을 반환하도록 onBind 함수를 재정의해야 합니다.

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

자동차 서비스는 수명 주기를 관리하며 시작하는 동안 그리고 원격 작업이 도착할 때 이 서비스에 바인딩됩니다. 자동차 서비스는 작업이 완료될 때 이 서비스에서 바이딩 해제됩니다. 자세한 내용은 서비스의 수명 주기 관리를 참고하세요.

원격 작업 클라이언트는 시스템 사용자로 실행되므로 사용자별 데이터에 액세스할 수 없습니다.

다음 예는 등록된 콜백을 처리하는 방법을 보여줍니다.

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
}

또는 userdebug/eng 빌드에서 다음 adb 명령어를 사용하세요.

adb shell cmd car_service enable-feature car_remote_access_service

Android 요구사항

원격 액세스 HAL

원격 액세스 하드웨어 추상화 계층(HAL)은 AAOS와 다른 ECU(예: TCU) 간 통신을 위해 공급업체에서 구현한 추상화 계층입니다. 원격 액세스 기능 지원을 위해 필수입니다. 원격 액세스 기능이 구현되지 않은 경우 구현하지 않아도 됩니다.

인터페이스는 IRemoteAccess.aidl에 정의되어 있으며 다음 메서드를 포함합니다.

클래스 설명
String getVehicleId() wake-up 서버에서 인식할 수 있는 고유한 차량 ID를 가져옵니다.
String getWakeupServiceName() 원격 wake-up 서버의 이름을 가져옵니다.
String getProcessorId() 클라이언트의 절전 모드를 해제하여 인식할 수 있는 고유한 프로세서 ID를 가져옵니다.
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 기기가 디스플레이와 오디오가 꺼진 상태에서 부팅됩니다.

무음 모드는 Linux 커널 sysfs 파일 두 개를 통해 제어됩니다.

클래스 설명
/sys/kernel/silent_boot/pm_silentmode_kernel_state

현재 무음 모드를 나타냅니다.

/sys/kernel/silent_boot/pm_silentmode_hw_state

새 무음 모드를 설정하는 하드웨어 신호를 나타냅니다.

차량 프로세서는 HW 신호를 Android SoC에 보내 무음 모드를 켜거나 끕니다. 신호(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는 원격 메시지를 항상 수신할 수 있습니다.

wake-up 클라이언트는 TCU에서 실행되어 원격 wake-up 서버와의 장기간 연결을 보장합니다.

AP에서 실행되는 AAOS는 원격 액세스 HAL을 통해 TCU에서 실행되는 wake-up 클라이언트와 통신할 수 있습니다.

이미지

그림 4. TCU(wake-up 클라이언트)

클라우드 내 구성요소

Wake-up 서버

wake-up 서버는 TCU의 wake-up 클라이언트와 통신하여 다음 작업을 실행합니다.

  • 차량의 TCU와 장기간 연결을 유지합니다.
  • 차량 ID에 기반하여 특정 TCU를 찾습니다.
  • 차량의 상태를 보고합니다. 예를 들어 온라인 상태인지 오프라인 상태인지 또는 원격 작업 서버의 마지막 온라인 시간 등입니다.

실제 구현에서 wake-up 서버는 원격 작업 서버와 병합될 수 있습니다.

원격 작업 서버

원격 작업 서버는 다음과 같은 원격 작업을 관리합니다.

  • 사용자가 서버와 상호작용하여 새 원격 작업을 시작하고 원격 작업을 모니터링합니다.

  • 원격 wake-up 서버를 사용하여 차량 내 앱 프로세서의 절전 모드를 해제합니다.

  • 차량에서 실행되는 원격 작업 클라이언트와 상호작용합니다.

  • 클라이언트 등록 정보를 저장합니다. 이를 통해 특정 사용자가 특정 차량의 특정 원격 작업 클라이언트에 연결됩니다.

일반적으로 원격 작업 서버를 통해 wake-up 서버와 차량의 TCU 그리고 최종적으로 원격 작업 클라이언트로 전송되는 작업 데이터는 단순한 작업 ID입니다. 원격 작업 클라이언트는 이 작업 ID를 사용하여 원격 작업 서버에서 자세한 정보를 가져옵니다.

개인 정보 보호 및 보안 요구사항

작업 조건 요구사항
TCU(wake-up 클라이언트) 필수(MUST)
  • wake-up 서버를 인증합니다.
  • 코드를 신뢰합니다.
Wake-up 서버 필수(MUST)
  • 허용 목록에 추가된 원격 작업 서버만 연결하도록 허용합니다.
  • wake-up 클라이언트를 인증합니다.
  • 타겟 차량에 wake-up 메시지를 전송합니다.
원격 작업 클라이언트 필수(MUST)
  • 등록 중에 사용자를 인증합니다.
  • 원격 작업 서버를 인증합니다.
  • Android 서비스의 모든 보안 요구사항을 충족합니다. 제한된 권한을 예로 들 수 있습니다.
원격 작업 서버 필수(MUST)
  • wake-up 서버를 인증해야 합니다.
  • 차량 증명을 제공합니다. 즉, 요청에 제공된 차량 ID가 발신자의 차량 ID와 일치하는지 인증합니다. 차량 증명이 불가능하면 다른 방법을 사용하여 현재 사용자가 차량을 소유하는지 확인해야 합니다.
  • 사용자의 신원을 인증합니다.
  • 사용자 정보를 처리하는 서버의 모든 보안 요구사항을 충족합니다.

초기화 및 소유권 이전

사용자가 초기화를 실행하면 자동차 서비스에 저장된 클라이언트 ID가 완전 삭제됩니다. 하지만 서버(원격 작업 서버 및 원격 wakeup 서버)는 알지 못합니다. 서버는 현재 만료된 클라이언트 ID의 매핑을 차량에 유지합니다. 따라서 사용자가 차량의 새 원격 작업을 시작하면 만료된 클라이언트 ID가 사용됩니다. 차량의 절전 모드는 해제되지만 원격 작업을 실행할 수는 없습니다. 원격 작업 클라이언트에 일치하지 않는 다른 클라이언트 ID가 있기 때문입니다.

다음은 가능한 초기화 구현 한 가지를 설명합니다.

사용자가 초기화를 실행하면 공급업체는 사용자에게 원격 작업 서버에 로그인하고 사용자가 이전에 차량을 연결한 경우 계정에서 차량을 연결 해제하라는 메시지를 표시합니다. 초기화 중에는 기기의 네트워크 액세스가 보장되지 않습니다. 따라서 초기화 중에 기기에서 연결 해체 요청을 실행하는 것이 불가능할 수 있습니다.

차량의 소유권이 이전될 때마다 이전 소유자가 더 이상 차량에 원격 작업을 실행할 수 없도록 일부 작업을 실행해야 합니다. 예를 들어 새로운 소유자는 다음 작업을 요청받을 수 있습니다.

  • 초기화를 실행합니다. 이렇게 하면 클라이언트 ID가 재생성됩니다. 이 단계 후 이전 소유자는 여전히 차량의 절전 모드를 해제할 수 있지만 더 이상 원격 작업을 실행할 수는 없습니다.

  • 원격 작업 클라이언트 앱을 열고 클라이언트 등록 취소 프로세스에 따라 차량을 이전 소유자의 계정에서 연결 해제합니다. 새 소유자는 클라이언트 등록 프로세스에 따라 차량을 자기 계정에 연결하고 이전에 연결된 계정을 교체할 수 있습니다.

  • 새 소유자는 클라이언트 등록 프로세스를 사용하여 차량을 자기 계정에 연결하고 이전에 연결된 계정을 대체할 수 있습니다.

원격 작업 클라이언트 테스트

Google에서는 원격 작업 클라이언트를 테스트하기 위해 참조 원격 액세스 HAL default 디렉터리를 제공합니다. 다음 debug 명령어를 사용하여 가짜 원격 작업을 HAL에 삽입할 수 있습니다. 이는 올바른 클라이언트 ID가 제공된 경우 원격 작업 클라이언트에 전달됩니다. 원격 작업 클라이언트 구현에서 등록 정보를 로깅하여 클라이언트 ID를 가져올 수 있습니다.

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