diff options
author | Jeff Sharkey <jsharkey@android.com> | 2014-10-06 04:17:05 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-06 04:17:05 +0000 |
commit | ce85d7f44f5c88dcc18a19738bfcd20d9dbb4a78 (patch) | |
tree | 9799f75bdf4e116d2e6bfb6c5f70949a0920902b /services | |
parent | aa4b0d82a1fdb92fbf4f8852f326f2687ee55fa7 (diff) | |
parent | b03b9759d3ec1f3dacde71314795a3451f67fbab (diff) | |
download | frameworks_base-ce85d7f44f5c88dcc18a19738bfcd20d9dbb4a78.zip frameworks_base-ce85d7f44f5c88dcc18a19738bfcd20d9dbb4a78.tar.gz frameworks_base-ce85d7f44f5c88dcc18a19738bfcd20d9dbb4a78.tar.bz2 |
am b03b9759: am 4c880877: Merge "Recover from missing upgrade to system package." into lmp-dev
* commit 'b03b9759d3ec1f3dacde71314795a3451f67fbab':
Recover from missing upgrade to system package.
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 584827e..6224a9f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -176,11 +176,13 @@ import android.view.Display; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; +import java.io.BufferedReader; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; @@ -1554,6 +1556,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Prune any system packages that no longer exist. final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<String>(); + final ArrayMap<String, File> expectingBetter = new ArrayMap<>(); if (!mOnlyCore) { Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator(); while (psit.hasNext()) { @@ -1586,6 +1589,7 @@ public class PackageManagerService extends IPackageManager.Stub { + ", versionCode=" + ps.versionCode + "; scanned versionCode=" + scannedPkg.mVersionCode); removePackageLI(ps, true); + expectingBetter.put(ps.name, ps.codePath); } continue; @@ -1653,6 +1657,49 @@ public class PackageManagerService extends IPackageManager.Stub { } logCriticalInfo(Log.WARN, msg); } + + /** + * Make sure all system apps that we expected to appear on + * the userdata partition actually showed up. If they never + * appeared, crawl back and revive the system version. + */ + for (int i = 0; i < expectingBetter.size(); i++) { + final String packageName = expectingBetter.keyAt(i); + if (!mPackages.containsKey(packageName)) { + final File scanFile = expectingBetter.valueAt(i); + + logCriticalInfo(Log.WARN, "Expected better " + packageName + + " but never showed up; reverting to system"); + + final int reparseFlags; + if (FileUtils.contains(privilegedAppDir, scanFile)) { + reparseFlags = PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR + | PackageParser.PARSE_IS_PRIVILEGED; + } else if (FileUtils.contains(systemAppDir, scanFile)) { + reparseFlags = PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR; + } else if (FileUtils.contains(vendorAppDir, scanFile)) { + reparseFlags = PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR; + } else if (FileUtils.contains(oemAppDir, scanFile)) { + reparseFlags = PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR; + } else { + Slog.e(TAG, "Ignoring unexpected fallback path " + scanFile); + continue; + } + + mSettings.enableSystemPackageLPw(packageName); + + try { + scanPackageLI(scanFile, reparseFlags, scanFlags, 0, null); + } catch (PackageManagerException e) { + Slog.e(TAG, "Failed to parse original system package: " + + e.getMessage()); + } + } + } } // Now that we know all of the shared libraries, update all clients to have @@ -4196,7 +4243,7 @@ public class PackageManagerService extends IPackageManager.Stub { } logCriticalInfo(Log.WARN, "Package " + ps.name + " at " + scanFile - + "reverting from " + ps.codePathString + + " reverting from " + ps.codePathString + ": new version " + pkg.mVersionCode + " better than installed " + ps.versionCode); @@ -12163,6 +12210,7 @@ public class PackageManagerService extends IPackageManager.Stub { break; } opti++; + if ("-a".equals(opt)) { // Right now we only know how to print all. } else if ("-h".equals(opt)) { @@ -12509,6 +12557,21 @@ public class PackageManagerService extends IPackageManager.Stub { } } } + + if (checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES)) { + BufferedReader in = null; + String line = null; + try { + in = new BufferedReader(new FileReader(getSettingsProblemFile())); + while ((line = in.readLine()) != null) { + pw.print("msg,"); + pw.println(line); + } + } catch (IOException ignored) { + } finally { + IoUtils.closeQuietly(in); + } + } } } |