From fa5e8361c4b5e51d9f74716c66524d83e139b8ce Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Thu, 6 Sep 2018 09:49:14 +0100 Subject: [PATCH] Move ApplicationInfo.usesNonSdkApi to private flags No need to create an extra field for a boolean flag. Move the recently added ApplicationInfo.usesNonSdkApi to one bit in privateFlags. This also solves an issue where the field was not propagated during copying of the data structure. Bug: 113315999 Test: phone boots Merged-In: I09f8f39454c013a84893ac304904a4412fc542bf Change-Id: I09f8f39454c013a84893ac304904a4412fc542bf (cherry picked from commit a5b4df2a8937fed8cb07fa5b63252d013c808fe7) --- .../android/content/pm/ApplicationInfo.java | 24 ++++++++++++------- .../android/content/pm/PackageParser.java | 6 +++-- .../server/am/ActivityManagerService.java | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 243d7d8121c07..7cdae22061f11 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -621,6 +621,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public static final int PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY = 1 << 20; + /** + * Indicates whether this package requires access to non-SDK APIs. + * Only system apps and tests are allowed to use this property. + * @hide + */ + public static final int PRIVATE_FLAG_USES_NON_SDK_API = 1 << 22; + /** @hide */ @IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = { PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, @@ -1000,13 +1007,6 @@ 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, @@ -1283,6 +1283,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { pw.println(prefix + "category=" + category); } pw.println(prefix + "HiddenApiEnforcementPolicy=" + getHiddenApiEnforcementPolicy()); + pw.println(prefix + "usesNonSdkApi=" + usesNonSdkApi()); } super.dumpBack(pw, prefix); } @@ -1704,11 +1705,18 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName); } + /** + * @hide + */ + public boolean usesNonSdkApi() { + return (privateFlags & PRIVATE_FLAG_USES_NON_SDK_API) != 0; + } + private boolean isAllowedToUseHiddenApis() { if (isSignedWithPlatformKey()) { return true; } else if (isSystemApp() || isUpdatedSystemApp()) { - return usesNonSdkApi || isPackageWhitelistedForHiddenApis(); + 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 b7be5a7ced2d7..7eefe552149b4 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3580,8 +3580,10 @@ public class PackageParser { ai.appComponentFactory = buildClassName(ai.packageName, factory, outError); } - ai.usesNonSdkApi = sa.getBoolean( - com.android.internal.R.styleable.AndroidManifestApplication_usesNonSdkApi, false); + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestApplication_usesNonSdkApi, false)) { + ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_USES_NON_SDK_API; + } if (outError[0] == null) { CharSequence pname; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 2447a03bc25f4..60499b2eb899a 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -21996,7 +21996,7 @@ public class ActivityManagerService extends IActivityManager.Stub activeInstr.mUiAutomationConnection = uiAutomationConnection; activeInstr.mResultClass = className; - boolean disableHiddenApiChecks = ai.usesNonSdkApi + boolean disableHiddenApiChecks = ai.usesNonSdkApi() || (flags & INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0; if (disableHiddenApiChecks) { enforceCallingPermission(android.Manifest.permission.DISABLE_HIDDEN_API_CHECKS,