From 98b8d31add0109b93b931ebc34f5a804f4940691 Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Wed, 10 May 2017 16:31:21 -0700 Subject: [PATCH] Use buffered DataInputStream vs RandomAccessFile Switching to buffered streams saved up to 50% of BackupManagerService.onUnlockUser time: Before: SystemServiceManager: Service com.android.server.backup.BackupManagerService$Lifecycle took 389 ms in onUnlockUser SystemServiceManager: Service com.android.server.backup.BackupManagerService$Lifecycle took 380 ms in onUnlockUser After: SystemServiceManager: Service com.android.server.backup.BackupManagerService$Lifecycle took 178 ms in onUnlockUser SystemServiceManager: Service com.android.server.backup.BackupManagerService$Lifecycle took 155 ms in onUnlockUser Test: manual Bug: 37686433 Change-Id: I41185a88e8377b434fab6a3bf1fd7086758127cd --- .../server/backup/BackupManagerService.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index d1a43d23f84f1..3f8d5083f1047 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -1397,23 +1397,22 @@ public class BackupManagerService { // Remember our ancestral dataset mTokenFile = new File(mBaseStateDir, "ancestral"); - try { - RandomAccessFile tf = new RandomAccessFile(mTokenFile, "r"); - int version = tf.readInt(); + try (DataInputStream tokenStream = new DataInputStream(new BufferedInputStream( + new FileInputStream(mTokenFile)))) { + int version = tokenStream.readInt(); if (version == CURRENT_ANCESTRAL_RECORD_VERSION) { - mAncestralToken = tf.readLong(); - mCurrentToken = tf.readLong(); + mAncestralToken = tokenStream.readLong(); + mCurrentToken = tokenStream.readLong(); - int numPackages = tf.readInt(); + int numPackages = tokenStream.readInt(); if (numPackages >= 0) { - mAncestralPackages = new HashSet(); + mAncestralPackages = new HashSet<>(); for (int i = 0; i < numPackages; i++) { - String pkgName = tf.readUTF(); + String pkgName = tokenStream.readUTF(); mAncestralPackages.add(pkgName); } } } - tf.close(); } catch (FileNotFoundException fnf) { // Probably innocuous Slog.v(TAG, "No ancestral data"); @@ -1437,12 +1436,13 @@ public class BackupManagerService { // If there are previous contents, parse them out then start a new // file to continue the recordkeeping. if (mEverStored.exists()) { - RandomAccessFile temp = null; - RandomAccessFile in = null; + DataOutputStream temp = null; + DataInputStream in = null; try { - temp = new RandomAccessFile(tempProcessedFile, "rws"); - in = new RandomAccessFile(mEverStored, "r"); + temp = new DataOutputStream(new BufferedOutputStream(new FileOutputStream( + tempProcessedFile))); + in = new DataInputStream(new BufferedInputStream(new FileInputStream(mEverStored))); // Loop until we hit EOF while (true) {