前言
本文只对Android系统开发人员有用。
特权应用
什么是特权应用?位于系统分区的
priv-app
目录下的应用就是特权应用。不同的Android版本定义的分区如下
- 小于等于Android 8.1的版本,特权分区为
/system
。
- 大于等于Android 9的版本,特权分区为
/system
,
/product
和
/vendor
。
例如,从Android 9开始,
/product/priv-app
目录下的应用就是特权应用。
系统的特许权限
从Android 8.0开始,特权应用如果使用系统的特许权限,那么需要把这个特许权限加入到白名单中。
那么什么是系统的特许权限? 系统的特许权限必须在
frameworks/base/core/res/AndroidManifest.xml
定义,并且等级为
signature|privileged
[code]<permissionandroid:name=\"com.permission.test\"android:protectionLevel=\"signature|privileged\" />
白名单文件
刚才说到,如果一个特权应用使用了系统的特许权限,那么我们要把这个特许权限加入到白名单中。
那么这个白名单文件在哪呢?如果特权应用在
/vendor
分区,那么白名单文件就必须在
/vendor/etc/permissions/
目录下。
那么这些白名单文件来自哪里呢?一般是来自
frameworks/base/data/etc/
目录,也有的是来自应用,这些应用通过
Android.mk
或
Android.bp
把白名单文件编译到指定目录。
这里以
frameworks/base/data/etc/
目录为例,在我的项目中有如下文件
[code]Android.bpcom.android.carrierconfig.xmlcom.android.contacts.xmlcom.android.dialer.xmlcom.android.documentsui.xmlcom.android.emergency.xmlcom.android.launcher3.xmlcom.android.provision.xmlcom.android.settings.intelligence.xmlcom.android.settings.xmlcom.android.storagemanager.xmlcom.android.systemui.xmlcom.android.timezone.updater.xmlframework-sysconfig.xmlhiddenapi-package-whitelist.xmlplatform.xmlprivapp-permissions-platform.xml
特权应用如果使用了系统特许权限,一般会把白名单添加到
privapp-permissions-platform.xml
文件中。当然也可以单独建立一个文件,例如
com.android.systemui.xml
就是
SystemUI
的特权白名单文件。
那么这些白名单文件如何编译到系统分区呢,这是由
frameworks/base/data/etc/Android.bp
决定的,部分代码如下
[code]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
分区。
由于我对Android.bp语法缺乏了解,暂时不知道如何把配置文件编译到vendor分区,如果有知道的朋友可以告诉我。
为特权应用添加白名单
假如现在我在
frameworks/base/core/res/AndroidManifest.xml
中定义了如下一个特权
[code]<permissionandroid:name=\"com.permission.test\"android:protectionLevel=\"signature|privileged\" />
然后在
SettingsProvider
的
AndroidManifest.xml
中使用了这个权限
[code]<uses-permission android:name=\"com.permission.test\" />
你可以参照特权白名单文件,为应用添加白名单内容,这需要手动操作。但是如果你已经把源码编译过,那么可以通过执行
development/tools/privapp_permissions/privapp_permissions.py
这个脚本看到你需要配置的信息,例如对于上面例子,会显示如下信息
[code]<?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
中进行编译配置。