Android Automotive 自定义权限

1,149 阅读4分钟

版权声明

凡未经作者授权,任何媒体、网站及个人不得转载、复制、重制、改动、展示或使用局部或全部的内容或服务。如果已转载,请自行删除。同时,我们保留进一步追究相关行为主体的法律责任的权利。

© 2024 小酥肉不加辣,All rights reserved.

在《Android Automotive 自定义 Property》的最后提到

虽然使用这个方法可以自定义 Vehicle Property,也可以在模拟器中读取和设置属性。但是当我们在应用层调用 CarPropertyManagergetIntPropertysetIntProperty 方法时还是会抛出 property id 不存在的异常。

这篇文章将详细讲述如何在 CarService 层添加自定义权限。

本文基于 AOSP android13-release 分支代码进行修改。

第一步 添加自定义权限的定义

  • packages/services/Car/car-lib/src/android/car/Car.java
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index 12955ee..c094d54 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -1139,6 +1139,13 @@ public final class Car {
    public static final String PERMISSION_MANAGE_THREAD_PRIORITY = "android.car.permission.MANAGE_THREAD_PRIORITY";  
+    /**
+     * Custom Permission.
+     * @hide
+     */
+    @AddedInOrBefore(majorVersion = 33)
+    public static final String PERMISSION_CAR_CUSTOM =
+    "android.car.permission.CAR_CUSTOM";

第二步 为添加的自定义属性添加读写权限

  • packages/services/Car/car-lib/src/android/car/VehiclePropertyIds.java
diff --git a/car-lib/src/android/car/VehiclePropertyIds.java b/car-lib/src/android/car/VehiclePropertyIds.java
index 1531ff1..f8966f5 100644
--- a/car-lib/src/android/car/VehiclePropertyIds.java
+++ b/car-lib/src/android/car/VehiclePropertyIds.java
@@ -2229,6 +2229,15 @@ public final class VehiclePropertyIds {
    @AddedInOrBefore(majorVersion = 33)
    public static final int VEHICLE_CURB_WEIGHT = 289410886;  
    
+    @RequiresPermission(Car.PERMISSION_CAR_CUSTOM)
+    @AddedInOrBefore(majorVersion = 33)
     public static final int VEHICLE_TEST_PROPERTY = 289410896; 
  • packages/services/Car/car-lib/src/com/android/car/internal/PropertyPermissionMapping.java
@@ -34,6 +34,9 @@ public final class PropertyPermissionMapping {
    public PropertyPermissionMapping() {
        // Add propertyId and read/write permissions
        // Cabin Properties
+       map(Car.PERMISSION_CAR_CUSTOM, VehiclePropertyIds.VEHICLE_TEST_PROPERTY);  
  • packages/services/Car/service/src/com/android/car/hal/PropertyHalServiceIds.java
--- a/service/src/com/android/car/hal/PropertyHalServiceIds.java
+++ b/service/src/com/android/car/hal/PropertyHalServiceIds.java
@@ -184,6 +184,12 @@ public class PropertyHalServiceIds {
        mPropToValidBitFlag = new HashMap<>();         
        // Add propertyId and read/write permissions         
        // Cabin Properties
+       mProps.put(VehicleProperty.VEHICLE_TEST_PROPERTY, new Pair<>(
+           Car.PERMISSION_CAR_CUSTOM,
+           Car.PERMISSION_CAR_CUSTOM));

第三步 在 service 的 manifest 文件中定义权限

  • packages/services/Car/service/AndroidManifest.xml
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index 1752eab..fe48906 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -915,6 +915,11@@

     android:label="@string/car_permission_label_manage_thread_priority"
     android:description="@string/car_permission_desc_manage_thread_priority"/>

+    <permission android:name="android.car.permission.CAR_CUSTOM"
+         android:protectionLevel="signature|privileged"
+         android:label="@string/car_permission_label_custom"
+         android:description="@string/car_permission_desc_custom"/>
+

第四步 编译 CarService

回到根目录 mmm packages/services/Car/
这个时候编译会报错,需要执行以下命令生成新的 API 签名

  • m android.car-stubs-docs-update-current-api
  • m android.car-system-stubs-docs-update-current-api
  • m android.car-test-stubs-docs-update-current-api

执行之后会在 current.txt 文件中新增内容(不需要手动修改)

diff --git a/car-lib-module/api/current.txt b/car-lib-module/api/current.txt
index 05464e4..c39a981 100644
--- a/car-lib-module/api/current.txt
+++ b/car-lib-module/api/current.txt
@@ -329,6 +329,8 @@ package android.car {
    field @RequiresPermission.Read(@androidx.annotation.RequiresPermission(android.car.Car.PERMISSION_ENERGY))
    
    public static final int EV_REGENERATIVE_BRAKING_STATE = 289410884;
    // 0x11400f44
    field @RequiresPermission("android.car.permission.CAR_EXTERIOR_LIGHTS")
    public static final int FOG_LIGHTS_STATE = 289410562;
    // 0x11400e02
    field @RequiresPermission("android.car.permission.CONTROL_CAR_EXTERIOR_LIGHTS") 
    public static final int FOG_LIGHTS_SWITCH = 289410578;
    // 0x11400F50
+   field @RequiresPermission("android.car.permission.CAR_CUSTOM")
    public static final int VEHICLE_TEST_PROPERTY = 289410896;
    // 0x11200f48
    field @RequiresPermission("android.car.permission.CAR_EXTERIOR_LIGHTS")
    public static final int FRONT_FOG_LIGHTS_STATE = 289410875;
    // 0x11400f3b
    field @RequiresPermission("android.car.permission.CONTROL_CAR_EXTERIOR_LIGHTS")
    public static final int FRONT_FOG_LIGHTS_SWITCH = 289410876;
    // 0x11400f3c  
diff --git a/car-lib/api/current.txt b/car-lib/api/current.txt
index 05464e4..c39a981 100644
--- a/car-lib/api/current.txt
+++ b/car-lib/api/current.txt
@@ -329,6 +329,8 @@ package android.car {
  field @RequiresPermission.Read(@androidx.annotation.RequiresPermission(android.car.Car.PERMISSION_ENERGY)) public static final int EV_REGENERATIVE_BRAKING_STATE = 289410884;
  // 0x11400f44
  field @RequiresPermission("android.car.permission.CAR_EXTERIOR_LIGHTS") public static  final int FOG_LIGHTS_STATE = 289410562;
  // 0x11400e02
  field @RequiresPermission("android.car.permission.CONTROL_CAR_EXTERIOR_LIGHTS") public  static final int FOG_LIGHTS_SWITCH = 289410578;
  // 0x11400e12
+ field @RequiresPermission("android.car.permission.CAR_CUSTOM") public static final int VEHICLE_TEST_PROPERTY = 289410896; // 0x11400F50

验证

回到项目根目录,使用 m 命令重新编译整个项目。

使用 make emu_img_zip 重新编译模拟器镜像。

编译好的镜像文件在 out/target/product/emulator_car_x86_64/sdk-repo-linux-system-images-eng.$(whoami).zip

将生成的 zip 文件复制出来,解压之后替换本地 SDK 中的镜像 ~/Library/Android/sdk/system-images/android-33/android-automotive/x86_64, 然后把模拟器 wipe data 并重新启动模拟器。

按照《Android Automotive 读写 Vehicle Property》中的方法,调用 CarPropertyManagergetPropertysetProperty 方法验证。