现象:如果第三方应用没有系统权限,如果想在系统中拉起第三方应用的服务,想要实现该功能只能在AMS中过滤掉
代码路径:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
在ActivityManagerService.java文件中appServicesRestrictedInBackgroundLocked()方法中可以过滤该应用,允许系统拉起该应用的方法
int appServicesRestrictedInBackgroundLocked(int uid, String packageName, int packageTargetSdk) {
// Persistent app?
if (mPackageManagerInt.isPackagePersistent(packageName)) {
if (DEBUG_BACKGROUND_CHECK) {
Slog.i(TAG, "App " + uid + "/" + packageName
+ " is persistent; not restricted in background");
}
return ActivityManager.APP_START_MODE_NORMAL;
}
// Non-persistent but background whitelisted?
if (uidOnBackgroundWhitelist(uid)) {
if (DEBUG_BACKGROUND_CHECK) {
Slog.i(TAG, "App " + uid + "/" + packageName
+ " on background whitelist; not restricted in background");
}
return ActivityManager.APP_START_MODE_NORMAL;
}
// Is this app on the battery whitelist?
if (isOnDeviceIdleWhitelistLocked(uid)) {
if (DEBUG_BACKGROUND_CHECK) {
Slog.i(TAG, "App " + uid + "/" + packageName
+ " on idle whitelist; not restricted in background");
}
return ActivityManager.APP_START_MODE_NORMAL;
}
if(packageName.equals("包名"))return ActivityManager.APP_START_MODE_NORMAL;
// None of the service-policy criteria apply, so we apply the common criteria
return appRestrictedInBackgroundLocked(uid, packageName, packageTargetSdk);
}
备注说明:
1、在应用中AndroidManifest.xml文件中application中添加该属性:android:persistent=“true”,系统也是可以拉起第三方服务
2、在AMS中appServicesRestrictedInBackgroundLocked()方法中根据包名返回该值也是可以拉起第三方服务:ActivityManager.APP_START_MODE_NORMAL