Android系统开发的特权白名单

6,827 阅读3分钟

前言

本文只对Android系统开发人员有用。

特权应用

什么是特权应用?位于系统分区的priv-app目录下的应用就是特权应用。不同的Android版本定义的分区如下

  1. 小于等于Android 8.1的版本,特权分区为/system
  2. 大于等于Android 9的版本,特权分区为/system, /product/vendor

例如,从Android 9开始,/product/priv-app目录下的应用就是特权应用。

系统的特许权限

从Android 8.0开始,特权应用如果使用系统的特许权限,那么需要把这个特许权限加入到白名单中。

那么什么是系统的特许权限? 系统的特许权限必须在frameworks/base/core/res/AndroidManifest.xml定义,并且等级为signature|privileged

<permission
    android:name="com.permission.test"
    android:protectionLevel="signature|privileged" />

白名单文件

刚才说到,如果一个特权应用使用了系统的特许权限,那么我们要把这个特许权限加入到白名单中。

那么这个白名单文件在哪呢?如果特权应用在/vendor分区,那么白名单文件就必须在/vendor/etc/permissions/目录下。

那么这些白名单文件来自哪里呢?一般是来自frameworks/base/data/etc/目录,也有的是来自应用,这些应用通过Android.mkAndroid.bp把白名单文件编译到指定目录。

这里以frameworks/base/data/etc/目录为例,在我的项目中有如下文件

Android.bp
com.android.carrierconfig.xml
com.android.contacts.xml
com.android.dialer.xml
com.android.documentsui.xml
com.android.emergency.xml
com.android.launcher3.xml
com.android.provision.xml
com.android.settings.intelligence.xml
com.android.settings.xml
com.android.storagemanager.xml
com.android.systemui.xml
com.android.timezone.updater.xml
framework-sysconfig.xml
hiddenapi-package-whitelist.xml
platform.xml
privapp-permissions-platform.xml

特权应用如果使用了系统特许权限,一般会把白名单添加到privapp-permissions-platform.xml文件中。当然也可以单独建立一个文件,例如com.android.systemui.xml就是SystemUI的特权白名单文件。

那么这些白名单文件如何编译到系统分区呢,这是由frameworks/base/data/etc/Android.bp决定的,部分代码如下

prebuilt_etc {
    // 配置文件的别名
    name: "privapp-permissions-platform.xml",
    // 配置文件的目录
    sub_dir: "permissions",
    // 源配置文件名
    src: "privapp-permissions-platform.xml",
}

prebuilt_etc {
    name: "privapp_whitelist_com.android.carrierconfig",
    // 配置文件添加到product分区
    product_specific: true,
    sub_dir: "permissions",
    src: "com.android.carrierconfig.xml",
    filename_from_src: true,
}

第一个prebuilt_etc模块是把privapp-permissions-platform.xml默认编译到/system分区下的/system/etc/permissions目录下。

第一个prebuilt_etc模块,由于定义了product_specific: true,所以把配置文件编译到/product分区。

如果想把配置文件编译到 vendor 区, 添加 proprietary: true 即可。

为特权应用添加白名单

假如现在我在frameworks/base/core/res/AndroidManifest.xml中定义了如下一个特权

<permission
    android:name="com.permission.test"
    android:protectionLevel="signature|privileged" />

然后在SettingsProviderAndroidManifest.xml中使用了这个权限

<uses-permission android:name="com.permission.test" />

由于SettingsProvider属于特权App,并且使用了系统的特许权限,那么就要为SettingsProvider添加这个特权白名单。

你可以参照特权白名单文件,为应用添加白名单内容,这需要手动操作。但是如果你已经把源码编译过,那么可以通过执行development/tools/privapp_permissions/privapp_permissions.py这个脚本看到你需要配置的信息,例如对于上面例子,会显示如下信息

<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <privapp-permissions package="com.android.providers.settings">
        <permission name="com.permission.test"/>
    </privapp-permissions>
</permissions>

这就是白名单内容,我们可以把这个内容放到frameworks/base/data/etc/privapp-permissions-platform.xml,也可以单独生成一个文件,名为com.android.providers.settings.xml

如果是生成单独一个文件 ,那么还需要在Android.bp中进行编译配置,例如

prebuilt_etc {
    name: "com.awesome.test",
    system_ext_specific: true,
    sub_dir: "permissions",
    src: "com.transsion.userprotocol.xml",
    filename_from_src: true,
}

并且还要加入编译选项中,例如

PRODUCT_PACKAGES += com.awesome.test