)]}'
{
  "log": [
    {
      "commit": "114e8994a854da69adab006a8a7c3b27c4dbdcb9",
      "tree": "cdc8a863505fe3aefc78956446e02bc8073c02dd",
      "parents": [
        "f860be88a9c8fca910f2d97694d102f627d06c71"
      ],
      "author": {
        "name": "Nicolas Prevot",
        "email": "nprevot@google.com",
        "time": "Fri Aug 22 12:03:59 2014 +0100"
      },
      "committer": {
        "name": "Nicolas Prevot",
        "email": "nprevot@google.com",
        "time": "Fri Aug 22 12:12:29 2014 +0100"
      },
      "message": "Marking the Settings ContentProvider as singleUser\n\nThere is only one instance of the Settings ContentProvider, running in the user 0.\nSo it should be marked as singleUser.\n\nBUG: 17133716\nChange-Id: I426667ddbc8e682e7ea81f04633c0ad4f42782cb\n"
    },
    {
      "commit": "8292342e66211d37eb5ebd8615967335f3f99500",
      "tree": "2056f203124f1fdba071c4fbbdca355f06f588b6",
      "parents": [
        "1680cfd803d6a435ce4c809075d052da2723ac07"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Mon Oct 14 15:24:31 2013 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Mon Oct 14 15:24:31 2013 -0700"
      },
      "message": "Switch settings provider to use the new Settings icon\n\nBug: 11193955\nChange-Id: I2e32d31fc8789a950cb54ab6176b8360fc5d9ae5\n"
    },
    {
      "commit": "45576ccd760e4e2e63a54410803380c05e42d742",
      "tree": "a73fa1e67e54917e930c1ef75183a793160808f3",
      "parents": [
        "ff92aa74c133fd4abe30f97e6849e80db29af253"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Jul 28 12:45:05 2012 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Mon Aug 06 17:42:12 2012 -0700"
      },
      "message": "Explicitly export content providers\n\nIn a future version of Android, the default value for\n\u003cprovider android:exported\u003e will change from true to false.\nExplicitly set android:exported\u003d\"true\"\n\nBug: 3306452\n\nChange-Id: Iffe4dca4fefc92bb9f89698f149a87c16a7ce3c5\n"
    },
    {
      "commit": "d2509fd83597595914ef0627685e917380863eb6",
      "tree": "31ae51c4cb2664615c08ceb99f6363b084199cb4",
      "parents": [
        "d61a3a1bed57fc33fb0fa132521746bb58bba6be"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Sep 12 12:29:43 2011 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Sep 12 12:29:43 2011 -0700"
      },
      "message": "Add boot mode where only \"core apps\" are started.\n\nA core app is one that has coreApp\u003d\"true\" in its manifest tag.\n\nThe system can successfully boot (though a little painfully) with\nonly framework-res.apk, SettingsProvider.apk, SystemUI.apk,\nDefaultContainerService.apk, and Launcher2.apk set as core apps.\n\nCurrently this boot mode is always turned off.\n\nChange-Id: Ieaa4a8031c2c391a12996aa8d8b1d65fc2b09d6b\n"
    },
    {
      "commit": "79ec80db70d788f35aa13346e4684ecbd401bd84",
      "tree": "fd18f64033def7461692f9542bf9e5f01afe2fe0",
      "parents": [
        "be87cc945b5b094060cbc77b77383aefc60265e4"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Jun 24 14:58:49 2011 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Wed Jul 06 14:40:32 2011 -0700"
      },
      "message": "Make full backup API available to apps\n\nNew methods for full backup/restore have been added to BackupAgent\n(still hidden): onFullBackup() and onRestoreFile().  The former is the\nentry point for a full app backup to adb/socket/etc: the app then writes\nall of its files, entire, to the output.  During restore, the latter\nnew callback is invoked, once for each file being restored.\n\nThe full backup/restore interface does not use the previously-defined\nBackupDataInput / BackupDataOutput classes, because those classes\nprovide an API designed for incremental key/value data structuring.\nInstead, a new FullBackupDataOutput class has been introduced, through\nwhich we restrict apps\u0027 abilities to write data during a full backup\noperation to *only* writing entire on-disk files via a new BackupAgent\nmethod called fullBackupFile().\n\n\"FullBackupAgent\" exists now solely as a concrete shell class that\ncan be instantiated in the case of apps that do not have their own\nBackupAgent implementations.\n\nAlong with the API change, responsibility for backing up the .apk\nfile and OBB container has been moved into the framework rather than\nhave the application side of the transaction do it.\n\nChange-Id: I12849b06b1a6e4c44d080587c1e9828a52b70dae\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"
    },
    {
      "commit": "ef6b22fc04a8d5ab26e13efac8069c097e0da7c9",
      "tree": "883f9fde4fdcde9c073ee2b0987c5dd393a00745",
      "parents": [
        "855dd9e074c4dcb9c90deaeff1eb33d6394dd5da"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Feb 16 20:38:49 2010 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Feb 17 10:29:52 2010 -0800"
      },
      "message": "Fix issue #2420412: API review: DeviceAdmin API changes\n\nNote in docs that callbacks are on main thread.\nRename to DeviceAdminReceiver?\nDocument resetPassword is the device\u0027s password.\n\nAlso hide android.R.attr.neverEncrypt.\n"
    },
    {
      "commit": "a87240c2270e83c3e865ffa1e56f79bfa74daffc",
      "tree": "56185fa9fc74ee9a55e3a35e6f228459a0cff04d",
      "parents": [
        "7f66d6e63dc79709ea308440ec57906980046531"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Feb 12 14:12:34 2010 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Fri Feb 12 15:49:30 2010 -0800"
      },
      "message": "Remove BACKUP_DATA permission and associated checks\n\nAny package can now participate in backup/restore, without requiring any\nmanifest-declared permission.  *Control* of the backup manager is still\nguarded by the BACKUP permission, which is signatureOrSystem.\n\nChange-Id: I116fcfcd4cd255e3c976330da1c4dea7d4faae9d\n"
    },
    {
      "commit": "a8529f68671a8a118751cb6ad577f44eaf076b96",
      "tree": "bf191767698261c9bdd7b599593f3177a188da7d",
      "parents": [
        "579d418db016a9ae87479da9e29d8827474d68f5"
      ],
      "author": {
        "name": "Oscar Montemayor",
        "email": "oam@google.com",
        "time": "Wed Nov 18 10:14:20 2009 -0800"
      },
      "committer": {
        "name": "Oscar Montemayor",
        "email": "oam@google.com",
        "time": "Tue Nov 24 11:44:19 2009 -0800"
      },
      "message": "Encrypted File Systems Project. Installer modifications.\nStarted to modify isntaller for data redirection to a secure location.\n"
    },
    {
      "commit": "5e1ab335e6e8fbfa19c64d53880a22f472010953",
      "tree": "4da429b3833ff29256d23f9e2e7f1b3a41715b65",
      "parents": [
        "c937b5ce4ff2f39fd9c60f718f98550a932b62f0"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Tue Sep 01 20:32:49 2009 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Tue Sep 01 20:59:36 2009 -0700"
      },
      "message": "Expand apps\u0027 control over the settings restore process\n\nApplications can now specify two more aspects of the restore process:  whether\nthey need to run with their own custom Application subclass rather than being\nlaunched in the usual restricted mode during restore, and whether it\u0027s okay for\nthe backup manager to kill the app process once restore has completed.  The new\nmanifest attributes for these are, respectively, android:restoreNeedsApplication\nand android:killAfterRestore.\n\nIf unspecified in the manifest, restoreNeedsApplication is false, and\nkillAfterRestore is true.\n\nIn order to support kill-after-restore cleanly, this change also adds a new\nsystem-process-only interface to the Activity Manager, which will schedule a\n\"commit suicide\" event on the target app\u0027s main thread looper.\n\nThe framework backup agents have been given the appropriate new backup\nattributes as well.\n"
    },
    {
      "commit": "0749dcd19301fe4093f9cf8677c722d17bceabfb",
      "tree": "47d8c3c6a33915475b99ce1d233d398365a38f72",
      "parents": [
        "763101efcdcf306142af891f98eaaa971e6edaf0"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Thu Aug 13 15:13:03 2009 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@android.com",
        "time": "Thu Aug 13 15:15:55 2009 -0700"
      },
      "message": "Backup participants must now hold the BACKUP_DATA permission\n\nPackages that do not use android.permission.BACKUP_DATA will neither be backed\nup nor restored.  That permission is currently signature-only.  In the future if\naccess to the backup/restore infrastructure is made available to arbitrary 3rd\nparty applications, the permission checks (and indeed, the permission itself)\ncan simply be removed.\n"
    },
    {
      "commit": "344bf682c9b7d3799851cb9ce3eeecfd4cec23f4",
      "tree": "9d57425885fc7e7fa2821703387303fa6d7ba4f0",
      "parents": [
        "78d0fdfad1437b2382e8803fa396fbe0f38a214f"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Jul 02 14:25:21 2009 -0700"
      },
      "committer": {
        "name": "-b master",
        "email": "yamasani@google.com",
        "time": "Mon Jul 06 14:47:30 2009 -0700"
      },
      "message": "Make backup agent run in the system process as well.\n"
    },
    {
      "commit": "501eec92f9f4f206ad7972c63f2d0ef0285d8e34",
      "tree": "b1fc37d6ebee024bab1e3140c6bc296fca345706",
      "parents": [
        "1d6ec76f0808c082fbffbad21fecbb612eb5c76f"
      ],
      "author": {
        "name": "-b master",
        "email": "yamasani@google.com",
        "time": "Mon Jul 06 13:53:11 2009 -0700"
      },
      "committer": {
        "name": "-b master",
        "email": "yamasani@google.com",
        "time": "Mon Jul 06 14:05:11 2009 -0700"
      },
      "message": "Revert \"hand rolled out 220f4d633be1098e7887dbd06f179138bf19f1ad due to interface changes on master, the change will need to be made again\"\n\nThis reverts commit f8e3ba5bfad14f3037d72eb6243258c13169cbd8.\n"
    },
    {
      "commit": "f8e3ba5bfad14f3037d72eb6243258c13169cbd8",
      "tree": "ef8059d7fa9786f40642269e39df224caad26f0b",
      "parents": [
        "84fcd18ecbd92df932af34568634d41d43784ea2"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jul 03 10:51:26 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jul 03 10:51:26 2009 -0700"
      },
      "message": "hand rolled out 220f4d633be1098e7887dbd06f179138bf19f1ad due to interface changes on master, the change will need to be made again\n"
    },
    {
      "commit": "220f4d633be1098e7887dbd06f179138bf19f1ad",
      "tree": "31e4a5379beddf0dbf492ba7047b4005a103365a",
      "parents": [
        "d45dcbec856710f9478ffc5689e7cdf95d757ab8"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Jul 02 02:34:14 2009 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Jul 02 04:58:09 2009 -0700"
      },
      "message": "System and Secure settings backup.\n\nThis backs up the basic system and secure settings. THe restoration doesn\u0027t\ntake effect immediately. You many need to restart the runtime to see all\nrestored values take effect.\n"
    },
    {
      "commit": "f204ab3ebc089373c44b6977f0db4b82891f128d",
      "tree": "33956c1c749ff9abdd861224eac7cc68aed8c65c",
      "parents": [
        "0781df943e5a7a72ac82394874b6200d14ddd02c"
      ],
      "author": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Wed Jun 17 15:17:29 2009 -0700"
      },
      "committer": {
        "name": "Eric Fischer",
        "email": "enf@google.com",
        "time": "Wed Jun 17 15:17:29 2009 -0700"
      },
      "message": "Squashed commit of the following:\n\ncommit 8e1a200225b7e4756b83d17d679a71a06a38b696\nAuthor: Eric Fischer \u003cenf@google.com\u003e\nDate:   Tue Jun 16 16:32:56 2009 -0700\n\n    Make names of Settings, VPN, Subscribed Feeds providers localizable.\n"
    },
    {
      "commit": "2d4b6ad9d4c7e3e2dbb6a127f37271686253d71f",
      "tree": "b66b8c97936d53c970775aaf134b4f0eeab1a9ca",
      "parents": [
        "5570f2f24a74a1f16c781722731ba39f2907cbb3"
      ],
      "author": {
        "name": "Dan Egnor",
        "email": "egnor@google.com",
        "time": "Mon Jun 15 14:46:00 2009 -0700"
      },
      "committer": {
        "name": "Dan Egnor",
        "email": "egnor@google.com",
        "time": "Mon Jun 15 16:29:20 2009 -0700"
      },
      "message": "Remove obsolete FOTA_UPDATE permission (which should never have been\nmade public, and wouldn\u0027t be used by any third party applications,\nand no longer does anything regardless).\n\nAlso remove the WRITE_GSERVICES permission from the SettingsProvider\npackage\u0027s manifest (the declaration there was redundant with the one\nin the core manifest, where all the other settings-related permissions\nlive -- no other core package includes its own permission definitions).\n"
    },
    {
      "commit": "9066cfe9886ac131c34d59ed0e2d287b0e3c0087",
      "tree": "d88beb88001f2482911e3d28e43833b50e4b4e97",
      "parents": [
        "d83a98f4ce9cfa908f5c54bbd70f03eec07e7553"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:31:44 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:31:44 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "d83a98f4ce9cfa908f5c54bbd70f03eec07e7553",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "076357b8567458d4b6dfdcf839ef751634cd2bfb"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:45 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:45 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "f013e1afd1e68af5e3b868c26a653bbfb39538f8",
      "tree": "7ad6c8fd9c7b55f4b4017171dec1cb760bbd26bf",
      "parents": [
        "e70cfafe580c6f2994c4827cd8a534aabf3eb05c"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:05:43 2008 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:05:43 2008 -0800"
      },
      "message": "Code drop from //branches/cupcake/...@124589\n"
    },
    {
      "commit": "54b6cfa9a9e5b861a9930af873580d6dc20f773c",
      "tree": "35051494d2af230dce54d6b31c6af8fc24091316",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
