diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index d2611563d0aa0..243d7d8121c07 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1000,6 +1000,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*/
public String appComponentFactory;
+ /**
+ * Indicates whether this package requires access to non-SDK APIs. Only system apps
+ * and tests are allowed to use this property.
+ * @hide
+ */
+ public boolean usesNonSdkApi;
+
/**
* The category of this app. Categories are used to cluster multiple apps
* together into meaningful groups, such as when summarizing battery,
@@ -1698,8 +1705,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
}
private boolean isAllowedToUseHiddenApis() {
- return isSignedWithPlatformKey()
- || (isPackageWhitelistedForHiddenApis() && (isSystemApp() || isUpdatedSystemApp()));
+ if (isSignedWithPlatformKey()) {
+ return true;
+ } else if (isSystemApp() || isUpdatedSystemApp()) {
+ return usesNonSdkApi || isPackageWhitelistedForHiddenApis();
+ } else {
+ return false;
+ }
}
/**
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 89a72c96ec64a..b7be5a7ced2d7 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3580,6 +3580,9 @@ public class PackageParser {
ai.appComponentFactory = buildClassName(ai.packageName, factory, outError);
}
+ ai.usesNonSdkApi = sa.getBoolean(
+ com.android.internal.R.styleable.AndroidManifestApplication_usesNonSdkApi, false);
+
if (outError[0] == null) {
CharSequence pname;
if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index c4fa190b228dd..9e0cff3c47283 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1385,6 +1385,8 @@
instantiates items without it.-->
+
+
+
+
+
+
+
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f7cb8345e43f2..2447a03bc25f4 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -21996,8 +21996,8 @@ public class ActivityManagerService extends IActivityManager.Stub
activeInstr.mUiAutomationConnection = uiAutomationConnection;
activeInstr.mResultClass = className;
- boolean disableHiddenApiChecks =
- (flags & INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0;
+ boolean disableHiddenApiChecks = ai.usesNonSdkApi
+ || (flags & INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0;
if (disableHiddenApiChecks) {
enforceCallingPermission(android.Manifest.permission.DISABLE_HIDDEN_API_CHECKS,
"disable hidden API checks");