summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java21
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java7
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java7
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;
+ }
+ }
}
}