protected-broadcast 系统应用自定义广播规范
一、android:sharedUserId=”android.uid.system”系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加 android:sharedUserId=”android.uid.system”,然后在Android.mk中增加 LOCAL_CERTIFICATE := platform.如Settings,:
下面所说的系统应用也是指这些shareUID是system的应用。在开机PMS初始化的时候,将该name为“android.uid.system”的uid归为1000的system用户ID;PackageManagerService.java
public PackageManagerService(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
...
mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
...
}Process.java
/** * Defines the UID/GID under which system code runs. */
public static final int SYSTEM_UID = 1000;
二、AMS对系统应用发出的广播进行安全检查
当应用或者组件发送广播时,在广播发送的必经之路上,AMS对系统应用发送的广播进行了检查:
1. 判断是否是系统uid,ActivityServiceManager.java
final int broadcastIntentLocked(){
final boolean isCallerSystem;
switch (UserHandle.getAppId(callingUid)) {
//说明是以下几个uid的进程都认为是system应用进程
case Process.ROOT_UID:
case Process.SYSTEM_UID:
case Process.PHONE_UID:
case Process.BLUETOOTH_UID:
case Process.NFC_UID:
isCallerSystem = true;
break;
default:
isCallerSystem = (callerApp != null) && callerApp.persistent;
break;
}
}
这里需要注意的是除了SYSTEM_UID被认为是系统uid,还有ROOT_UID,PHONE_UID,BLUETOOTH_UID,NFC_UID,
需要特别注意的是如果都未定义以上的UID,但应用的AndroidManifest.xml中定义了persistent属性为true,即常驻应用,也会被设定为由系统调用,同样需要进行广播的权限检查。
2. 如果是SYSTEM_UID,便对该广播进行安全检查:if (isCallerSystem) {
checkBroadcastFromSystem(intent, callerApp, callerP