From 409bb36a1388d7f8c869a4b8cd07e819755e983f Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Fri, 12 Jul 2013 12:29:41 -0700 Subject: Out-of-band apk pushes to the privileged install dir The new apk will now correctly allow system permissions to an app placed in the privileged install dir via 'adb push' on the fly. Change-Id: Ie4284d12628e08d9562d18eee6a7e8f74ae6295e --- .../android/server/pm/PackageManagerService.java | 30 +++++++++++++--------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 8fde010d9f78..6f572613effa 100755 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -1246,7 +1246,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Find base frameworks (resource packages without code). mFrameworkInstallObserver = new AppDirObserver( - mFrameworkDir.getPath(), OBSERVER_EVENTS, true); + mFrameworkDir.getPath(), OBSERVER_EVENTS, true, false); mFrameworkInstallObserver.startWatching(); scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, @@ -1255,7 +1255,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Collected privileged system packages. mPrivilegedAppDir = new File(Environment.getRootDirectory(), "priv-app"); mPrivilegedInstallObserver = new AppDirObserver( - mPrivilegedAppDir.getPath(), OBSERVER_EVENTS, true); + mPrivilegedAppDir.getPath(), OBSERVER_EVENTS, true, true); mPrivilegedInstallObserver.startWatching(); scanDirLI(mPrivilegedAppDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR @@ -1264,7 +1264,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Collect ordinary system packages. mSystemAppDir = new File(Environment.getRootDirectory(), "app"); mSystemInstallObserver = new AppDirObserver( - mSystemAppDir.getPath(), OBSERVER_EVENTS, true); + mSystemAppDir.getPath(), OBSERVER_EVENTS, true, false); mSystemInstallObserver.startWatching(); scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0); @@ -1272,7 +1272,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Collect all vendor packages. mVendorAppDir = new File("/vendor/app"); mVendorInstallObserver = new AppDirObserver( - mVendorAppDir.getPath(), OBSERVER_EVENTS, true); + mVendorAppDir.getPath(), OBSERVER_EVENTS, true, false); mVendorInstallObserver.startWatching(); scanDirLI(mVendorAppDir, PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0); @@ -1345,12 +1345,12 @@ public class PackageManagerService extends IPackageManager.Stub { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START, SystemClock.uptimeMillis()); mAppInstallObserver = new AppDirObserver( - mAppInstallDir.getPath(), OBSERVER_EVENTS, false); + mAppInstallDir.getPath(), OBSERVER_EVENTS, false, false); mAppInstallObserver.startWatching(); scanDirLI(mAppInstallDir, 0, scanMode, 0); mDrmAppInstallObserver = new AppDirObserver( - mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false); + mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false, false); mDrmAppInstallObserver.startWatching(); scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, scanMode, 0); @@ -5972,10 +5972,11 @@ public class PackageManagerService extends IPackageManager.Stub { } private final class AppDirObserver extends FileObserver { - public AppDirObserver(String path, int mask, boolean isrom) { + public AppDirObserver(String path, int mask, boolean isrom, boolean isPrivileged) { super(path, mask); mRootDir = path; mIsRom = isrom; + mIsPrivileged = isPrivileged; } public void onEvent(int event, String path) { @@ -6036,11 +6037,15 @@ public class PackageManagerService extends IPackageManager.Stub { if ((event&ADD_EVENTS) != 0) { if (p == null) { if (DEBUG_INSTALL) Slog.d(TAG, "New file appeared: " + fullPath); - p = scanPackageLI(fullPath, - (mIsRom ? PackageParser.PARSE_IS_SYSTEM - | PackageParser.PARSE_IS_SYSTEM_DIR: 0) | - PackageParser.PARSE_CHATTY | - PackageParser.PARSE_MUST_BE_APK, + int flags = PackageParser.PARSE_CHATTY | PackageParser.PARSE_MUST_BE_APK; + if (mIsRom) { + flags |= PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR; + if (mIsPrivileged) { + flags |= PackageParser.PARSE_IS_PRIVILEGED; + } + } + p = scanPackageLI(fullPath, flags, SCAN_MONITOR | SCAN_NO_PATHS | SCAN_UPDATE_TIME, System.currentTimeMillis(), UserHandle.ALL); if (p != null) { @@ -6083,6 +6088,7 @@ public class PackageManagerService extends IPackageManager.Stub { private final String mRootDir; private final boolean mIsRom; + private final boolean mIsPrivileged; } /* Called when a downloaded package installation has been confirmed by the user */ -- cgit v1.2.3-59-g8ed1b