android系统判别系统app是根据
ApplicationInfo.FLAG_SYSTEM标签的则是系统app,反之则是普通app.(flags & PARSE_IS_SYSTEM)!= 0,如果有
在android系统中获取system权限的有两种形式:
1,通过Uid区别:
在PackageManagerService构造函数中,分配了系统权限给以下Uid:
android.uid.system
android.uid.phone
android.uid.log
android.uid.nfc
android.uid.bluetooth
android.uid.shell
mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.log", LOG_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.nfc", NFC_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.bluetooth", BLUETOOTH_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
2.在app安装的时候,根据app的安装路径来分配系统权限
如下面的/system/priv-app/目录,扫描的时候添加了PackageParser.PARSE_IS_SYSTEM标志,
// Collected privileged system packages.
final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");
scanDirLI2(privilegedAppDir, mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR
| PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);
“指定目录”包括
/vendor/overlay,
/system/framework,
/system/priv-app,
/system/app,
/vendor/app,
/oem/app。
解析这两类apk的时候,用到了
PARSE_IS_SYSTEM标志位。