2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

株式会社ACCESSAdvent Calendar 2024

Day 6

Android Automotive OS で動作する特権アプリ (Privileged App) の開発方法

Posted at

はじめに

Android Automotive OS(以下、AAOSと略す)のアプリ開発において、車両データ(例:エアコンの状態)を利用したいと考えるのは自然な発想だろう。しかし、AAOSでは車両データへのアクセスが厳密に管理されており、単なる読み込みであっても特別な権限が必要である。

特権アプリ(privileged app)は、このような高い権限を持つアプリであり、車両システムと直接連携するために特別に認可されている。AAOS向けのデモ開発では、通常のアプリでは実現できない機能を特権アプリで実装したいケースがある。残念ながら特権アプリの開発方法を具体的に示す記事は少ないため、その特権アプリの開発方法について確認した。

特権アプリの開発方法

  1. AAOSのビルド環境の用意
  2. ソースコードの複製
  3. Android.bpの作成
  4. ビルド対象にアプリを追加
  5. パーミッション設定ファイルの作成
  6. パーミッション設定ファイルの登録

特権について

車両データへのアクセスに必要な特権はオフィシャルページで確認することができる。例えばエアコンの設定温度(HVAC_TEMPERATURE_SET)を確認するためには CONTROL_CAR_CLIMATE という特権が必要となる。

https://developer.android.com/reference/android/car/VehiclePropertyIds
HVAC_TEMPERATURE_SET
...
Required Permission:
Signature|Privileged permission "android.car.permission.CONTROL_CAR_CLIMATE" to read and write property.

特権には下記のような種類がある

特権の一部
android.car.permission.ADJUST_RANGE_REMAINING
android.car.permission.CAR_EXTERIOR_LIGHTS
android.car.permission.CAR_IDENTIFICATION
android.car.permission.CAR_MILEAGE
android.car.permission.CAR_TIRES
android.car.permission.CONTROL_CAR_CLIMATE
android.car.permission.CONTROL_CAR_SEATS
android.car.permission.CONTROL_CAR_MIRRORS
android.car.permission.CONTROL_CAR_EXTERIOR_LIGHTS
android.car.permission.READ_CAR_STEERING
android.car.permission.READ_CAR_INTERIOR_LIGHTS
...

下記のソースコードからも確認できる

AAOSのビルド環境の用意

特権アプリはAndroid Studioではなく、AAOSのビルド環境で構築する。
ここでは Google Pixel Tablet向けのビルド環境を用いて確認を進める。

ソースコードの用意

調査に利用した特権アプリのサンプルソースコード

ソースコードの複製

開発した特権アプリのソースコードをAAOSのビルド環境にコピーする。
Android StudioでPrivilegedSampleAppというプロジェクト名でアプリ開発を行った場合は次の通りに進めれば良い。

AAOSのビルド環境にソースコードを保存するディレクトリを用意する

mkdir ~/aaos_on_pixel/packages/apps/Car/PrivilegedSampleApp

特権アプリのソースコードをコピーする

cp -R ~/AndroidStudioProjects/PrivilegedSampleApp/automotive/src/main/*  ~/aaos_on_pixel/packages/apps/Car/PrivilegedSampleApp
Macで開発してLinux側にコピーする場合
cd ~/AndroidStudioProjects/PrivilegedSampleApp/automotive/src/main/ && \
tar -cf  - ./* | \
ssh <UserID>@<IP ADDRESS> \
"cd ~/aaos_on_pixel/packages/apps/Car/PrivilegedSampleApp && tar -xf -"

ソースコードのディレクトリ名を変更

cd ~/aaos_on_pixel/packages/apps/Car/PrivilegedSampleApp
mv java src

Android.bpの作成

AAOSは Soong を用いてビルドするため build.gradle.kts の代わりとなる Android.bp ファイルを作成する。
Android.bp ファイルの作成は ~/aaos_on_pixel/packages/apps/Car/ 以下にあるプリインアプリ用の Android.bp などが参考になるだろう。

cd ~/aaos_on_pixel/packages/apps/Car/PrivilegedSampleApp
vi Android.bp
Android.bp
package {
    default_applicable_licenses: ["Android-Apache-2.0"],
}

android_app {
    name: "PrivilegedSampleApp",

    srcs: [
        "src/**/*.java",
        "src/**/*.kt",
        "src/**/I*.aidl",
    ],
    aidl: {
        local_include_dirs: ["src"],
    },

    platform_apis: true,

    required: ["allowed_privapp_com.example.privilegedsampleapp"],

    certificate: "platform",

    privileged: true,

    libs: ["android.car-system-stubs"],

    static_libs: [
        "androidx.lifecycle_lifecycle-livedata",
        "androidx-constraintlayout_constraintlayout",
        "androidx.room_room-runtime",
        "car-apps-common",
        "car-media-common",
        "car-broadcastradio-support",
        "car-ui-lib",
    ],

    plugins: ["androidx.room_room-compiler-plugin"],

    resource_dirs: ["res"],

    optimize: {
        enabled: false,
    },

    dex_preopt: {
        enabled: false,
    },
}

ビルド対象にアプリを追加

次の2つのファイルの PRODUCT_PACKAGES 変数に PrivilegedSampleApp を追加して、開発したアプリをAAOSのビルド対象に加える

  • car_system.mk
  • car.mk
vi ~/aaos_on_pixel/packages/services/Car/car_product/build/car_system.mk
~/aaos_on_pixel/packages/services/Car/car_product/build/car_system.mk
PRODUCT_PACKAGES += \
    CarFrameworkPackageStubs \
    CarService \
    CarShell \
    CarDialerApp \
    CarRadioApp \
    OverviewApp \
    CarLauncher \
    LocalMediaPlayer \
    CarMediaApp \
    CarMessengerApp \
    CarHTMLViewer \
    CarMapsPlaceholder \
    CarLatinIME \
    CarSettings \
    CarUsbHandler \
    android.car.builtin \
    libcarservicehelperjni \
    car-frameworks-service \
    com.android.car.procfsinspector \
    com.android.permission \
    PrivilegedSampleApp \
vi ~/aaos_on_pixel/packages/services/Car/car_product/build/car.mk
~/aaos_on_pixel/packages/services/Car/car_product/build/car.mk
# Automotive specific packages
PRODUCT_PACKAGES += \
    CarFrameworkPackageStubs \
    CarService \
    CarShell \
    CarDialerApp \
    CarRadioApp \
    OverviewApp \
    CarLauncher \
    CarSystemUI \
    LocalMediaPlayer \
    CarMediaApp \
    CarMessengerApp \
    CarHTMLViewer \
    CarMapsPlaceholder \
    CarLatinIME \
    CarSettings \
    CarUsbHandler \
    RotaryIME \
    RotaryPlayground \
    android.car.builtin \
    car-frameworks-service \
    libcarservicehelperjni \
    com.android.car.procfsinspector \
    com.android.permission \
    PrivilegedSampleApp\

パーミッション設定ファイルの作成

PrivilegedSampleApp 用のパーミッション設定ファイルを作成する

cd ~/aaos_on_pixel/packages/services/Car/data/etc/
vi com.example.privilegedsampleapp.xml

開発したアプリの AndroidManifest.xml で指定した車載データにアクセスするための特権をパーミッション設定ファイルにも記載する。
今回は android.car.permission.CONTROL_CAR_CLIMAT を指定する。

com.example.privilegedsampleapp.xml
<permissions>
<privapp-permissions package="com.example.privilegedsampleapp">
<permission name="android.car.permission.CONTROL_CAR_CLIMAT"/>
</privapp-permissions>
</permissions>

パーミッション設定ファイルの登録

作成したパーミッション設定ファイル情報を Android.bp へ追記する。

cd ~/aaos_on_pixel/packages/services/Car/data/etc/
vi Android.bp
~/aaos_on_pixel/packages/services/Car/data/etc/Android.bp
prebuilt_etc {
    name: "allowed_privapp_com.example.privilegedsampleapp",
    sub_dir: "permissions",
    src: "com.example.privilegedsampleapp.xml",
    filename_from_src: true,
}

特権アプリのビルド

新規追加したアプリごとAAOSをビルドする。AAOSを一度ビルドしていた場合は、新規追加したアプリだけ差分ビルドされる。

#AOSPのビルド
. build/envsetup.sh
lunch aosp_tangorpro_car-ap1a-userdebug
m
#Automotive関連のパッケージをビルド
m android.hardware.automotive.vehicle@2.0-default-service android.hardware.automotive.audiocontrol-service.example 

ビルドしたイメージを書き込む

デバイスのロックを外す

adb reboot bootloader
fastboot flashing unlock

ビルドしたイメージを書き込む

fastboot -w flashall

Automotive 固有のファイルを追加する

ビルドしたイメージの書き込みが終了し、デバイスが再起動する(起動画面のアニメーションが始まる)まで待ち、Automotive 固有のファイルを追加するための前処理を実行する

#Temporary disable the userdata checkpoint 
adb wait-for-device root; sleep 3; adb shell vdc checkpoint commitChanges; sleep 2 
#Enable remount
adb remount && sleep 2 && adb reboot && echo "rebooting the device" && adb wait-for-device root && sleep 5 && adb remount

再起動するまで待ち、Automotive 固有のファイルをデバイスにコピーする

adb sync vendor && adb reboot

動作確認

  1. numberPickerで選択した数値が右側のエアコンの設定温度に反映された
  2. 右側のエアコンの設定温度を変更するとnumberPickerのvalue値に反映された

特権アプリAAOSの温度を変更.gif

参考情報

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?