Android protectionLevel

1,199 阅读1分钟

protectionLevel

<permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | ...] />

Android protectionLevel分4个级别:
"normal"
"dangerous"
"signature"
"signatureOrSystem"
如果定义的是前面两种normal或者dangerous, 我们自己的应用需要去访问其对应受保护的资源时只需要在androidManifest.xml中添加相同的uses-permission就行了。 如果是signature, 我们仅仅添加对权限的使用还不行, 必须同时具有相同的签名。 如果是signatureOrSystem(这种权限的应用第三方的应用无法单独访问), 不仅要有相同的签名,而且签名必须是系统签名,此外可能还需要android:sharedUserId="android.uid.system"

特权app

特权app首先必须是System app。也就是说 System app分为普通的system app和特权的system app。
System app = 普通的system app + 特权app
直观的(但不准确严谨)说,普通的system app就是/system/app目录中的app,特权的system app就是/system/priv-app目录中的app。
BTW: priv-app 是privileged app的简写。
区分普通system app和特权app的目的是澄清这个概念:"signatureOrSystem"权限中的System不是为普通system app提供的,而是只有特权app能够使用。

进一步说,android:protectionLevel="signatureOrSystem"中的System和android:protectionLevel="signature|privileged"中的privileged的含义是一样的。
可以从PermissionInfo.java中的fixProtectionLevel()看出来:
// PermissionInfo.java
public static int fixProtectionLevel(int level) {
    if (level == PROTECTION_SIGNATURE_OR_SYSTEM) {
        // "signatureOrSystem"权限转换成了"signature|privileged"权限
        level = PROTECTION_SIGNATURE | PROTECTION_FLAG_PRIVILEGED;
    }
    return level;
}
所以,当我们说起system app时,通常指的是前面提到的特定uid和特定目录中的app,包含了普通的system app和特权app。
当我们说起有访问System权限或者privileged权限的app时,通常指特权app。


## 系统权限
所有系统的权限的定义是在`/frameworks/base/core/res/AndroidManifest.xml中

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="android" coreApp="true" android:sharedUserId="android.uid.system"

android:sharedUserLabel="@string/android_system_label">

...