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 /core | |
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 'core')
-rw-r--r-- | core/java/android/content/pm/PackageParser.java | 35 | ||||
-rw-r--r-- | core/res/AndroidManifest.xml | 2 |
2 files changed, 27 insertions, 10 deletions
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index c61e32f..e7b844c 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -92,6 +92,7 @@ public class PackageParser { private String mArchiveSourcePath; private String[] mSeparateProcesses; + private boolean mOnlyCoreApps; private static final int SDK_VERSION = Build.VERSION.SDK_INT; private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME) ? null : Build.VERSION.CODENAME; @@ -180,6 +181,10 @@ public class PackageParser { mSeparateProcesses = procs; } + public void setOnlyCoreApps(boolean onlyCoreApps) { + mOnlyCoreApps = onlyCoreApps; + } + private static final boolean isPackageFilename(String name) { return name.endsWith(".apk"); } @@ -433,18 +438,22 @@ public class PackageParser { if (pkg == null) { - if (errorException != null) { - Slog.w(TAG, mArchiveSourcePath, errorException); - } else { - Slog.w(TAG, mArchiveSourcePath + " (at " - + parser.getPositionDescription() - + "): " + errorText[0]); + // If we are only parsing core apps, then a null with INSTALL_SUCCEEDED + // just means to skip this app so don't make a fuss about it. + if (!mOnlyCoreApps || mParseError != PackageManager.INSTALL_SUCCEEDED) { + if (errorException != null) { + Slog.w(TAG, mArchiveSourcePath, errorException); + } else { + Slog.w(TAG, mArchiveSourcePath + " (at " + + parser.getPositionDescription() + + "): " + errorText[0]); + } + if (mParseError == PackageManager.INSTALL_SUCCEEDED) { + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; + } } parser.close(); assmgr.close(); - if (mParseError == PackageManager.INSTALL_SUCCEEDED) { - mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; - } return null; } @@ -782,6 +791,14 @@ public class PackageParser { } int type; + if (mOnlyCoreApps) { + boolean core = attrs.getAttributeBooleanValue(null, "coreApp", false); + if (!core) { + mParseError = PackageManager.INSTALL_SUCCEEDED; + return null; + } + } + final Package pkg = new Package(pkgName); boolean foundApp = false; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 72863a2..9f2eef5 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -18,7 +18,7 @@ */ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="android" android:sharedUserId="android.uid.system" + package="android" coreApp="true" android:sharedUserId="android.uid.system" android:sharedUserLabel="@string/android_system_label"> <!-- ================================================ --> |