From 93565c4b3265c16aee4a82d7556f811776c17db8 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Fri, 18 Jun 2010 15:46:06 -0700 Subject: 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 --- api/current.xml | 15 +++++++++++ core/java/android/app/ContextImpl.java | 9 +++++++ core/java/android/content/pm/IPackageManager.aidl | 2 ++ core/java/android/content/pm/PackageManager.java | 13 +++++++++ .../com/android/server/PackageManagerService.java | 31 ++++++++++++++++++++++ .../src/android/test/mock/MockPackageManager.java | 5 ++++ 6 files changed, 75 insertions(+) diff --git a/api/current.xml b/api/current.xml index 5d71cad53102..64dd3a8a1a90 100644 --- a/api/current.xml +++ b/api/current.xml @@ -154519,6 +154519,21 @@ + + + + + + + * NOTE: The existence or format of this file is not currently checked, but + * it may be in the future. + * + * @param packageName Name of the package with which to associate the .obb + * file + * @param path Path on the filesystem to the .obb file + * @hide + */ + public abstract void setPackageObbPath(String packageName, String path); } diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index b4fc15af30f1..d97f30c22985 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -4583,6 +4583,8 @@ class PackageManagerService extends IPackageManager.Stub { } }; + 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 @@ class PackageManagerService extends IPackageManager.Stub { 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 @@ class PackageManagerService extends IPackageManager.Stub { 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 @@ class PackageManagerService extends IPackageManager.Stub { String codePathString; File resourcePath; String resourcePathString; + String obbPathString; private long timeStamp; private String timeStampString = "0"; int versionCode; @@ -8684,6 +8709,9 @@ class PackageManagerService extends IPackageManager.Stub { 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 @@ class PackageManagerService extends IPackageManager.Stub { 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 @@ class PackageManagerService extends IPackageManager.Stub { 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 @@ class PackageManagerService extends IPackageManager.Stub { 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")) { diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 3e77b9b296c4..e96173bf5d98 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -483,4 +483,9 @@ public class MockPackageManager extends PackageManager { public boolean isSafeMode() { throw new UnsupportedOperationException(); } + + @Override + public void setPackageObbPath(String packageName, String path) { + throw new UnsupportedOperationException(); + } } -- cgit v1.2.3-59-g8ed1b