diff options
3 files changed, 34 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 1045289ca5c1..c95864f307b7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -197,6 +197,7 @@ import android.content.pm.SharedLibraryInfo; import android.content.pm.Signature; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; +import android.content.pm.UsesPermissionInfo; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VerifierInfo; import android.content.pm.VersionedPackage; @@ -11242,6 +11243,26 @@ public class PackageManagerService extends IPackageManager.Stub } } } + + // Check permission usage info requirements. + if (pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q) { + for (UsesPermissionInfo upi : pkg.usesPermissionInfos) { + if (!mPermissionManager.isPermissionUsageInfoRequired(upi.getPermission())) { + continue; + } + if (upi.getDataSentOffDevice() == UsesPermissionInfo.USAGE_UNDEFINED + || upi.getDataSharedWithThirdParty() + == UsesPermissionInfo.USAGE_UNDEFINED + || upi.getDataUsedForMonetization() + == UsesPermissionInfo.USAGE_UNDEFINED + || upi.getDataRetention() == UsesPermissionInfo.RETENTION_UNDEFINED) { + // STOPSHIP: Make this throw + Slog.wtf(TAG, "Package " + pkg.packageName + " does not provide usage " + + "information for permission " + upi.getPermission() + + ". This will be a fatal error in Q."); + } + } + } } } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java index ec15c16981a8..189d0f476a8c 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java @@ -181,4 +181,9 @@ public abstract class PermissionManagerInternal { /** HACK HACK methods to allow for partial migration of data to the PermissionManager class */ public abstract @Nullable BasePermission getPermissionTEMP(@NonNull String permName); -}
\ No newline at end of file + + /** + * Returns {@code true} if {@code permName} has {@code usageInfoRequired} set. + */ + public abstract boolean isPermissionUsageInfoRequired(@NonNull String permName); +} diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index c5d38db2c469..4406fdde6454 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2644,5 +2644,12 @@ public class PermissionManagerService { return mSettings.getPermissionLocked(permName); } } + @Override + public boolean isPermissionUsageInfoRequired(String permName) { + synchronized (PermissionManagerService.this.mLock) { + BasePermission bp = mSettings.getPermissionLocked(permName); + return bp != null && bp.usageInfoRequired; + } + } } } |