Android: создайте новое системное разрешение через исходный код AOSP.

Мне было интересно, как можно редактировать исходный код ОС Android, чтобы навязать новое разрешение. Например, если у нас есть разрешение BLUETOOTH, если устройство предлагает новый датчик, то как можно создать соответствующее разрешение, чтобы приложения могли использовать новый датчик на уровне приложения, используя манифестную запись для нового разрешения, доступного для android rom.

Кто-нибудь знает, как создаются новые разрешения на уровне ОС в исходном коде AOSP?

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

Любые идеи, мысли высоко ценятся.

Ответ 1

В рамках /base/data/etc/platform.xml

Вы можете определить свое вновь созданное разрешение с помощью соответствующего gid.

<permissions>

    <!-- ================================================================== -->
    <!-- ================================================================== -->
    <!-- ================================================================== -->

    <!-- The following tags are associating low-level group IDs with
         permission names.  By specifying such a mapping, you are saying
         that any application process granted the given permission will
         also be running with the given group ID attached to its process,
         so it can perform any filesystem (read, write, execute) operations
         allowed for that group. -->

    <permission name="android.permission.BLUETOOTH_ADMIN" >
        <group gid="net_bt_admin" />
    </permission>

    <permission name="android.permission.BLUETOOTH" >
        <group gid="net_bt" />
    </permission>

    <permission name="android.permission.BLUETOOTH_STACK" >
        <group gid="net_bt_stack" />
    </permission>

    <permission name="android.permission.NET_TUNNELING" >
        <group gid="vpn" />
    </permission>

    <permission name="android.permission.INTERNET" >
        <group gid="inet" />
    </permission>

    <permission name="android.permission.CAMERA" >
        <group gid="camera" />
    </permission>

    <permission name="android.permission.READ_LOGS" >
        <group gid="log" />
    </permission>

    ...
</permission>

Другие определения разрешений не указаны в вышеуказанном файле, поскольку на Android есть фактически два вида разрешений, как показано на следующем рисунке. В этом файле определяются только разрешения, выполняемые ядром Linux.

Permission Enforcement in Android

Другие разрешения, такие как ACCESS_FINE_LOCATION, READ_CONTACTS и т.д., определяются в AndroidManifest.xml в системных приложениях (пакеты/.../AndroidManifest.xml) и framework (frameworks/base/core/res/AndroidManifest.xml).

После добавления вашего разрешения и связанного с ним кода компилируйте и создайте проект в соответствии с Инструкция по строительству