Merge "Do not remove uninstalled packages from journal" into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b152fb8d30
@@ -1448,52 +1448,23 @@ public class BackupManagerService implements BackupManagerServiceInterface {
|
||||
// rebooted in the middle of an operation that was removing something from
|
||||
// this log, we sanity-check its contents here and reconstruct it.
|
||||
mEverStored = new File(mBaseStateDir, "processed");
|
||||
File tempProcessedFile = new File(mBaseStateDir, "processed.new");
|
||||
|
||||
// If we were in the middle of removing something from the ever-backed-up
|
||||
// file, there might be a transient "processed.new" file still present.
|
||||
// Ignore it -- we'll validate "processed" against the current package set.
|
||||
if (tempProcessedFile.exists()) {
|
||||
tempProcessedFile.delete();
|
||||
}
|
||||
|
||||
// If there are previous contents, parse them out then start a new
|
||||
// file to continue the recordkeeping.
|
||||
if (mEverStored.exists()) {
|
||||
DataOutputStream temp = null;
|
||||
DataInputStream in = null;
|
||||
|
||||
try {
|
||||
temp = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(
|
||||
tempProcessedFile)));
|
||||
in = new DataInputStream(new BufferedInputStream(new FileInputStream(mEverStored)));
|
||||
try (DataInputStream in = new DataInputStream(
|
||||
new BufferedInputStream(new FileInputStream(mEverStored)))) {
|
||||
|
||||
// Loop until we hit EOF
|
||||
while (true) {
|
||||
String pkg = in.readUTF();
|
||||
try {
|
||||
// is this package still present?
|
||||
mPackageManager.getPackageInfo(pkg, 0);
|
||||
// if we get here then yes it is; remember it
|
||||
mEverStoredApps.add(pkg);
|
||||
temp.writeUTF(pkg);
|
||||
if (MORE_DEBUG) Slog.v(TAG, " + " + pkg);
|
||||
} catch (NameNotFoundException e) {
|
||||
// nope, this package was uninstalled; don't include it
|
||||
if (MORE_DEBUG) Slog.v(TAG, " - " + pkg);
|
||||
}
|
||||
mEverStoredApps.add(pkg);
|
||||
if (MORE_DEBUG) Slog.v(TAG, " + " + pkg);
|
||||
}
|
||||
} catch (EOFException e) {
|
||||
// Once we've rewritten the backup history log, atomically replace the
|
||||
// old one with the new one then reopen the file for continuing use.
|
||||
if (!tempProcessedFile.renameTo(mEverStored)) {
|
||||
Slog.e(TAG, "Error renaming " + tempProcessedFile + " to " + mEverStored);
|
||||
}
|
||||
// Done
|
||||
} catch (IOException e) {
|
||||
Slog.e(TAG, "Error in processed file", e);
|
||||
} finally {
|
||||
try { if (temp != null) temp.close(); } catch (IOException e) {}
|
||||
try { if (in != null) in.close(); } catch (IOException e) {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2240,44 +2211,6 @@ public class BackupManagerService implements BackupManagerServiceInterface {
|
||||
}
|
||||
}
|
||||
|
||||
// Remove our awareness of having ever backed up the given package
|
||||
void removeEverBackedUp(String packageName) {
|
||||
if (DEBUG) Slog.v(TAG, "Removing backed-up knowledge of " + packageName);
|
||||
if (MORE_DEBUG) Slog.v(TAG, "New set:");
|
||||
|
||||
synchronized (mEverStoredApps) {
|
||||
// Rewrite the file and rename to overwrite. If we reboot in the middle,
|
||||
// we'll recognize on initialization time that the package no longer
|
||||
// exists and fix it up then.
|
||||
File tempKnownFile = new File(mBaseStateDir, "processed.new");
|
||||
RandomAccessFile known = null;
|
||||
try {
|
||||
known = new RandomAccessFile(tempKnownFile, "rws");
|
||||
mEverStoredApps.remove(packageName);
|
||||
for (String s : mEverStoredApps) {
|
||||
known.writeUTF(s);
|
||||
if (MORE_DEBUG) Slog.v(TAG, " " + s);
|
||||
}
|
||||
known.close();
|
||||
known = null;
|
||||
if (!tempKnownFile.renameTo(mEverStored)) {
|
||||
throw new IOException("Can't rename " + tempKnownFile + " to " + mEverStored);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// Bad: we couldn't create the new copy. For safety's sake we
|
||||
// abandon the whole process and remove all what's-backed-up
|
||||
// state entirely, meaning we'll force a backup pass for every
|
||||
// participant on the next boot or [re]install.
|
||||
Slog.w(TAG, "Error rewriting " + mEverStored, e);
|
||||
mEverStoredApps.clear();
|
||||
tempKnownFile.delete();
|
||||
mEverStored.delete();
|
||||
} finally {
|
||||
try { if (known != null) known.close(); } catch (IOException e) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Persistently record the current and ancestral backup tokens as well
|
||||
// as the set of packages with data [supposedly] available in the
|
||||
// ancestral dataset.
|
||||
|
||||
Reference in New Issue
Block a user