From e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15 Mon Sep 17 00:00:00 2001 From: Ritesh Reddy Date: Wed, 3 Feb 2016 17:06:57 +0000 Subject: [PATCH] UsageStatsBackup Bug Fix Fixed a bug which caused a null pointer exception on restore in deleteDirectoryContents() method. Also made other cosmetic changes. Change-Id: I75712ec585fdfdbca462c468acf2229a47331b59 --- .../server/backup/UsageStatsBackupHelper.java | 23 +++-- .../server/usage/UsageStatsDatabase.java | 97 +++++++++++-------- 2 files changed, 70 insertions(+), 50 deletions(-) diff --git a/core/java/com/android/server/backup/UsageStatsBackupHelper.java b/core/java/com/android/server/backup/UsageStatsBackupHelper.java index bde2396780625..d6a70d369cdc6 100644 --- a/core/java/com/android/server/backup/UsageStatsBackupHelper.java +++ b/core/java/com/android/server/backup/UsageStatsBackupHelper.java @@ -2,11 +2,8 @@ package com.android.server.backup; import android.app.backup.BlobBackupHelper; -import android.app.usage.IUsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.content.Context; -import android.os.RemoteException; -import android.os.ServiceManager; import android.os.UserHandle; import android.util.Log; @@ -26,7 +23,7 @@ public class UsageStatsBackupHelper extends BlobBackupHelper { static final int BLOB_VERSION = 1; // Key under which the payload blob is stored - // same as UsageStatsBackupHelperAssistant.KEY_USAGE_STATS + // same as UsageStatsDatabase.KEY_USAGE_STATS static final String KEY_USAGE_STATS = "usage_stats"; public UsageStatsBackupHelper(Context context) { @@ -35,14 +32,15 @@ public class UsageStatsBackupHelper extends BlobBackupHelper { @Override protected byte[] getBackupPayload(String key) { - if(KEY_USAGE_STATS.equals(key)) { - UsageStatsManagerInternal localUsageStatsManager = LocalServices.getService(UsageStatsManagerInternal.class); + if (KEY_USAGE_STATS.equals(key)) { + UsageStatsManagerInternal localUsageStatsManager = + LocalServices.getService(UsageStatsManagerInternal.class); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(baos); - try{ + try { out.writeInt(UserHandle.USER_SYSTEM); out.write(localUsageStatsManager.getBackupPayload(UserHandle.USER_SYSTEM, key)); - } catch (IOException ioe){ + } catch (IOException ioe) { if (DEBUG) Log.e(TAG, "Failed to backup Usage Stats", ioe); baos.reset(); } @@ -55,14 +53,15 @@ public class UsageStatsBackupHelper extends BlobBackupHelper { @Override protected void applyRestoredPayload(String key, byte[] payload) { if (KEY_USAGE_STATS.equals(key)) { - UsageStatsManagerInternal localUsageStatsManager = LocalServices.getService(UsageStatsManagerInternal.class); + UsageStatsManagerInternal localUsageStatsManager = + LocalServices.getService(UsageStatsManagerInternal.class); DataInputStream in = new DataInputStream(new ByteArrayInputStream(payload)); - try{ + try { int user = in.readInt(); byte[] restoreData = new byte[payload.length - 4]; - in.read(restoreData, 0, payload.length-4); + in.read(restoreData, 0, restoreData.length); localUsageStatsManager.applyRestoredPayload(user, key, restoreData); - } catch (IOException ioe){ + } catch (IOException ioe) { if (DEBUG) Log.e(TAG, "Failed to restore Usage Stats", ioe); } } diff --git a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java index 87c5ba00fb922..849262e47045e 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java +++ b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java @@ -17,7 +17,6 @@ package com.android.server.usage; import android.app.usage.TimeSparseArray; -import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.os.Build; import android.util.AtomicFile; @@ -45,7 +44,7 @@ class UsageStatsDatabase { private static final int CURRENT_VERSION = 3; // Current version of the backup schema - static final int BACKUP_STATE_VERSION = 1; + static final int BACKUP_VERSION = 1; // Key under which the payload blob is stored // same as UsageStatsBackupHelper.KEY_USAGE_STATS @@ -536,6 +535,7 @@ class UsageStatsDatabase { * Update the stats in the database. They may not be written to disk immediately. */ public void putUsageStats(int intervalType, IntervalStats stats) throws IOException { + if (stats == null) return; synchronized (mLock) { if (intervalType < 0 || intervalType >= mIntervalDirs.length) { throw new IllegalArgumentException("Bad interval type " + intervalType); @@ -555,36 +555,44 @@ class UsageStatsDatabase { /* Backup/Restore Code */ - protected byte[] getBackupPayload(String key){ + byte[] getBackupPayload(String key) { synchronized (mLock) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (KEY_USAGE_STATS.equals(key)) { prune(System.currentTimeMillis()); DataOutputStream out = new DataOutputStream(baos); try { - out.writeInt(BACKUP_STATE_VERSION); + out.writeInt(BACKUP_VERSION); out.writeInt(mSortedStatFiles[UsageStatsManager.INTERVAL_DAILY].size()); - for(int i = 0; i BACKUP_VERSION) return; + + // Delete all stats files + // Do this after reading version and before actually restoring + for (int i = 0; i < mIntervalDirs.length; i++) { + deleteDirectoryContents(mIntervalDirs[i]); + } int fileCount = in.readInt(); - for(int i = 0; i