OBB API for PackageManager
Simple API for tracking .obb files associated with packages. Stores the
path in the PackageSettings. No verification of file content is done
now since the PackageManagerService can't read the SD card where these
files will likely live.
Change-Id: Ibeaf26ba0526b6d60f401137e58f46ee9faff39e
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index b4fc15a..d97f30c 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -4583,6 +4583,8 @@
}
};
+ private static final boolean DEBUG_OBB = false;
+
private static final void sendPackageBroadcast(String action, String pkg,
Bundle extras, IIntentReceiver finishedReceiver) {
IActivityManager am = ActivityManagerNative.getDefault();
@@ -4757,6 +4759,27 @@
mHandler.sendMessage(msg);
}
+ public void setPackageObbPath(String packageName, String path) {
+ if (DEBUG_OBB)
+ Log.v(TAG, "Setting .obb path for " + packageName + " to: " + path);
+ PackageSetting pkgSetting;
+ final int uid = Binder.getCallingUid();
+ boolean allowedByPermission = false;
+ synchronized (mPackages) {
+ pkgSetting = mSettings.mPackages.get(packageName);
+ if (pkgSetting == null) {
+ throw new IllegalArgumentException("Unknown package: " + packageName);
+ }
+ if (!allowedByPermission && (uid != pkgSetting.userId)) {
+ throw new SecurityException("Permission denial: attempt to set .obb file from pid="
+ + Binder.getCallingPid() + ", uid=" + uid + ", package uid="
+ + pkgSetting.userId);
+ }
+ pkgSetting.obbPathString = path;
+ mSettings.writeLP();
+ }
+ }
+
private void processPendingInstall(final InstallArgs args, final int currentStatus) {
// Queue up an async operation since the package installation may take a little while.
mHandler.post(new Runnable() {
@@ -7118,6 +7141,7 @@
pw.print(" pkg="); pw.println(ps.pkg);
pw.print(" codePath="); pw.println(ps.codePathString);
pw.print(" resourcePath="); pw.println(ps.resourcePathString);
+ pw.print(" obbPath="); pw.println(ps.obbPathString);
if (ps.pkg != null) {
pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
@@ -7684,6 +7708,7 @@
String codePathString;
File resourcePath;
String resourcePathString;
+ String obbPathString;
private long timeStamp;
private String timeStampString = "0";
int versionCode;
@@ -8684,6 +8709,9 @@
if (pkg.installerPackageName != null) {
serializer.attribute(null, "installer", pkg.installerPackageName);
}
+ if (pkg.obbPathString != null) {
+ serializer.attribute(null, "obbPath", pkg.obbPathString);
+ }
pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
if ((pkg.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
serializer.startTag(null, "perms");
@@ -9060,6 +9088,7 @@
String sharedIdStr = null;
String codePathStr = null;
String resourcePathStr = null;
+ String obbPathStr = null;
String systemStr = null;
String installerPackageName = null;
String uidError = null;
@@ -9077,6 +9106,7 @@
sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
codePathStr = parser.getAttributeValue(null, "codePath");
resourcePathStr = parser.getAttributeValue(null, "resourcePath");
+ obbPathStr = parser.getAttributeValue(null, "obbPath");
version = parser.getAttributeValue(null, "version");
if (version != null) {
try {
@@ -9174,6 +9204,7 @@
if (packageSetting != null) {
packageSetting.uidError = "true".equals(uidError);
packageSetting.installerPackageName = installerPackageName;
+ packageSetting.obbPathString = obbPathStr;
final String enabledStr = parser.getAttributeValue(null, "enabled");
if (enabledStr != null) {
if (enabledStr.equalsIgnoreCase("true")) {