Add some global metadata to the restore set

In addition to the signatures of each participating application, we now also
store the versionCode of each backed-up package, plus the OS version running on
the device that contributed the backup set.  We also refuse to process a backup
from a later OS revision to an earlier one, or from a later app version to an
earlier.

LocalTransport has been modified as well to be more resilient to changes in the
system's use of metadata pseudopackages.
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index 3ef8666..3dd71f3 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -170,18 +170,13 @@
         // The restore set is the concatenation of the individual record blobs,
         // each of which is a file in the package's directory
         File[] blobs = packageDir.listFiles();
+        if (DEBUG) Log.v(TAG, "   found " + blobs.length + " key files");
         int err = 0;
         if (blobs != null && blobs.length > 0) {
             BackupDataOutput out = new BackupDataOutput(outFd.getFileDescriptor());
             try {
                 for (File f : blobs) {
-                    FileInputStream in = new FileInputStream(f);
-                    int size = (int) f.length();
-                    byte[] buf = new byte[size];
-                    in.read(buf);
-                    String key = new String(Base64.decode(f.getName()));
-                    out.writeEntityHeader(key, size);
-                    out.writeEntityData(buf, size);
+                    copyToRestoreData(f, out);
                 }
             } catch (Exception e) {
                 Log.e(TAG, "Unable to read backup records");
@@ -190,4 +185,16 @@
         }
         return err;
     }
+
+    private void copyToRestoreData(File f, BackupDataOutput out) throws IOException {
+        FileInputStream in = new FileInputStream(f);
+        int size = (int) f.length();
+        byte[] buf = new byte[size];
+        in.read(buf);
+        String key = new String(Base64.decode(f.getName()));
+        if (DEBUG) Log.v(TAG, "   ... copy to stream: key=" + key
+                + " size=" + size);
+        out.writeEntityHeader(key, size);
+        out.writeEntityData(buf, size);
+    }
 }