Add more error checking to xml restore

Bad files and OS updates can cause the restore to throw an NPE.
Rather than bring down the server process over this, just delete
the persistent file and keep going.

Fixes bug 15219594.

Change-Id: Id9cd39988ff93a26def036a05c46209364f2a4c0
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index ba3f2fe..3bfaca9 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -155,6 +155,7 @@
             File taskFile = recentFiles[taskNdx];
             if (DEBUG) Slog.d(TAG, "restoreTasksLocked: taskFile=" + taskFile.getName());
             BufferedReader reader = null;
+            boolean deleteFile = false;
             try {
                 reader = new BufferedReader(new FileReader(taskFile));
                 final XmlPullParser in = Xml.newPullParser();
@@ -183,10 +184,9 @@
                     }
                     XmlUtils.skipCurrentTag(in);
                 }
-            } catch (IOException e) {
-                Slog.e(TAG, "Unable to parse " + taskFile + ". Error " + e);
-            } catch (XmlPullParserException e) {
-                Slog.e(TAG, "Unable to parse " + taskFile + ". Error " + e);
+            } catch (Exception e) {
+                Slog.wtf(TAG, "Unable to parse " + taskFile + ". Error " + e);
+                deleteFile = true;
             } finally {
                 if (reader != null) {
                     try {
@@ -194,6 +194,9 @@
                     } catch (IOException e) {
                     }
                 }
+                if (!DEBUG && deleteFile) {
+                    taskFile.delete();
+                }
             }
         }
 
@@ -220,7 +223,7 @@
         return new ArrayList<TaskRecord>(Arrays.asList(tasksArray));
     }
 
-    private void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds, File[] files) {
+    private static void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds, File[] files) {
         for (int fileNdx = 0; fileNdx < files.length; ++fileNdx) {
             File file = files[fileNdx];
             String filename = file.getName();
@@ -285,8 +288,7 @@
                 synchronized(mService) {
                     final ArrayList<TaskRecord> tasks = mService.mRecentTasks;
                     persistentTaskIds.clear();
-                    int taskNdx;
-                    for (taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
+                    for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
                         task = tasks.get(taskNdx);
                         if (DEBUG) Slog.d(TAG, "LazyTaskWriter: task=" + task + " persistable=" +
                                 task.isPersistable + " needsPersisting=" + task.needsPersisting);