1. @SystemApi 只允许system app 调用或者用反射方法调用, 反射方法例:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
try {
Method method = nfcAdapter.getClass().getMethod("enable");
method.invoke(nfcAdapter);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
需要注意的是非 system app 用反射方法调用SystemApi,即使编译通过, 实际运行是还会遇到permission check. 例如上面的NfcAdapter.enable() 要求 WRITE_SECURE_SETTINGS.这是一个signature permission, 也就是app 必须有系统签名才行, 第三方app 还是不能调用的。
2. permission. install permission 是否被granted, 是在install package时决定的, 相关函数 PermissionManagerService.grantPermissions()。 例如对于signature permission, 调用PermissionManagerService.grantSignaturePermission()处理。
关于permission check, 调用流程:
- ContextImpl.checkPermission(String permission, int pid, int uid) -->
- ActivityManagerService.checkPermission(String permission, int pid, int uid) -->
- ActivityManagerService.checkComponentPermission(String permission, int pid, int uid, int owningUid(-1), boolean exported(true)) --> 如果是系统进程, 那么所有permission 都是允许的
- ActivityManager.checkComponentPermission(permission, uid, owningUid, exported)
-
系统ROOT UID, 允许
-
Uid 本身是该permission Owner, 允许
-
否则-->
- AppGlobals.getPackageManager().checkUidPermission(permission, uid) -->
- PackageManagerService.checkUidPermission() -->
- PermissionManagerService.checkUidPermission()
3. CATEGORY_DEFAULT for implicite intent. 如果不指定, implicite intent 不能找到该activity.