)]}'
{
  "log": [
    {
      "commit": "763a9f96e8af2aba351ff0810ac015b245e14479",
      "tree": "d28526017160157ef9eeebf0bfe450b4ec982c6d",
      "parents": [
        "fa0556943ee386e83d190f1de86d73d81e08cc8a"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Sat Sep 14 20:33:13 2013 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Sat Sep 14 20:33:13 2013 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: Iedddc6498eb09ce99ae5ffbc60c2069d4373b3e5\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "f310fb8e3d6f80b90a8f87de85e9a03003791fad",
      "tree": "161ad789218d08f2c6a8d63827fd0e665a9cccdf",
      "parents": [
        "f296e317fb44ac33fe5294fcfe0cc1218ca5b86c"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Thu Aug 01 10:55:36 2013 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Thu Aug 01 10:55:36 2013 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I400da658acf872787f81dc223a4c3cf40ceb2f50\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "cbc9afdcd55e37da7d1385e0bf5259b5bf7e736a",
      "tree": "35e9eb1486fe0312d7fb4f2d82535bfa8ef87ff1",
      "parents": [
        "fb20eb48aa95e438750fe2a32cd0b86897c71b4b"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Wed Jul 10 18:41:54 2013 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Wed Jul 10 18:41:54 2013 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I3560b16b347b71c61ad1f723d444dbd056ee0d8f\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "ccbf84f44c9e6a5ed3c08673614826bb237afc54",
      "tree": "854e35665f7754b3b0d1b4aaadc7b4927c3ea9ce",
      "parents": [
        "4ffa23379f95771fcdc63a2e35586b7e2c0b23a5"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed May 08 15:25:41 2013 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Jun 17 12:47:35 2013 -0700"
      },
      "message": "Some system apps are more system than others\n\n\"signatureOrSystem\" permissions are no longer available to all apps\nresiding en the /system partition.  Instead, there is a new /system/priv-app\ndirectory, and only apps whose APKs are in that directory are allowed\nto use signatureOrSystem permissions without sharing the platform cert.\nThis will reduce the surface area for possible exploits of system-\nbundled applications to try to gain access to permission-guarded\noperations.\n\nThe ApplicationInfo.FLAG_SYSTEM flag continues to mean what it is\nsays in the documentation: it indicates that the application apk was\nbundled on the /system partition.  A new hidden flag FLAG_PRIVILEGED\nhas been introduced that reflects the actual right to access these\npermissions.\n\nAt some point the \"system\" permission category will be\nrenamed to \"privileged\".\n\nBug 8765951\n\nChange-Id: I6f0fd9cdb9170e076dfc66d83ecea76f8dd7335d\n"
    },
    {
      "commit": "0d7105bbc743ad6584a3138d85b4ecf7667f3814",
      "tree": "9baca1e2393b378c7d1452fe3ff0afdd27e3e65a",
      "parents": [
        "323efd55d3e5cd14441e393f6c4b00280e60127b"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Mon Apr 22 09:07:22 2013 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Mon Apr 22 09:07:22 2013 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I6ac969ffc6fbffeb262ec79b14a4155f2123d82d\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "351600ec71c6dac4a2637e7e6ee1d9037ea17240",
      "tree": "ad247738d33dd9d9d0781de60ddc802273e611f6",
      "parents": [
        "ff4fcdb98c9575642c48f1daeafff4b257769e81"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Mon Feb 25 08:53:09 2013 -0800"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Mon Feb 25 08:53:09 2013 -0800"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: Ie31e6632a217b9b9c7c0ebb79b16747830370db1\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "d5c11daa5347c8f6c16965613ae2d6ad9cb0ed65",
      "tree": "de77db90b48aa1b7c095824539f362719fcfaae5",
      "parents": [
        "b637322fd0dbf9402d84bedee891b813728656c0"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Tue Nov 27 13:00:43 2012 -0800"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Tue Nov 27 13:00:43 2012 -0800"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I830962076909bd65156b0e56bc8b9a4f44b7b249\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "02c189eaba6073860400d292d0d1c5af8b0f19e6",
      "tree": "a1c5730e48b412a94d7cba49426e7b8c13df2229",
      "parents": [
        "6f249d9965f57c2b85d8c2f8d2abc98fc2a3a555"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Thu Nov 22 22:07:06 2012 -0800"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Thu Nov 22 22:07:06 2012 -0800"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I2f901cb989904c4325c2064428e4b8b0b2225d06\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "55b16ebb44dd676a379327de57fff0886f175ba8",
      "tree": "31eb7286390ee2e1ea5762dddc0ca71883f6e5d8",
      "parents": [
        "bd2000d35fa6d9ecc57101e0c065a27e992fc8b4"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Wed Oct 03 19:38:55 2012 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Wed Oct 03 19:38:55 2012 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: Ied34352ea4e79b01a9b8549596a381fe08ee7e06\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "5e7f72e3548a054e7ff82ec3b7d594bf24b3b6f6",
      "tree": "bb2cf3b5a7fd22c165e24ca6e958723cbf000a7a",
      "parents": [
        "d28c3643a60853dfd4cdf71496a5ab4aabd6fb43"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Wed Sep 26 17:08:16 2012 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Wed Sep 26 17:08:16 2012 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I8b0d4f8146956bb0569ec01ef0872ad0a7065f0c\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "4110109cd785d0ca314b3a504eaccc7c2a1b659b",
      "tree": "93593c4c063eb0942634b147162ab3f4b5305112",
      "parents": [
        "7ff2cadd345f7b40945dc69380e8e9cc0c34bcc2"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Thu Sep 13 12:10:37 2012 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Thu Sep 13 12:10:37 2012 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I819f42df4c6909d695e78420670d76919a497c06\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "1104fadd768bf42970da909099f8206c18dd4458",
      "tree": "9b221e377aed3396822a1d2a65acaf594e17d2e1",
      "parents": [
        "ed9a65656548e454fdd4a6d78ce208d95486086f"
      ],
      "author": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Tue Aug 28 13:34:07 2012 -0700"
      },
      "committer": {
        "name": "Baligh Uddin",
        "email": "baligh@google.com",
        "time": "Tue Aug 28 13:34:07 2012 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I37cdf72141038d6677c0ffe3f1ef6f65bf6fd78a\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "a854bd28df003999c85cd277e3104c5a78bfde95",
      "tree": "e157654170b6420500bab95e51c417175a37202b",
      "parents": [
        "0351b54e90cbf56d7facf6bb9f98882500acca16"
      ],
      "author": {
        "name": "Ying Wang",
        "email": "wangying@google.com",
        "time": "Wed Aug 01 13:08:43 2012 -0700"
      },
      "committer": {
        "name": "Ying Wang",
        "email": "wangying@google.com",
        "time": "Wed Aug 01 13:08:43 2012 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: I4036c81a0a932e366969e9e333bbe3c5d46a9cd8\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "e2e24f8dd7dc43738d09365bcf61f3e458af05d2",
      "tree": "d0ee3d5a20d145778bb0a33d89cca32086e374f9",
      "parents": [
        "87e8b25ea3c95be5921a79c65fbf4060de2e2e84"
      ],
      "author": {
        "name": "Ying Wang",
        "email": "wangying@google.com",
        "time": "Fri Jul 13 11:57:48 2012 -0700"
      },
      "committer": {
        "name": "Ying Wang",
        "email": "wangying@google.com",
        "time": "Fri Jul 13 11:57:48 2012 -0700"
      },
      "message": "Import translations. DO NOT MERGE\n\nChange-Id: Iabb056f645a910f3fbaea1e51348c3bef385546e\nAuto-generated-cl: translation import\n"
    },
    {
      "commit": "a23b343299783e5990370579cfc7d93e62dacb8d",
      "tree": "e0050572e321d7b3bbf1ac22e0e84a93bc13bfb0",
      "parents": [
        "9492947a5970325c494872324078b898868b9403"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Apr 12 16:38:02 2012 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Apr 12 17:52:03 2012 -0700"
      },
      "message": "Fix full backup/restore detection of encrypted devices\n\nThe confirmation UI did not request the needed permission, so was failing\nto communicate with the mount service; as a \"safe\" failure mode, it was\nassuming the device was encrypted.  Fixed; now it presents the correct\nprompt text for the device\u0027s encryption state.\n\nBug 5958195\n\nChange-Id: Ic03db16673b89d3377e0362a09cf51bfb572d78b\n"
    },
    {
      "commit": "4a97ebfec5ff24fd34cdb354f0e85ca1279035f8",
      "tree": "980d98e173a1c6d74e5953521de97de7694d6948",
      "parents": [
        "31825c119907af5b24dc916df56a3efd2715af79"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Nov 29 10:29:25 2011 -0800"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Nov 29 10:29:25 2011 -0800"
      },
      "message": "Import revised translations.\n\nChange-Id: Ie43246df49b8f6ef3daef12e0d8fb5c2f573874e\n"
    },
    {
      "commit": "2fbd56a652f29e7a54f7aaab25ea031a1f8decb0",
      "tree": "7a7dcc8ec47c29dd12ac55d7912b1e931de6f13a",
      "parents": [
        "fe5f0aae6546ff673a6f01298f427bcd568bdd1a"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Wed Nov 02 09:41:15 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Wed Nov 02 09:41:15 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: I71efb16f2c6b257dfd444728c7e56ada662e6f77\n"
    },
    {
      "commit": "0af56a5d4c7f60326c4efb86bf25d12c956d9586",
      "tree": "e3b3af73e86883ea0fea9a8a5a11727d8749d1e0",
      "parents": [
        "723fe12644c7758772cb0b119cfcf73b30a6e4e0"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Oct 25 10:36:46 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Oct 25 10:36:46 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: I5db0a5df334833af2e2109123d05a9f76c745cf6\n"
    },
    {
      "commit": "b0d150aa53ad34ea0a5b0da74bbdeb9ecd5a46b7",
      "tree": "2370b4dc7c81ff7880e1871a74353e263281bc25",
      "parents": [
        "b5c45e00967b9d0a6411098a598ad6b40f3b2074"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Oct 18 15:03:21 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Oct 18 15:03:21 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: I83ab00ec220b7c0ba0d37e7f4c91e945e35aab39\n"
    },
    {
      "commit": "32418be49e5b61c2e9281528cb8fb67939e301e8",
      "tree": "6233d62e90ac6f418a4b6c620c85b0cb61b093a8",
      "parents": [
        "3b16c9a5b4b1e12332ce8b3e9ccec60d6a5fc7bb"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Oct 10 13:51:12 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Oct 13 12:29:32 2011 -0700"
      },
      "message": "Require device encryption password to perform adb backup/restore\n\nThis supersedes any backup-password that the user might supply.  Per\ndesign, the device encryption password is also always used to encrypt\nthe backup archive.\n\nThe CL introduces two new strings, used for prompting the user for\ntheir device encryption password rather than their settings-defined\n\"backup password\" when confirming a full backup or restore operation.\n\nBug 5382487\n\nChange-Id: I0b03881b45437c944eaf636b6209278e1bba7a9f\n"
    },
    {
      "commit": "03e9d8ae0759289f4474227382caa898f398c636",
      "tree": "10e31510d1b8273a0ac5579adbcde76360253229",
      "parents": [
        "41c95f3642323ec4cfdc84a3bb70537af0da8cca"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Oct 07 16:09:10 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Oct 07 16:09:10 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: Id046f8008aef32a1b94b4fa5b57e2beb2f9f2e80\n"
    },
    {
      "commit": "d3530ac774028c8d71c7ffb49033100d10056623",
      "tree": "f3ae02b0913828ad61df7d8e19f8f3135f14fbba",
      "parents": [
        "df4a97ede4a4aa878b91c3f81e1bfc05c4b75551"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Sep 30 16:32:04 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Sep 30 16:32:04 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: Ic8e228878fde375b90797c6e344fcb3114180f1d\n"
    },
    {
      "commit": "50c83888a6d1ef1ba2515e3f20bbc740c6cd1efa",
      "tree": "a2e4df2689fb853d081e4c6f8086f636776ca1dc",
      "parents": [
        "bb132eba71bc12a88416df01e2df539820c2d607"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Sep 20 10:21:56 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Tue Sep 20 10:21:56 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: I5e375bebc8f74d9108a929246f16608427ce9317\n"
    },
    {
      "commit": "28b591c2a416d7f5955371970272bcaa2b1b303e",
      "tree": "7a0403845290806411f3052f60cbec2650b5afa0",
      "parents": [
        "f9fa7543b12b4c54ee21f205b7d537494dbbbdf1"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Sep 14 17:34:52 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Sep 14 17:34:52 2011 -0700"
      },
      "message": "Use string resources instead of inline literals for progress toasts\n\n...in the full backup/restore confirmation UI.\n\nChange-Id: I858a2d7017450f016afe5052aa37161a1c89c281\n"
    },
    {
      "commit": "c58cf7dd02ad227a68d62a0204152cee62c13182",
      "tree": "5e73b0f770f20d60a7a12a7b959cff289c0fb1b4",
      "parents": [
        "651cdfcbac6245f570475991588ddc2d30265e8d"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Sep 13 17:51:18 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Sep 13 17:51:18 2011 -0700"
      },
      "message": "Give backup/restore confirmation a proper window title\n\nSince the confirmation uses the same Activity but different layouts\nfor the backup vs restore cases, we have to do the title in code.\n\nAlong the way, fix the restore layout\u0027s padding [the backup layout\nwas already right].\n\nFixes bug 5164470\n\nChange-Id: I4d636f666d97fc377e9cf36abf08d1625a05577f\n"
    },
    {
      "commit": "78cc91aa7d68f63bdfb3f1a61123f34df5a9ef4b",
      "tree": "ac7aa7725f45d87cd6e4b33f59f3dc439f7d6a71",
      "parents": [
        "d67ff5c41d9267dab101f46476474813eb94bfa4"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Mon Sep 12 09:48:06 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Mon Sep 12 09:48:06 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: I6e7f33ff16557f7e9088c0aa66fd1c79ed376c75\n"
    },
    {
      "commit": "5820aeee0b101843445050f594dad82c7dde4b81",
      "tree": "36137d181fbc5b8bfb03a3a48fb75c0bbc23530f",
      "parents": [
        "52f159c79e4ed3367a929f4bc34ab3e184f82a15"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Sep 02 14:44:12 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Sep 02 14:44:12 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: Iac73006cfaf846d210855496f6732cbdc6ad0de8\n"
    },
    {
      "commit": "6a5134397541af058e1128baebe0451ae4befce8",
      "tree": "ac770362eabecc01099fcb383a57e6753a0ed149",
      "parents": [
        "d0b6ad9ec925bdc5b9ff4d125e76b32ab69c1563"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Aug 26 14:49:23 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Fri Aug 26 14:49:23 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: I51e1fc94b7fa3fec13f7dddad62b978dd9a71d43\n"
    },
    {
      "commit": "8da527d8435beda54b83e117c718c5d145c94ecd",
      "tree": "801776d718fb5bfb6033756f0cf6cadda7b4ec18",
      "parents": [
        "c3ccfb8eec47cdc0911c35b387d17659af25fbe9"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Mon Aug 22 11:09:13 2011 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Mon Aug 22 11:09:13 2011 -0700"
      },
      "message": "Import revised translations.\n\nChange-Id: I51335fa15a40d471010dbcc96e228b170f06ce7e\n"
    },
    {
      "commit": "3851fa9c8d180ca636e69b25f84fdcc294150009",
      "tree": "07bb8da05949e5481ece0c38c091fd0df6ff4263",
      "parents": [
        "e83af902c4ed1f0f1afb1b4f6f26a8003aca4954"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Aug 05 12:28:15 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Aug 05 13:18:08 2011 -0700"
      },
      "message": "Handle rotation gracefully in the backup/restore confirmation UI\n\nWe now don\u0027t automatically deny the operation if stopped, but instead\nallow the activity to be destroyed and recreated as usual.  We retain\nthe observer instance across that sequence so we keep getting progress\nreports etc.\n\nThe UI now also uses the spiffy new button bar styles, and positions\nthe deny / confirm buttons according to ICS standards.\n\nBug 5115411\n\nChange-Id: Ie760a0c8496c69f9d5881273a63ad5b5b76ff554\n"
    },
    {
      "commit": "31deacf6f59be3633a4bcdb9359b2f9f750de527",
      "tree": "4d843cbe6114531b02e0406a147d88e90d7b189c",
      "parents": [
        "9a3cf8c634c23907964041190bd5aaed4d437461"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Aug 03 17:29:53 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Aug 03 17:31:52 2011 -0700"
      },
      "message": "Make backup/restore confirmation UI landscape-friendly\n\nNow the textual content and password fields are placed in scroll view,\nand the confirm/deny buttons pinned at the bottom of the layout.\nPreviously, in landscape mode on some devices the buttons would be\npushed off screen.\n\nBug 5115411\n\nChange-Id: I8bf8fd1516735bf6111893df79636b519dbfb803\n"
    },
    {
      "commit": "728a1c4d5ed3b808172013a7f5bb5065d1e964f6",
      "tree": "eb16210cfa98555355889022de17568effac8c2f",
      "parents": [
        "80df829e35d0a97f92e599d36b0b16dcc956130b"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 28 18:03:03 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 28 18:04:07 2011 -0700"
      },
      "message": "Require the current backup pw in all backup/restore operations\n\nSpecifically, we now also require the current password to confirm any\nrestore operation.\n\nBug 4901637\n\nChange-Id: I39ecce7837f70cd05778cb7e0e6390ad8f6fe3f3\n"
    },
    {
      "commit": "2efd2dbbac9eac89620683696c6076463c3a1cd6",
      "tree": "ca48adf4208daee43a4444a0fdb61fcb939858c5",
      "parents": [
        "b7d95a46dfacf04896d5b084f13bcbe6eab33633"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jul 19 16:32:49 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Jul 28 16:01:20 2011 -0700"
      },
      "message": "Support full-backup encryption and global backup password\n\nIf the user has supplied a backup password in Settings, that password\nis validated during the full backup process and is used as an encryption\nkey for encoding the backed-up data itself.  This is the fundamental\nmechanism whereby users can secure their data even against malicious\nparties getting physical unlocked access to their device.\n\nTechnically the user-supplied password is not used as the encryption\nkey for the backed-up data itself.  What is actually done is that a\nrandom key is generated to use as the raw encryption key.  THAT key,\nin turn, is encrypted with the user-supplied password (after random\nsalting and key expansion with PBKDF2).  The encrypted master key\nand a checksum are stored in the backup header.  At restore time,\nthe user supplies their password, which allows the system to decrypt\nthe master key, which in turn allows the decryption of the backup\ndata itself.\n\nThe checksum is part of the archive in order to permit validation\nof the user-supplied password.  The checksum is the result of running\nthe user-supplied password through PBKDF2 with a randomly selected\nsalt.  At restore time, the proposed password is run through PBKDF2\nwith the salt described by the archive header.  If the result does\nnot match the archive\u0027s stated checksum, then the user has supplied\nthe wrong decryption password.\n\nAlso, suppress backup consideration for a few packages whose\ndata is either nonexistent or inapplicable across devices or\nfactory reset operations.\n\nBug 4901637\n\nChange-Id: Id0cc9d0fdfc046602b129f273d48e23b7a14df36\n"
    },
    {
      "commit": "ec5d4a0f9765f1645ab2e28ad2ef3cad247a042b",
      "tree": "6cec225eb6cad8b0e3adb5447a10b151680f4f84",
      "parents": [
        "65abc4531f1222ffa04350a3afc6d61fcc77b2a3"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jun 07 15:35:45 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Jun 07 15:35:45 2011 -0700"
      },
      "message": "Don\u0027t ack/nak backup redundantly at exit\n\nChange-Id: I7293518bc2fe6c66270a7c8aea3bf0c0829754e4\n"
    },
    {
      "commit": "a858cb075d0c87e2965d401656ff2d5bc16406da",
      "tree": "a184d02d871a906a5b3192bcec5f3495a2a97f21",
      "parents": [
        "507fc54924af53635e8d5520e5836c046af00775"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Jun 03 12:27:51 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Jun 03 14:06:46 2011 -0700"
      },
      "message": "Respect android:allowBackup\u003d\"false\" during full backup \u0026 restore\n\nPackages with this manifest attribute set \u0027false\u0027 will not be backed\nup even through the \"full device backup\" infrastructure.  If someone\nproduces an apparent restore file with data for such an application,\nit will not actually be restored onto the device.\n\nWhen an apk is installed during the course of a restore operation,\nit is validated against the manifest contents and deleted if there\nis a mismatch.  Also, if the newly-installed app is found to\ndisallow backups, no file content will be processed for that app.\n\nBug 4532159\n\nChange-Id: I59630054584b1394e567de939192e22e597044ee\n"
    },
    {
      "commit": "e42a6058d43742fb0b51568ff6bd42f75bd34201",
      "tree": "2cf7e66ab7b217145c049141304a523e8862ad29",
      "parents": [
        "ca680af21b15ec51f31d294f2f1fe0110562fdfe"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Jun 01 16:41:49 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Jun 01 16:43:45 2011 -0700"
      },
      "message": "Filter backup/restore confirmation buttons when obscured\n\nI.e. don\u0027t let people fake the user out by putting some other UI over\nthe top of it in order to phish for a confirmation.\n\nAddresses bug 4521629\n\nChange-Id: I40ae057ebedeb92ed264fb52fa1c7c297c9d3ec2\n"
    },
    {
      "commit": "75a99709accef8cf221fd436d646727e7c8dd1f1",
      "tree": "9ce16dbf95890e8dad57d63724a6cdb3d36d6fb9",
      "parents": [
        "2978cef0a77550ea3a364ffbf42fc43f2029070e"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed May 18 16:28:19 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Jun 01 15:09:55 2011 -0700"
      },
      "message": "Restore from a previous full backup\u0027s tarfile\n\nUsage:  adb restore [tarfilename]\n\nRestores app data [and installs the apps if necessary from the backup\nfile] captured in a previous invocation of \u0027adb backup\u0027.  The user\nmust explicitly acknowledge the action on-device before it is allowed\nto proceed; this prevents any \"invisible\" pushes of content from the\nhost to the device.\n\nKnown issues:\n\n* The settings databases and wallpaper are saved/restored, but lots\n  of other system state is not yet captured in the full backup.  This\n  means that for practical purposes this is usable for 3rd party\n  apps at present but not for full-system cloning/imaging.\n\nChange-Id: I0c748b645845e7c9178e30bf142857861a64efd3\n"
    },
    {
      "commit": "dc92c82b4180e8067f1acd00a7db7935afce00ff",
      "tree": "4c108ce188aba5c0f2df9c8746fcabe981a47e64",
      "parents": [
        "83a7cdc56539d00933c2e25999620cec94c524b6"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri May 13 15:38:02 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri May 13 15:38:02 2011 -0700"
      },
      "message": "Full backup tweaks\n\n* provide placeholder UI showing backup/restore start/stop/timeout\n* don\u0027t kill the progress UI in mid stream\n* tidy up the pax extended header data writing a little\n\nChange-Id: Ife0cb78e3facb541d8327f1d5ca5fe77faa6cbca\n"
    },
    {
      "commit": "4a627c71ff53a4fca1f961f4b1dcc0461df18a06",
      "tree": "270190b1e030424210b6375ca886c45db10c4fb6",
      "parents": [
        "2bb51bb203c117649db10ad8bd497f199ca797b0"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Apr 01 14:43:32 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue May 10 17:52:51 2011 -0700"
      },
      "message": "Full local backup infrastructure\n\nThis is the basic infrastructure for pulling a full(*) backup of the\ndevice\u0027s data over an adb(**) connection to the local device.  The\nbasic process consists of these interacting pieces:\n\n1. The framework\u0027s BackupManagerService, which coordinates the\n   collection of app data and routing to the destination.\n\n2. A new framework-provided BackupAgent implementation called\n   FullBackupAgent, which is instantiated in the target applications\u0027\n   processes in turn, and knows how to emit a datastream that contains\n   all of the app\u0027s saved data files.\n\n3. A new shell-level program called \"bu\" that is used to bridge from\n   adb to the framework\u0027s Backup Manager.\n\n4. adb itself, which now knows how to use \u0027bu\u0027 to kick off a backup\n   operation and pull the resulting data stream to the desktop host.\n\n5. A system-provided application that verifies with the user that\n   an attempted backup/restore operation is in fact expected and to\n   be allowed.\n\nThe full agent implementation is not used during normal operation of\nthe delta-based app-customized remote backup process.  Instead it\u0027s\nused during user-confirmed *full* backup of applications and all their\ndata to a local destination, e.g. via the adb connection.\n\nThe output format is \u0027tar\u0027.  This makes it very easy for the end\nuser to examine the resulting dataset, e.g. for purpose of extracting\nfiles for debug purposes; as well as making it easy to contemplate\nadding things like a direct gzip stage to the data pipeline during\nbackup/restore.  It also makes it convenient to construct and maintain\nsynthetic backup datasets for testing purposes.\n\nWithin the tar format, certain artificial conventions are used.\nAll files are stored within top-level directories according to\ntheir semantic origin:\n\napps/pkgname/a/  : Application .apk file itself\napps/pkgname/obb/: The application\u0027s associated .obb containers\napps/pkgname/f/  : The subtree rooted at the getFilesDir() location\napps/pkgname/db/ : The subtree rooted at the getDatabasePath() parent\napps/pkgname/sp/ : The subtree rooted at the getSharedPrefsFile() parent\napps/pkgname/r/  : Files stored relative to the root of the app\u0027s file tree\napps/pkgname/c/  : Reserved for the app\u0027s getCacheDir() tree; not stored.\n\nFor each package, the first entry in the tar stream is a file called\n\"_manifest\", nominally rooted at apps/pkgname.  This file contains some\nmetadata about the package whose data is stored in the archive.\n\nThe contents of shared storage can optionally be included in the tar\nstream. It is placed in the synthetic location:\n\nshared/...\n\nuid/gid are ignored; app uids are assigned at install time, and the\napp\u0027s data is handled from within its own execution environment, so\nwill automatically have the app\u0027s correct uid.\n\nForward-locked .apk files are never backed up.  System-partition\n.apk files are not backed up unless they have been overridden by a\npost-factory upgrade, in which case the current .apk *is* backed up --\ni.e. the .apk that matches the on-disk data.  The manifest preceding\neach application\u0027s portion of the tar stream provides version numbers\nand signature blocks for version checking, as well as an indication\nof whether the restore logic should expect to install the .apk before\nextracting the data.\n\nSystem packages can designate their own full backup agents.  This is\nto manage things like the settings provider which (a) cannot be shut\ndown on the fly in order to do a clean snapshot of their file trees,\nand (b) manage data that is not only irrelevant but actively hostile\nto non-identical devices -- CDMA telephony settings would seriously\nmess up a GSM device if emplaced there blind, for example.\n\nWhen a full backup or restore is initiated from adb, the system will\npresent a confirmation UI that the user must explicitly respond to\nwithin a short [~ 30 seconds] timeout.  This is to avoid the\npossibility of malicious desktop-side software secretly grabbing a copy\nof all the user\u0027s data for nefarious purposes.\n\n(*) The backup is not strictly a full mirror.  In particular, the\n    settings database is not cloned; it is handled the same way that\n    it is in cloud backup/restore.  This is because some settings\n    are actively destructive if cloned onto a different (or\n    especially a different-model) device: telephony settings and\n    AndroidID are good examples of this.\n\n(**) On the framework side it doesn\u0027t care that it\u0027s adb; it just\n    sends the tar stream to a file descriptor.  This can easily be\n    retargeted around whatever transport we might decide to use\n    in the future.\n\nKNOWN ISSUES:\n\n* the security UI is desperately ugly; no proper designs have yet\n  been done for it\n* restore is not yet implemented\n* shared storage backup is not yet implemented\n* symlinks aren\u0027t yet handled, though some infrastructure for\n  dealing with them has been put in place.\n\nChange-Id: Ia8347611e23b398af36ea22c36dff0a276b1ce91\n"
    }
  ]
}
