From 1114385e48cf688cb44db5521e91233606adc066 Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Wed, 26 Oct 2022 17:16:56 +0000 Subject: [PATCH] Expose PackageState#getHiddenApiEnforcementPolicy Adds PackageState method for @hide API enforcement policy, hidden inside the state object so that the caller doesn't need to figure out the effective state. Although it's worth noting this isn't final state, since ProcessList can use a device configuration to override policy. Bug: 236389629 Change-Id: If9edd89186534d02933dac5f9e5ff063c27c52b6 --- services/api/current.txt | 1 + .../com/android/server/pm/PackageSetting.java | 6 ++- .../pm/parsing/pkg/AndroidPackageUtils.java | 6 ++- .../android/server/pm/pkg/PackageState.java | 37 +++++++++++++------ .../server/pm/pkg/PackageStateImpl.java | 15 ++++++-- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/services/api/current.txt b/services/api/current.txt index d05431d4511a3..18b1df3d418bd 100644 --- a/services/api/current.txt +++ b/services/api/current.txt @@ -99,6 +99,7 @@ package com.android.server.pm.pkg { public interface PackageState { method @Nullable public com.android.server.pm.pkg.AndroidPackage getAndroidPackage(); method public int getAppId(); + method public int getHiddenApiEnforcementPolicy(); method @NonNull public String getPackageName(); method @Nullable public String getPrimaryCpuAbi(); method @Nullable public String getSeInfo(); diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 6dcbb52ea8904..b18179e7b752f 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -1380,7 +1380,11 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return mSecondaryCpuAbi; } - + @ApplicationInfo.HiddenApiEnforcementPolicy + @Override + public int getHiddenApiEnforcementPolicy() { + return AndroidPackageUtils.getHiddenApiEnforcementPolicy(getAndroidPackage(), this); + } // Code below generated by codegen v1.0.23. // diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java index c76b129836567..82b5fa27af2c0 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java @@ -234,10 +234,12 @@ public class AndroidPackageUtils { || !pkg.getLibraryNames().isEmpty(); } - public static int getHiddenApiEnforcementPolicy(AndroidPackage pkg, + public static int getHiddenApiEnforcementPolicy(@Nullable AndroidPackage pkg, @NonNull PackageStateInternal pkgSetting) { boolean isAllowedToUseHiddenApis; - if (pkg.isSignedWithPlatformKey()) { + if (pkg == null) { + isAllowedToUseHiddenApis = false; + } else if (pkg.isSignedWithPlatformKey()) { isAllowedToUseHiddenApis = true; } else if (pkg.isSystem() || pkgSetting.getTransientState().isUpdatedSystemApp()) { isAllowedToUseHiddenApis = pkg.isUsesNonSdkApi() diff --git a/services/core/java/com/android/server/pm/pkg/PackageState.java b/services/core/java/com/android/server/pm/pkg/PackageState.java index e8d0640a675c8..67b7647db7c1b 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageState.java +++ b/services/core/java/com/android/server/pm/pkg/PackageState.java @@ -111,6 +111,19 @@ public interface PackageState { @AppIdInt int getAppId(); + /** + * Retrieves effective hidden API policy for this app. The state can be dependent on + * {@link #getAndroidPackage()} availability and whether the app is a system app. + * + * Note that during process start, this policy may be mutated by device specific process + * configuration, so this value isn't truly final. + * + * @return The (mostly) final {@link ApplicationInfo.HiddenApiEnforcementPolicy} that should be + * applied to this package. + */ + @ApplicationInfo.HiddenApiEnforcementPolicy + int getHiddenApiEnforcementPolicy(); + /** * @see PackageInfo#packageName * @see AndroidPackage#getPackageName() @@ -138,6 +151,18 @@ public interface PackageState { @Nullable String getSeInfo(); + /** + * @return State for a user or {@link PackageUserState#DEFAULT} if the state doesn't exist. + */ + @NonNull + PackageUserState getStateForUser(@NonNull UserHandle user); + + /** + * @see R.styleable#AndroidManifestUsesLibrary + */ + @NonNull + List getUsesLibraries(); + /** * @see AndroidPackage#isPrivileged() */ @@ -154,18 +179,6 @@ public interface PackageState { */ boolean isUpdatedSystemApp(); - /** - * @return State for a user or {@link PackageUserState#DEFAULT} if the state doesn't exist. - */ - @NonNull - PackageUserState getStateForUser(@NonNull UserHandle user); - - /** - * @see R.styleable#AndroidManifestUsesLibrary - */ - @NonNull - List getUsesLibraries(); - // Methods below this comment are not yet exposed as API /** diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java index e552a34be70dc..43d019a6dbff2 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java +++ b/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java @@ -19,6 +19,7 @@ package com.android.server.pm.pkg; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.SigningInfo; @@ -118,6 +119,8 @@ public class PackageStateImpl implements PackageState { private final int mCategoryOverride; @Nullable private final String mCpuAbiOverride; + @ApplicationInfo.HiddenApiEnforcementPolicy + private final int mHiddenApiEnforcementPolicy; private final long mLastModifiedTime; private final long mLastUpdateTime; private final long mLongVersionCode; @@ -170,6 +173,7 @@ public class PackageStateImpl implements PackageState { mAppId = pkgState.getAppId(); mCategoryOverride = pkgState.getCategoryOverride(); mCpuAbiOverride = pkgState.getCpuAbiOverride(); + mHiddenApiEnforcementPolicy = pkgState.getHiddenApiEnforcementPolicy(); mLastModifiedTime = pkgState.getLastModifiedTime(); mLastUpdateTime = pkgState.getLastUpdateTime(); mLongVersionCode = pkgState.getVersionCode(); @@ -545,7 +549,7 @@ public class PackageStateImpl implements PackageState { } @DataClass.Generated( - time = 1665778832625L, + time = 1666719622708L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java", inputSignatures = "private int mBooleans\nprivate final long mCeDataInode\nprivate final @android.annotation.NonNull android.util.ArraySet mDisabledComponents\nprivate final @android.content.pm.PackageManager.DistractionRestriction int mDistractionFlags\nprivate final @android.annotation.NonNull android.util.ArraySet mEnabledComponents\nprivate final int mEnabledState\nprivate final @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate final @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate final @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate final @android.annotation.NonNull android.content.pm.overlay.OverlayPaths mOverlayPaths\nprivate final @android.annotation.NonNull java.util.Map mSharedLibraryOverlayPaths\nprivate final @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate final @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate final long mFirstInstallTime\npublic static com.android.server.pm.pkg.PackageUserState copy(com.android.server.pm.pkg.PackageUserState)\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\npublic @java.lang.Override boolean isHidden()\npublic @java.lang.Override boolean isInstalled()\npublic @java.lang.Override boolean isInstantApp()\npublic @java.lang.Override boolean isNotLaunched()\npublic @java.lang.Override boolean isStopped()\npublic @java.lang.Override boolean isSuspended()\npublic @java.lang.Override boolean isVirtualPreload()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\nclass UserStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageUserState]\nprivate static final int HIDDEN\nprivate static final int INSTALLED\nprivate static final int INSTANT_APP\nprivate static final int NOT_LAUNCHED\nprivate static final int STOPPED\nprivate static final int SUSPENDED\nprivate static final int VIRTUAL_PRELOAD\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false)") @@ -608,6 +612,11 @@ public class PackageStateImpl implements PackageState { return mCpuAbiOverride; } + @DataClass.Generated.Member + public @ApplicationInfo.HiddenApiEnforcementPolicy int getHiddenApiEnforcementPolicy() { + return mHiddenApiEnforcementPolicy; + } + @DataClass.Generated.Member public long getLastModifiedTime() { return mLastModifiedTime; @@ -705,10 +714,10 @@ public class PackageStateImpl implements PackageState { } @DataClass.Generated( - time = 1665778832668L, + time = 1666719622749L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java", - inputSignatures = "private int mBooleans\nprivate final @android.annotation.Nullable com.android.server.pm.pkg.AndroidPackage mAndroidPackage\nprivate final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.Nullable java.lang.String mVolumeUuid\nprivate final int mAppId\nprivate final int mCategoryOverride\nprivate final @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate final long mLastModifiedTime\nprivate final long mLastUpdateTime\nprivate final long mLongVersionCode\nprivate final @android.annotation.NonNull java.util.Map> mMimeGroups\nprivate final @android.annotation.NonNull java.io.File mPath\nprivate final @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSeInfo\nprivate final boolean mHasSharedUser\nprivate final int mSharedUserAppId\nprivate final @android.annotation.NonNull java.lang.String[] mUsesSdkLibraries\nprivate final @android.annotation.NonNull long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.NonNull java.lang.String[] mUsesStaticLibraries\nprivate final @android.annotation.NonNull long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.NonNull java.util.List mUsesLibraries\nprivate final @android.annotation.NonNull java.util.List mUsesLibraryFiles\nprivate final @android.annotation.NonNull long[] mLastPackageUsageTime\nprivate final @android.annotation.NonNull android.content.pm.SigningInfo mSigningInfo\nprivate final @android.annotation.NonNull android.util.SparseArray mUserStates\npublic static com.android.server.pm.pkg.PackageState copy(com.android.server.pm.pkg.PackageStateInternal)\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserState getStateForUser(android.os.UserHandle)\npublic @java.lang.Override boolean isExternalStorage()\npublic @java.lang.Override boolean isForceQueryableOverride()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @java.lang.Override boolean isInstallPermissionsFixed()\npublic @java.lang.Override boolean isOdm()\npublic @java.lang.Override boolean isOem()\npublic @java.lang.Override boolean isPrivileged()\npublic @java.lang.Override boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic @java.lang.Override boolean isSystem()\npublic @java.lang.Override boolean isSystemExt()\npublic @java.lang.Override boolean isUpdateAvailable()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isApkInUpdatedApex()\npublic @java.lang.Override boolean isVendor()\npublic @java.lang.Override long getVersionCode()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override int getSharedUserAppId()\nclass PackageStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageState]\nprivate static final int SYSTEM\nprivate static final int EXTERNAL_STORAGE\nprivate static final int PRIVILEGED\nprivate static final int OEM\nprivate static final int VENDOR\nprivate static final int PRODUCT\nprivate static final int SYSTEM_EXT\nprivate static final int REQUIRED_FOR_SYSTEM_USER\nprivate static final int ODM\nprivate static final int FORCE_QUERYABLE_OVERRIDE\nprivate static final int HIDDEN_UNTIL_INSTALLED\nprivate static final int INSTALL_PERMISSIONS_FIXED\nprivate static final int UPDATE_AVAILABLE\nprivate static final int UPDATED_SYSTEM_APP\nprivate static final int APK_IN_UPDATED_APEX\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false)") + inputSignatures = "private int mBooleans\nprivate final @android.annotation.Nullable com.android.server.pm.pkg.AndroidPackage mAndroidPackage\nprivate final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.Nullable java.lang.String mVolumeUuid\nprivate final int mAppId\nprivate final int mCategoryOverride\nprivate final @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate final @android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy int mHiddenApiEnforcementPolicy\nprivate final long mLastModifiedTime\nprivate final long mLastUpdateTime\nprivate final long mLongVersionCode\nprivate final @android.annotation.NonNull java.util.Map> mMimeGroups\nprivate final @android.annotation.NonNull java.io.File mPath\nprivate final @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSeInfo\nprivate final boolean mHasSharedUser\nprivate final int mSharedUserAppId\nprivate final @android.annotation.NonNull java.lang.String[] mUsesSdkLibraries\nprivate final @android.annotation.NonNull long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.NonNull java.lang.String[] mUsesStaticLibraries\nprivate final @android.annotation.NonNull long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.NonNull java.util.List mUsesLibraries\nprivate final @android.annotation.NonNull java.util.List mUsesLibraryFiles\nprivate final @android.annotation.NonNull long[] mLastPackageUsageTime\nprivate final @android.annotation.NonNull android.content.pm.SigningInfo mSigningInfo\nprivate final @android.annotation.NonNull android.util.SparseArray mUserStates\npublic static com.android.server.pm.pkg.PackageState copy(com.android.server.pm.pkg.PackageStateInternal)\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserState getStateForUser(android.os.UserHandle)\npublic @java.lang.Override boolean isExternalStorage()\npublic @java.lang.Override boolean isForceQueryableOverride()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @java.lang.Override boolean isInstallPermissionsFixed()\npublic @java.lang.Override boolean isOdm()\npublic @java.lang.Override boolean isOem()\npublic @java.lang.Override boolean isPrivileged()\npublic @java.lang.Override boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic @java.lang.Override boolean isSystem()\npublic @java.lang.Override boolean isSystemExt()\npublic @java.lang.Override boolean isUpdateAvailable()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isApkInUpdatedApex()\npublic @java.lang.Override boolean isVendor()\npublic @java.lang.Override long getVersionCode()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override int getSharedUserAppId()\nclass PackageStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageState]\nprivate static final int SYSTEM\nprivate static final int EXTERNAL_STORAGE\nprivate static final int PRIVILEGED\nprivate static final int OEM\nprivate static final int VENDOR\nprivate static final int PRODUCT\nprivate static final int SYSTEM_EXT\nprivate static final int REQUIRED_FOR_SYSTEM_USER\nprivate static final int ODM\nprivate static final int FORCE_QUERYABLE_OVERRIDE\nprivate static final int HIDDEN_UNTIL_INSTALLED\nprivate static final int INSTALL_PERMISSIONS_FIXED\nprivate static final int UPDATE_AVAILABLE\nprivate static final int UPDATED_SYSTEM_APP\nprivate static final int APK_IN_UPDATED_APEX\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false)") @Deprecated private void __metadata() {}