diff options
author | Dianne Hackborn <hackbod@google.com> | 2011-09-12 12:29:43 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2011-09-12 12:29:43 -0700 |
commit | d2509fd83597595914ef0627685e917380863eb6 (patch) | |
tree | 31ae51c4cb2664615c08ceb99f6363b084199cb4 /services | |
parent | d61a3a1bed57fc33fb0fa132521746bb58bba6be (diff) | |
download | frameworks_base-d2509fd83597595914ef0627685e917380863eb6.zip frameworks_base-d2509fd83597595914ef0627685e917380863eb6.tar.gz frameworks_base-d2509fd83597595914ef0627685e917380863eb6.tar.bz2 |
Add boot mode where only "core apps" are started.
A core app is one that has coreApp="true" in its manifest tag.
The system can successfully boot (though a little painfully) with
only framework-res.apk, SettingsProvider.apk, SystemUI.apk,
DefaultContainerService.apk, and Launcher2.apk set as core apps.
Currently this boot mode is always turned off.
Change-Id: Ieaa4a8031c2c391a12996aa8d8b1d65fc2b09d6b
Diffstat (limited to 'services')
-rw-r--r-- | services/java/com/android/server/SystemServer.java | 3 | ||||
-rw-r--r-- | services/java/com/android/server/pm/PackageManagerService.java | 67 |
2 files changed, 41 insertions, 29 deletions
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 2714fc5..7e28c4f 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -148,7 +148,8 @@ class ServerThread extends Thread { Slog.i(TAG, "Package Manager"); pm = PackageManagerService.main(context, - factoryTest != SystemServer.FACTORY_TEST_OFF); + factoryTest != SystemServer.FACTORY_TEST_OFF, + false); ActivityManagerService.setSystemProcess(); diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index bfb244b..4e5ca8e 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -221,6 +221,7 @@ public class PackageManagerService extends IPackageManager.Stub { final Context mContext; final boolean mFactoryTest; + final boolean mOnlyCore; final boolean mNoDexOpt; final DisplayMetrics mMetrics; final int mDefParseFlags; @@ -809,8 +810,9 @@ public class PackageManagerService extends IPackageManager.Stub { return false; } - public static final IPackageManager main(Context context, boolean factoryTest) { - PackageManagerService m = new PackageManagerService(context, factoryTest); + public static final IPackageManager main(Context context, boolean factoryTest, + boolean onlyCore) { + PackageManagerService m = new PackageManagerService(context, factoryTest, onlyCore); ServiceManager.addService("package", m); return m; } @@ -837,7 +839,7 @@ public class PackageManagerService extends IPackageManager.Stub { return res; } - public PackageManagerService(Context context, boolean factoryTest) { + public PackageManagerService(Context context, boolean factoryTest, boolean onlyCore) { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis()); @@ -847,6 +849,7 @@ public class PackageManagerService extends IPackageManager.Stub { mContext = context; mFactoryTest = factoryTest; + mOnlyCore = onlyCore; mNoDexOpt = "eng".equals(SystemProperties.get("ro.build.type")); mMetrics = new DisplayMetrics(); mSettings = new Settings(); @@ -1051,18 +1054,20 @@ public class PackageManagerService extends IPackageManager.Stub { mInstaller.moveFiles(); // Prune any system packages that no longer exist. - Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator(); - while (psit.hasNext()) { - PackageSetting ps = psit.next(); - if ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0 - && !mPackages.containsKey(ps.name) - && !mSettings.mDisabledSysPackages.containsKey(ps.name)) { - psit.remove(); - String msg = "System package " + ps.name - + " no longer exists; wiping its data"; - reportSettingsProblem(Log.WARN, msg); - mInstaller.remove(ps.name, 0); - mUserManager.removePackageForAllUsers(ps.name); + if (!mOnlyCore) { + Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator(); + while (psit.hasNext()) { + PackageSetting ps = psit.next(); + if ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0 + && !mPackages.containsKey(ps.name) + && !mSettings.mDisabledSysPackages.containsKey(ps.name)) { + psit.remove(); + String msg = "System package " + ps.name + + " no longer exists; wiping its data"; + reportSettingsProblem(Log.WARN, msg); + mInstaller.remove(ps.name, 0); + mUserManager.removePackageForAllUsers(ps.name); + } } } @@ -1077,18 +1082,23 @@ public class PackageManagerService extends IPackageManager.Stub { //delete tmp files deleteTempPackageFiles(); - EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START, - SystemClock.uptimeMillis()); - mAppInstallObserver = new AppDirObserver( - mAppInstallDir.getPath(), OBSERVER_EVENTS, false); - mAppInstallObserver.startWatching(); - scanDirLI(mAppInstallDir, 0, scanMode, 0); - - mDrmAppInstallObserver = new AppDirObserver( - mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false); - mDrmAppInstallObserver.startWatching(); - scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, - scanMode, 0); + if (!mOnlyCore) { + EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START, + SystemClock.uptimeMillis()); + mAppInstallObserver = new AppDirObserver( + mAppInstallDir.getPath(), OBSERVER_EVENTS, false); + mAppInstallObserver.startWatching(); + scanDirLI(mAppInstallDir, 0, scanMode, 0); + + mDrmAppInstallObserver = new AppDirObserver( + mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false); + mDrmAppInstallObserver.startWatching(); + scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, + scanMode, 0); + } else { + mAppInstallObserver = null; + mDrmAppInstallObserver = null; + } EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END, SystemClock.uptimeMillis()); @@ -2749,6 +2759,7 @@ public class PackageManagerService extends IPackageManager.Stub { parseFlags |= mDefParseFlags; PackageParser pp = new PackageParser(scanPath); pp.setSeparateProcesses(mSeparateProcesses); + pp.setOnlyCoreApps(mOnlyCore); final PackageParser.Package pkg = pp.parsePackage(scanFile, scanPath, mMetrics, parseFlags); if (pkg == null) { @@ -4044,7 +4055,7 @@ public class PackageManagerService extends IPackageManager.Stub { + " info=" + bp.pendingInfo); if (bp.packageSetting == null && bp.pendingInfo != null) { final BasePermission tree = findPermissionTreeLP(bp.name); - if (tree != null) { + if (tree != null && tree.perm != null) { bp.packageSetting = tree.packageSetting; bp.perm = new PackageParser.Permission(tree.perm.owner, new PermissionInfo(bp.pendingInfo)); |