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
|
// rebooted in the middle of an operation that was removing something from
|
||||||
// this log, we sanity-check its contents here and reconstruct it.
|
// this log, we sanity-check its contents here and reconstruct it.
|
||||||
mEverStored = new File(mBaseStateDir, "processed");
|
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
|
// If there are previous contents, parse them out then start a new
|
||||||
// file to continue the recordkeeping.
|
// file to continue the recordkeeping.
|
||||||
if (mEverStored.exists()) {
|
if (mEverStored.exists()) {
|
||||||
DataOutputStream temp = null;
|
try (DataInputStream in = new DataInputStream(
|
||||||
DataInputStream in = null;
|
new BufferedInputStream(new FileInputStream(mEverStored)))) {
|
||||||
|
|
||||||
try {
|
|
||||||
temp = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(
|
|
||||||
tempProcessedFile)));
|
|
||||||
in = new DataInputStream(new BufferedInputStream(new FileInputStream(mEverStored)));
|
|
||||||
|
|
||||||
// Loop until we hit EOF
|
// Loop until we hit EOF
|
||||||
while (true) {
|
while (true) {
|
||||||
String pkg = in.readUTF();
|
String pkg = in.readUTF();
|
||||||
try {
|
mEverStoredApps.add(pkg);
|
||||||
// is this package still present?
|
if (MORE_DEBUG) Slog.v(TAG, " + " + pkg);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (EOFException e) {
|
} catch (EOFException e) {
|
||||||
// Once we've rewritten the backup history log, atomically replace the
|
// Done
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Slog.e(TAG, "Error in processed file", 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
|
// Persistently record the current and ancestral backup tokens as well
|
||||||
// as the set of packages with data [supposedly] available in the
|
// as the set of packages with data [supposedly] available in the
|
||||||
// ancestral dataset.
|
// ancestral dataset.
|
||||||
|
|||||||
Reference in New Issue
Block a user