Merge "More flexible API enforcement policy."

This commit is contained in:
Mathew Inwood
2018-03-23 13:29:03 +00:00
committed by Gerrit Code Review
4 changed files with 107 additions and 15 deletions

View File

@@ -1046,6 +1046,58 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
/** @hide */
public String[] splitClassLoaderNames;
/**
* Represents the default policy. The actual policy used will depend on other properties of
* the application, e.g. the target SDK version.
* @hide
*/
public static final int HIDDEN_API_ENFORCEMENT_DEFAULT = -1;
/**
* No API enforcement; the app can access the entire internal private API. Only for use by
* system apps.
* @hide
*/
public static final int HIDDEN_API_ENFORCEMENT_NONE = 0;
/**
* Light grey list enforcement, the strictest option. Enforces the light grey, dark grey and
* black lists.
* @hide
* */
public static final int HIDDEN_API_ENFORCEMENT_ALL_LISTS = 1;
/**
* Dark grey list enforcement. Enforces the dark grey and black lists
* @hide
*/
public static final int HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK = 2;
/**
* Blacklist enforcement only.
* @hide
*/
public static final int HIDDEN_API_ENFORCEMENT_BLACK = 3;
private static final int HIDDEN_API_ENFORCEMENT_MAX = HIDDEN_API_ENFORCEMENT_BLACK;
/**
* Values in this IntDef MUST be kept in sync with enum hiddenapi::EnforcementPolicy in
* art/runtime/hidden_api.h
* @hide
*/
@IntDef(prefix = { "HIDDEN_API_ENFORCEMENT_" }, value = {
HIDDEN_API_ENFORCEMENT_DEFAULT,
HIDDEN_API_ENFORCEMENT_NONE,
HIDDEN_API_ENFORCEMENT_ALL_LISTS,
HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK,
HIDDEN_API_ENFORCEMENT_BLACK,
})
@Retention(RetentionPolicy.SOURCE)
public @interface HiddenApiEnforcementPolicy {}
private boolean isValidHiddenApiEnforcementPolicy(int policy) {
return policy >= HIDDEN_API_ENFORCEMENT_DEFAULT && policy <= HIDDEN_API_ENFORCEMENT_MAX;
}
private int mHiddenApiPolicy = HIDDEN_API_ENFORCEMENT_DEFAULT;
public void dump(Printer pw, String prefix) {
dump(pw, prefix, DUMP_FLAG_ALL);
}
@@ -1133,6 +1185,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
if (category != CATEGORY_UNDEFINED) {
pw.println(prefix + "category=" + category);
}
pw.println(prefix + "HiddenApiEnforcementPolicy=" + getHiddenApiEnforcementPolicy());
}
super.dumpBack(pw, prefix);
}
@@ -1228,6 +1281,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
targetSandboxVersion = orig.targetSandboxVersion;
classLoaderName = orig.classLoaderName;
splitClassLoaderNames = orig.splitClassLoaderNames;
mHiddenApiPolicy = orig.mHiddenApiPolicy;
}
public String toString() {
@@ -1298,6 +1352,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
dest.writeInt(targetSandboxVersion);
dest.writeString(classLoaderName);
dest.writeStringArray(splitClassLoaderNames);
dest.writeInt(mHiddenApiPolicy);
}
public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -1365,6 +1420,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
targetSandboxVersion = source.readInt();
classLoaderName = source.readString();
splitClassLoaderNames = source.readStringArray();
mHiddenApiPolicy = source.readInt();
}
/**
@@ -1456,14 +1512,31 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
}
}
private boolean isPackageWhitelistedForHiddenApis() {
return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
}
/**
* @hide
*/
public boolean isAllowedToUseHiddenApi() {
boolean whitelisted =
SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
return isSystemApp() || // TODO get rid of this once the whitelist has been populated
(whitelisted && (isSystemApp() || isUpdatedSystemApp()));
public @HiddenApiEnforcementPolicy int getHiddenApiEnforcementPolicy() {
if (mHiddenApiPolicy != HIDDEN_API_ENFORCEMENT_DEFAULT) {
return mHiddenApiPolicy;
}
if (isPackageWhitelistedForHiddenApis() && (isSystemApp() || isUpdatedSystemApp())) {
return HIDDEN_API_ENFORCEMENT_NONE;
}
return HIDDEN_API_ENFORCEMENT_BLACK;
}
/**
* @hide
*/
public void setHiddenApiEnforcementPolicy(@HiddenApiEnforcementPolicy int policy) {
if (!isValidHiddenApiEnforcementPolicy(policy)) {
throw new IllegalArgumentException("Invalid API enforcement policy: " + policy);
}
mHiddenApiPolicy = policy;
}
/**