)]}'
{
  "log": [
    {
      "commit": "dda003ffa84f986bfaba4344124eafa533f5039d",
      "tree": "649b390602e2efe8abad283fcdd04f285cfaff40",
      "parents": [
        "551056ec0fd274f4696c2cf1ec9c62298f7f7226"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Aug 28 18:06:51 2014 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Aug 29 10:28:38 2014 -0700"
      },
      "message": "Clean up apks installed for a removed user\n\nWhen a user is removed, enumerate through all installed packages\nto see if any of them are not installed for any user. Delete the\npackage if no user has it \"installed\".\n\nAdded a pm option to install an apk for a specific user.\n\nFixed a crash in UserManagerService when executing the above\ncleanup - dying users generate a null UserInfo.\n\nBug: 15426024\nChange-Id: I571decde1ae1c257d0da6db153b896aad6d6bcb4\n"
    },
    {
      "commit": "941a8ba1a6043cf84a7bf622e44a0b4f7abd0178",
      "tree": "c783987f68caaa4cc827b3c720f269bcc9d34667",
      "parents": [
        "7653a30ea0232ab8323ec51ddcba8d8054ca8a2f"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Wed Aug 20 16:26:32 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Aug 22 16:25:04 2014 -0700"
      },
      "message": "Installing splits into ASECs!\n\nSessions can now zero-copy data directly into pre-allocated ASEC\ncontainers.  Then at commit time, we compute the total size of the\nfinal app, including any inherited APKs and unpacked libraries, and\nresize the container in one step.\n\nThis supports both brand new ASEC installs and inheriting from\nexisting ASEC installs.  To keep things simple, it currently requires\ncopying any inherited ASEC contents, but this could be optimized in\nthe future.\n\nExpose new vold resize command, and allow read-write mounting of ASEC\ncontainers.  Move native library extraction into the installer flow,\nsince it needs to happen before ASEC is sealed.  Move multiArch flag\ninto NativeLibraryHelper, instead of making everyone pass it\naround.  Migrate size calculation to shared location.\n\nSeparate \"other\" package name in public API, provide a path to a\nstorage device when relevant, and add more docs.\n\nBug: 16514385\nChange-Id: I06c6ce588d312ee7e64cce02733895d640b88456\n"
    },
    {
      "commit": "a0907436c01fd8c545a6b5c7b28bc3bc9db59270",
      "tree": "6c2dd0946fd4483de652551aa272086d7bb0b3a4",
      "parents": [
        "82d6d337b389ef088879a5e527d44c75c41c5b44"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Aug 15 10:23:11 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Aug 15 15:57:02 2014 -0700"
      },
      "message": "PackageInstaller API refactoring.\n\nSwitch to using IntentSender for results to give installers easier\nlifecycle management.  Move param and info objects to inner classes.\n\nBug: 17008440\nChange-Id: I944cfc580325ccc07acf22e0c681a5542d6abc43\n"
    },
    {
      "commit": "4903f64ba2478849e6c401f42f5a77c1d4f9f7df",
      "tree": "ace15042e8025593f37f0f87444d60120e623c22",
      "parents": [
        "dd0b7d083fd7a176c8cba151469d34ec69803a70"
      ],
      "author": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Mon Aug 11 13:33:45 2014 +0100"
      },
      "committer": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Wed Aug 13 12:41:19 2014 +0100"
      },
      "message": "Persist the cpuAbiOverride setting.\n\nIf an app is installed with an ABI override (adb install -r --abi)\nwe should remember this so that we don\u0027t revert to the scan derived\nABI on the next reboot.\n\nbug: 16476618\n\nChange-Id: I6085bc0099eb613dd9d3b07113c7c13859780697\n"
    },
    {
      "commit": "fbd0e9fa37fc17ccd25e4c1f16195bbd27de3c4c",
      "tree": "fb67a6cbd7f3b39bd82f22f1763a83c776fb08d6",
      "parents": [
        "905857f1b8708b1a7cf60a5e6b934b75ac6aea77"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Wed Aug 06 16:34:34 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@google.com",
        "time": "Thu Aug 07 00:23:54 2014 +0000"
      },
      "message": "Surface user action events when un/installing.\n\nThis will be used shortly to connect up with permissions\nconfirmation UI.\n\nBug: 16515814\nChange-Id: If28cecc28549900d960ac107a1fba0b10ce5bd7b\n"
    },
    {
      "commit": "1cb2d0d4bba387665128c62c342e59103ea4be26",
      "tree": "2659fda22f585adf01574c24f1f23dbb3caccef2",
      "parents": [
        "874bcd82c223ce58c9d76edcf619b3988c672307"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Wed Jul 30 16:45:01 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Jul 31 15:17:03 2014 -0700"
      },
      "message": "Persist install sessions, more lifecycle.\n\nTo resume install sessions across device boots, persist session\ndetails and read at boot.  Drop sessions older than 3 days, since\nthey\u0027re probably buggy installers.\n\nAdd session callback lifecycle around open/close to give home apps\ndetails about active installs.  Also give them a well-known intent\nto show session details.\n\nExtend Session to list staged APKs and open them read-only, giving\ninstallers a mechanism to verify delivered bits, for example using\nMessageDigest, before committing.\n\nSwitch to generating random session IDs instead of sequential.\n\nDefensively resize app icons if too large.  Reject runaway\ninstallers when they have too many active sessions.\n\nBug: 16514389\nChange-Id: I66c2266cb82fc72b1eb980a615566773f4290498\n"
    },
    {
      "commit": "20e0c50f601e5930a246d4556118423a49c12ca1",
      "tree": "02e5ab04fff88af15912830344c8ddff9774f25f",
      "parents": [
        "a753f4c6cb8558795e673df1896532cd148781e2"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Jul 25 14:09:37 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@google.com",
        "time": "Fri Jul 25 21:11:47 2014 +0000"
      },
      "message": "Offer force-dex-opt when running as root.\n\nRecently we removed the PackageManager inotify triggers, meaning the\nonly supported ways of installing apps were:\n\n-- adb install -r Foo.apk\n-- adb shell stop \u0026\u0026 adb sync \u0026\u0026 adb shell start\n\nIterating on most system apps (like Settings) can use the first\napproach, but it doesn\u0027t work for \"persistent\" processes like\nSystemUI.  (ActivityManager is very particular about how it deals\nwith persistent apps, and it always sticks with the first\nApplicationInfo found at boot.)\n\nSo to enable rapid iteration on persistent apps, we now offer the\none missing piece of forcing a dexopt with a new pm force-dex-opt\ncommand only available to -eng or -userdebug builds.  Typical use\nfor iterating on persistent apps now looks like this:\n\n$ mmm frameworks/base/packages/SystemUI/ \u0026\u0026 adb sync \u0026\u0026\n    adb shell pm force-dex-opt com.android.systemui \u0026\u0026\n    adb shell kill `pid systemui`\n\nYay!\n\nChange-Id: I0ae2467f1d7cda56c70ba20953cd25fa8ee766ff\n"
    },
    {
      "commit": "16c8e3f49497b6046972ae650772f65768366be8",
      "tree": "56ad5dc58ab923e35029d25430d30bc77b218994",
      "parents": [
        "186655285fb5deafc4d56ca8efad2d115dfd6af3"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Jul 24 17:08:17 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Jul 25 11:59:48 2014 -0700"
      },
      "message": "PackageInstaller changes based on feedback.\n\nMostly cosmetic changes from API council feedback.\n\nBug: 16543552\nChange-Id: Ic926829b3f77c31f50a899c59b779353daf00d59\n"
    },
    {
      "commit": "e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7",
      "tree": "0a758d1029f2b8aed41a089330c7fa79564a6a32",
      "parents": [
        "c2ae1a6b455d97c4e89e2bf7b113435dd63bb36f"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Sat Jul 19 15:44:09 2014 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Mon Jul 21 22:18:40 2014 +0000"
      },
      "message": "Rename setApplicationBlocked to setApplicationHidden\n\nThis corrects the expected behavior of the app state. Hidden apps\ncan be installed by the store to be brought out of hidden state.\n\nBug: 16191518\nChange-Id: Id128ce971ceee99ba1dea14ba07ce03bd8d77335\n"
    },
    {
      "commit": "9a445771f57dd15b06db0dbefd66c368d84eec2d",
      "tree": "d418591835aec7c22724e49e0a8681efea5fc39c",
      "parents": [
        "4990e4f0e3d493036e99e1f5fb893635a9b66eb1"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Wed Jul 16 11:32:08 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Wed Jul 16 13:38:09 2014 -0700"
      },
      "message": "Install sessions only inherit APK files.\n\nAlso track historical install sessions for debugging purposes.  Hide\nsignature verification API for now.  Clear code cache only after\nkilling the app being upgraded.\n\nBug: 14975160\nChange-Id: I52fc7f11d2506f792236d8a365c8cfed21b46c30\n"
    },
    {
      "commit": "69ea974f1712c83a9ad194187237edf1169f9064",
      "tree": "c8d768527b58502da7b575b86ffa1b343044c9e2",
      "parents": [
        "969167dc05a6485a32d160895871cff46fd81884",
        "6c833e07a05c48ca60ee4d72421bf8b1e78dc710"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Jul 15 06:16:37 2014 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jul 15 00:41:06 2014 +0000"
      },
      "message": "Merge \"Public API for PackageInstaller!\" into lmp-dev"
    },
    {
      "commit": "6c833e07a05c48ca60ee4d72421bf8b1e78dc710",
      "tree": "f16f3c2a12dea6fd5131d82d007fd75cd61fb915",
      "parents": [
        "5c6a8e322227354acbded5c49f44c0b289021bf5"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Jul 14 22:44:30 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Jul 14 23:06:52 2014 -0700"
      },
      "message": "Public API for PackageInstaller!\n\nFlesh out documentation and finalize first cut of API.  Also surface\ninstallLocation and splitNames through PackageInfo.\n\nBug: 14975160, 15348430\nChange-Id: Ic27696d20ed06e508aa3526218e9cb20835af6a0\n"
    },
    {
      "commit": "ad11eb52fe62b6696df2194cb9e176f7d799e844",
      "tree": "440f9699b759d4b14b20a9280234d352faf2b0ce",
      "parents": [
        "5c6a8e322227354acbded5c49f44c0b289021bf5"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Sun Jul 13 17:33:07 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Jul 14 10:57:04 2014 -0700"
      },
      "message": "Pass install result message; path selection.\n\nOops, forgot to include message argument to invoke the new-style\ncallback.  Also use more robust way of generating cluster APK\ndirectory names, and add more logging details on rename failure.\n\nChange-Id: Ifa8abdd1db58b73e13b9a8077ec126cf20a0d90e\n"
    },
    {
      "commit": "a10311434778ea1be1621c2251c0c8c2966f337b",
      "tree": "3496202e354ae761d7c750e105c610f67f82542d",
      "parents": [
        "e0b0bef75b66f0a87039c8f58c17b1596a2baebe"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Sat Jul 12 18:09:46 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Sat Jul 12 21:12:25 2014 -0700"
      },
      "message": "Package installation listener events.\n\nFlesh out implementation of install session observers.  Carve out 20%\nof published install progress for final system operations such as\ndexopt, etc.\n\nAdd dumpsys output for active install sessions.  Create explicit\nfsync() instead of overriding meaning of flush().  Hack to throw\nIOExceptions over Binder calls.\n\nBug: 14975160, 15348430\nChange-Id: I874457e40c45d2661bc0a526df9285ffea4bb77c\n"
    },
    {
      "commit": "bb580670350b76fa2fcc5ee873f99b7970759cbf",
      "tree": "b4e22eeaaf299d9c5b2272a292fe9117e94bc0b3",
      "parents": [
        "4901d62f1629ef5b9fb4c821e5fafbbfde4b8a47"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Jul 10 12:10:25 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Jul 11 16:54:49 2014 -0700"
      },
      "message": "Progress toward installer public API: callbacks.\n\nInstead of surfacing all the existing cryptic error codes, we\u0027re\ngoing to classify them into broad categories when surfacing through\npublic API.  This change introduces InstallResultCallback and\nUninstallResultCallback, and wires them up to existing AIDL\ninterfaces.\n\nAlso start defining general SessionObserver for apps interested\nin general progress details, such as Launcher apps.  Details about\nactive sessions are returned through new InstallSessionInfo objects.\n\nBug: 14975160\nChange-Id: I068e2b0c30135f6340f59ae0fff93c321047f8f9\n"
    },
    {
      "commit": "ec55ef0934b8e0d1bb705434947de817f7be57f1",
      "tree": "4855af37aa2c312bc2a645f5d94c463a2859d516",
      "parents": [
        "2cfc8482267707a671cbe4275ea8927c1aef991a"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Jul 08 11:28:00 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Wed Jul 09 16:55:56 2014 -0700"
      },
      "message": "Extend pm to support sessions and split APKs.\n\nSeparate commands to create an install session, stream files into the\nstaging area, and then commit the install.  Streaming can accept data\nfrom stdin across adb, avoiding extra copy from push.\n\nExtend FileBridge to support blocking close().  Always destroy\nsession regardless of result.\n\nBug: 14975160\nChange-Id: Ic3f462e7d1901079b785e210228950cdfa676466\n"
    },
    {
      "commit": "513a074de68a4772a9900e90f38e74ff92c15e7c",
      "tree": "410c98a83b684a34063903496863247c303cb5cb",
      "parents": [
        "8d479b0c2ddb150182bcf510876a240cb869661b"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Jul 08 17:10:32 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Jul 08 17:41:29 2014 -0700"
      },
      "message": "Clean up IPackageManager install surface area.\n\nAlso more removal of encryption support.\n\nChange-Id: If525dc5a8422134515f225a8ac4731e968069468\n"
    },
    {
      "commit": "8a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3",
      "tree": "b2564620026c0ca6081de864b20ac1d5e6827135",
      "parents": [
        "564054146e7286b0d046591c0bd3195b0e4a6cf3"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Jun 16 13:48:42 2014 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Tue Jun 17 14:38:44 2014 -0700"
      },
      "message": "Plumb split APKs into public API.\n\nIntroduces new ApplicationInfo fields to surface zero or more split\nAPKs for an application.  Splice these APKs into both the class\nloader and resource system.  Cleaner building of these paths.\n\nRun dexopt() on all split APKs found after a parse, and populate\ninto ApplicationInfo.\n\nChange-Id: I4a376bf4492d84ea95aafa866e106ea43a43e492\n"
    },
    {
      "commit": "116bdbd823b607d860b039ec334a1f985eed7a7f",
      "tree": "948d436a288ed6e2edc62988df6394e736e92b82",
      "parents": [
        "8627cef5382035dac8f3e68823b239724cc39708"
      ],
      "author": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Thu May 29 11:51:59 2014 +0100"
      },
      "committer": {
        "name": "Narayan Kamath",
        "email": "narayan@google.com",
        "time": "Tue Jun 03 11:35:49 2014 +0100"
      },
      "message": "Add an --abi argument to \"pm install\"\n\nThis allows callers to force an install to a particular\nABI. This is intended only for testing (and CTS) and is\nnot meant for usage by the installer package.\n\nbug: 14453227\n\n(cherry picked from commit 6431d11cd420536aaa9d93ae510a3151ccc4df1d)\n\nChange-Id: I85d4f8785deea02a6a4d3cb0b05e6ef8bf64826b\n"
    },
    {
      "commit": "1bdbd4be02aec4fd164ba41c164735639b9c7e15",
      "tree": "419c917e1813053a43af5af700563bb021bbcffb",
      "parents": [
        "27692098d7afb77237a98d25da2e6cdfe0a85883"
      ],
      "author": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Wed May 14 19:53:22 2014 +0100"
      },
      "committer": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Fri May 23 18:37:34 2014 +0100"
      },
      "message": "Add ability to uninstall per user to adb shell pm.\n\nDefault is still uninstall for all users, but if --user\nis passed in it will just uninstall for that user.\nFor system apps if --user is supplied it will uninstall\nrather than revert to the current system version.\n\nChange-Id: If1be0f78f01391f7ac6b53150dfeeccd0c002899\n"
    },
    {
      "commit": "2a764949c943681a4d25a17a0b203a0127a4a486",
      "tree": "5cacb4e3be3f0c47e25f4e98389110310622e4b0",
      "parents": [
        "30cac644f161433fca92ca65edcb26b351a04e5a"
      ],
      "author": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Wed Apr 02 13:29:20 2014 +0100"
      },
      "committer": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Wed Apr 02 13:44:50 2014 +0100"
      },
      "message": "Rename related users to profiles.\n\nRename the related user concept as profiles.\nWhen returning profiles of a user include the\nuser as a profile of itself.\n\nChange-Id: Id5d4f29017b7ca6844632ce643f10331ad733e1d\n"
    },
    {
      "commit": "f1977b4500e82b72ea6aa5c46d97406a20017caf",
      "tree": "9d6b4e63bc4b4c70eb9fbd5eb2cff9587ba45485",
      "parents": [
        "9ad8a5331ca5eb6390c702ec57952043b56170bf"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Mar 24 16:25:51 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 27 12:37:47 2014 -0700"
      },
      "message": "Expand install observer semantics\n\n...and now fail conservatively when two apps both attempt to define\nthe same permission.  Apps signed with the same certificate are\npermitted to redefine permissions.\n\nWe also finally have a (hidden) interface class for observing package\ninstallation so that we can now rev the interface without breaking\nexisting callers.\n\nBug 13551375\n\nChange-Id: Ifa4e59154dcccbb286ee46a35a6f25e4ad0f0f01\n"
    },
    {
      "commit": "7629a18a3f190368e6268d3f2827824905683268",
      "tree": "392b2bde32c959d39d7a37bc0f3c46d7fbe3a55b",
      "parents": [
        "ab8a501f255b272af887acb0e66eb71cdf24c755"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 26 19:59:48 2014 +0000"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 26 19:59:48 2014 +0000"
      },
      "message": "Revert \"Expand install observer semantics\"\n\nThis reverts commit ab8a501f255b272af887acb0e66eb71cdf24c755.\n\nChange-Id: I4ab4ae1a96efa2adf9d5a513793d8b84eef38b4e\n"
    },
    {
      "commit": "ab8a501f255b272af887acb0e66eb71cdf24c755",
      "tree": "4428aa0f60d4a2a309e8882d27fab9c5b20ad5c3",
      "parents": [
        "48a5dbd3cc5dd8a919983455757dc4c7b82500ab"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Mon Mar 24 16:25:51 2014 -0700"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Tue Mar 25 19:28:54 2014 -0700"
      },
      "message": "Expand install observer semantics\n\n...and now fail conservatively when two apps both attempt to define\nthe same permission.\n\nWe also finally have a (hidden) interface class for observing package\ninstallation so that we can now rev the interface without breaking\nexisting callers.\n\nBug 13551375\n\nChange-Id: I3a286d024a30e812ee4b098f345401df3c00e178\n"
    },
    {
      "commit": "6143a02f96a5c6c7a0a84f5dbe70732998256a72",
      "tree": "367738fe288412c6a2b340cee90a2198be8a93b2",
      "parents": [
        "48d04ec3b7990f3a58d36b23f07b6cf0a0af65db"
      ],
      "author": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Wed Mar 05 20:43:49 2014 +0000"
      },
      "committer": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Wed Mar 05 22:24:01 2014 +0000"
      },
      "message": "Start related users on boot and user switch.\n\nCollect related initialized users and start\nthem on boot and user switch.\nUpdate list users command to show whether a\nuser is running or not.\n\nChange-Id: Ib3d5debcb01ec55a07d93450b988b0180fc63263\n"
    },
    {
      "commit": "31d6776a9225be5d4ae521a5b551f413c9481aa3",
      "tree": "15520427eba6bc390353fb5fb340c0132c909982",
      "parents": [
        "a9f387bdf0a836de8bcb12a46a5cdfcb544fbb1a"
      ],
      "author": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Fri Feb 14 17:35:05 2014 +0000"
      },
      "committer": {
        "name": "Kenny Guy",
        "email": "kennyguy@google.com",
        "time": "Fri Feb 14 19:12:03 2014 +0000"
      },
      "message": "Extend pm create-user to handle related and managed users.\n\nChange-Id: I0a290b9debdc8ddf23b72a84bf98908ab7fa7c0d\n"
    },
    {
      "commit": "655d0e2029e6ae77a47e922dce4c4989818b8dd1",
      "tree": "67a9e2261c5e61f5a1b8f7f4f8cfcca5b433046c",
      "parents": [
        "bf991a8f426921c26e21e54e493781e1d5eb39ff"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Jun 12 14:19:10 2013 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Tue Jun 25 16:03:55 2013 -0700"
      },
      "message": "Single-user restrictions\n\nIntroduces a new \"blocked\" state for each package. This is used to temporarily\ndisable an app via Settings-\u003eRestrictions.\n\nPIN creation and challenge activities for use by Settings and other apps. PIN\nis stored by the User Manager and it manages the interval for retry attempts\nacross reboots.\n\nChange-Id: I4915329d1f72399bbcaf93a9ca9c0d2e69d098dd\n"
    },
    {
      "commit": "cbfd23ee6f14445c3e17c5169abbc80c216fa137",
      "tree": "9e5063fe418c4df345b371a0678faa4a1fcb0c48",
      "parents": [
        "be4e6aaa0252dd7da28b7aa85beba982538efa46"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Jun 11 14:26:53 2013 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Jun 11 14:26:53 2013 -0700"
      },
      "message": "Add new API to retrieve a dumpsys of a single package.\n\nAdds a platform API, and pm command.  Fixes some issues with\ndumping per-package data in package manager, makes battery\nstats able to dump per-package state.\n\nChange-Id: I76ee6d059f0ba17f7a7061886792b1b716d46d2d\n"
    },
    {
      "commit": "3fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6",
      "tree": "61426df0943f36d09ce0916e8c5f7647b2808db5",
      "parents": [
        "b404ecc91a5dd3dd027554490b2ca18c1048bdba"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Mar 26 16:15:41 2013 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Mar 27 12:01:52 2013 -0700"
      },
      "message": "Keep track of who has disabled applications.\n\nChange-Id: I2640d3dc2200b589e2beb42a43cc93efd090f06e\n"
    },
    {
      "commit": "a83cab0001ca4d90abe622c22a7af1b0da54f739",
      "tree": "51bec7849647a103e8d24179201e7f7e95e46b01",
      "parents": [
        "09ed05ceaecc5fca46e25fe9bd9e8c0ee61fd31d"
      ],
      "author": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 07 17:50:11 2013 -0800"
      },
      "committer": {
        "name": "Christopher Tate",
        "email": "ctate@google.com",
        "time": "Thu Mar 07 17:50:11 2013 -0800"
      },
      "message": "Do not hang in pm clear on an invalid package name\n\nThe Activity Manager was not properly informing the observer that\nthe operation had concluded (unsuccessfully).\n\nBug 8222595\n\nChange-Id: I8234e32d8edf4112c8c7a5e20e341d0b41e23014\n"
    },
    {
      "commit": "67df64b3a48a8157d08a98fa90135d0ac0ee621c",
      "tree": "d390d5c537c976a14688e24c1f9a8a213840ff29",
      "parents": [
        "0ffc81c1ada65b4ef4febaacf044e9fa62309b87"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Dec 14 12:09:36 2012 -0800"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed Mar 06 09:49:44 2013 -0800"
      },
      "message": "Shared accounts and sharing of apps\n\nAPI and preliminary implementation for sharing primary user accounts with a secondary user.\nAbstractAccountAuthenticator has new methods to retrieve and apply a bundle of credentials\nto clone an account from the primary to a restricted secondary user. The AccountManagerService\ninitiates the account clone when it starts up the user and detects that the user has\na shared account registered that hasn\u0027t been converted to a real account.\n\nAccountManager also has new hidden APIs to add/remove/get shared accounts. There might be\nfurther improvements to this API to make shared accounts hidden/visible to select apps.\n\nAccountManagerService has a new table to store the shared account information.\n\nAdded ability in PackageManager to install and uninstall packages for a secondary user. This\nis required when the primary user selects a few apps to share with a restricted user.\n\nRemove shared accounts from secondary users when primary user removes the account.\n\nChange-Id: I9378ed0d8c1cc66baf150a4bec0ede56f6f8b06b\n"
    },
    {
      "commit": "50707cc8206f0d257ba83de2f1f99c3eaa13a4bd",
      "tree": "cdb9121fe11da7ac68b8786cd1b54aff78b63024",
      "parents": [
        "cd3b804e114c06b111fb0ad049c8845475a11a9b"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Feb 08 15:32:05 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Feb 08 17:18:03 2013 -0800"
      },
      "message": "Fix issue #8133857: Tracking ANR in Gallery\n\nReworking the locking in resources so that we never hold the\nstate lock while calling in to potential long running operations.\nThis means the mTmpValue can no longer be final (since we need\nto use it while the lock isn\u0027t held), so a new field needs to\nbe added as the lock and everything that touches mTmpValue must\ndeal with it being null, restoring the value in there when\npossible, etc.\n\nChange-Id: Ie5ffd0f66e5f2d0e869a62d72e7a55b1c74fe872\n"
    },
    {
      "commit": "fd7adedebf88427162a3ce27fcc9cfd3893c869d",
      "tree": "d9dfb04e5d0972a6ae7bf92431b0d48925e97b48",
      "parents": [
        "cc7433470f00fac3bbe7835de3ded4b9bf121244"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Jan 22 17:10:23 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Jan 22 17:10:23 2013 -0800"
      },
      "message": "Add new disabled state for \"optional\" built-in apps.\n\nThe disabled state allows you to make an app disabled\nexcept for whatever parts of the system still want to\nprovide access to them and automatically enable them\nif the user want to use it.\n\nCurrently the input method manager service is the only\npart of the system that supports this, so you can put\nan IME in this state and it will generally look disabled\nbut still be available in the IME list and once selected\nswitched to the enabled state.\n\nChange-Id: I77f01c70610d82ce9070d4aabbadec8ae2cff2a3\n"
    },
    {
      "commit": "d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaac",
      "tree": "5f6d8b2c0e66c99289ae085cb6a6a3be168eb000",
      "parents": [
        "f25febf01453733e8bdd1ac241ecd9d3bcbef475"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Jan 17 17:47:37 2013 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Jan 18 13:02:26 2013 -0800"
      },
      "message": "Rework ParceledListSlice to be much easier to use.\n\nTake advantage of this to return better information about\npackages filtered by permissions -- include the permissions\nthey have in the requested array.\n\nAlso fix issue #8026793 (Contact picture shows default pic\nwhile searching for a contact in qsb) by using the base\npackage name of the Context when reporting the app name\nof an operation.  Otherwise you could make a resource-only\ncontext for another application and do calls through that\nand get reported as the wrong app.\n\nChange-Id: I5e0488bf773acea5a3d22f245641828e1a106fb8\n"
    },
    {
      "commit": "a3e9ff7debde50f6b58ebc3033cbbad650c10ac7",
      "tree": "b94d2caf1fa4029650b6ca3fd57a9d3d1b54f684",
      "parents": [
        "52801aae89196b7ad16ef21b07d2d621e7d0bb61"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Oct 15 16:16:39 2012 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Oct 15 16:16:39 2012 -0700"
      },
      "message": "Support pm clear as --user.\n\nBug: 7352703\nChange-Id: I0e9cc4f2313e5424d234c3cb051004c0321d9dac\n"
    },
    {
      "commit": "4c76ea6b88fad2b0147c050c02c6fd3d886d6743",
      "tree": "044338379cdef31e7c0316da597da35a81b258c0",
      "parents": [
        "e6d3ccc99270aaf62808adc7475a25d96664f0fb"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Oct 12 10:44:47 2012 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Fri Oct 12 10:46:01 2012 -0700"
      },
      "message": "Pm command to get maximum users.\n\nUsed to drive CTS tests.  Also print success message when removing\na user.\n\nBug: 7334718\nChange-Id: Ia3886ddf860cd000ce567b0fed2ef0a4e2a2295c\n"
    },
    {
      "commit": "e6d3ccc99270aaf62808adc7475a25d96664f0fb",
      "tree": "4ee82dce7ec5418b95688b9a7d3fd474d92b3f55",
      "parents": [
        "38f8688baeb0f610a47c17bb7810349502d62ab6"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Oct 11 16:43:20 2012 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Thu Oct 11 16:44:18 2012 -0700"
      },
      "message": "Print newly generated userId.\n\nBug: 7334718\nChange-Id: Id4dc456b079bebbe9f2d7ea2a8343d2215f296dc\n"
    },
    {
      "commit": "37d83a3caf138e35fa1a355787d20c351f6b37a6",
      "tree": "a4fe753ce045a1fc0eb7edc17641425981a6079f",
      "parents": [
        "0b1711582ff07d6d1e8e4de6c057eaf6a3473ac3"
      ],
      "author": {
        "name": "Ben Gruver",
        "email": "bgruv@google.com",
        "time": "Thu Sep 27 13:02:06 2012 -0700"
      },
      "committer": {
        "name": "Ben Gruver",
        "email": "bgruv@google.com",
        "time": "Thu Sep 27 13:02:06 2012 -0700"
      },
      "message": "Pass the originating uid to the package verifier\n\nBug: 6923241\nChange-Id: I85a3e0d53b469543cb0551d3a440d2663b5d0697\n"
    },
    {
      "commit": "920ace0bbc2d4133dbec991d2636c99a57d6245e",
      "tree": "a69deeaa2cd76a15eaf402faeb95bba608bc6895",
      "parents": [
        "2f98008d06cbe48f0f5619d16f59988952c9b2ca"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Sep 20 22:15:37 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Sep 20 22:33:43 2012 -0700"
      },
      "message": "Query users excluding any being removed\n\nKeep track of user creation and last logged-in time.\nadb shell dumpsys users\nUser switcher shouldn\u0027t show users about to be removed.\nNo need to check for singleton for activities.\n\nBug: 7194894\nChange-Id: Ic9a59ea5bd544920479e191d1a1e8a77f8b6ddcf\n"
    },
    {
      "commit": "151ec4c9f8ca34625733730a4551a23eb97cda23",
      "tree": "9a0ab8bed19904dce51ae3d23f5ff72c0581b7e2",
      "parents": [
        "4aacf93d40b4be82aa35bf164d6fd6536c8b2a50"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Sep 07 19:25:16 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Sat Sep 08 19:14:00 2012 -0700"
      },
      "message": "More multi-user methods in PM\n\npm can list installed packages by user now.\n\nBug: 6926465\n\nChange-Id: I822311bfd6e7e2d6fb315fc484739fbf953c9bb6\n"
    },
    {
      "commit": "5e03e2ca7d25b899b129baad2dd5eca6bf99d88a",
      "tree": "10c601a58b0bbeb6902d43e0862c58f3ec121c78",
      "parents": [
        "970683c5d42a1d8588d656d4e570ce4f0f6e0abc"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Sep 06 14:21:19 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Sep 07 13:55:23 2012 -0700"
      },
      "message": "More multi-user stuff:\n\n- New (hidden) isUserRunning() API.\n- Maintain LRU list of visited users.\n- New FLAG_IS_DATA_ONLY for ApplicationInfo.\n- Clean up pending intent records when force-stopping a user (or package).\n  (Also fixes bug #6880627: PendingIntent.getService() returns stale\n  intent of force stopped app)\n- Fix force-stopping when installing an app to do the force-stop across\n  all users for that app.\n- When selecting which processes to kill during a force stop, do this\n  based on the actual packages loaded in the process, not just process\n  name matching.\n- You can now use --user option in am when starting activities, services,\n  and instrumentation.\n- The am --user option accepts \"current\" and \"all\" as arguments.\n- The pm uninstall command now uninstalls for all users, so it matches\n  the semantics of the install command.\n- PhoneWindowManager now explicitly says to start home in the current\n  user.\n- Activity manager call to retrieve the MIME type from a content provider\n  now takes a user argument, so it will direct this to the proper user.\n- The package manager uninstall paths are now implemented around\n  PackageSetting, not PackageParser.Package.  This allows them to work\n  even if the application\u0027s apk has been removed (in which case it only\n  exists as a PackageSetting, not the PackageParser.Package parsed from\n  the apk).\n\nChange-Id: I3522f6fcf32603090bd6e01cc90ce70b6c5aae40\n"
    },
    {
      "commit": "4120375d46091df8527bb701882e056fbb0e6b06",
      "tree": "30a3e6bb32f1912b8ab687e2ede8cb1cb18fe908",
      "parents": [
        "176d105d2f71198966b566d36d4e856a797695c7"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Aug 31 14:05:51 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Aug 31 15:11:13 2012 -0700"
      },
      "message": "Remove Binder.getOrigCallingUid().\n\nReplaced all remaining places that used it with explicit user\nspecification.\n\nWhile doing this, I ran into stuff that was creating PendingIntent\nobjects (that now need to specify the explicit user they are for),\nwhich are also posting notifications...  but have no way to specify\nthe user for the notification.\n\nSo the notification manager in the system process now also gets a\nformal concept of a user associated with the notification, which\nis passed in to all the necessary aidl calls.  I also removed the\nold deprecated aidl interface for posting/cancelling notifications,\nsince we now always need a user supplied.\n\nThere is more work that needs to be done here, though.  For example\nI think we need to be able to specify USER_ALL for a notification that\nshould be shown to all users (such as low storage or low battery).\nAlong with that, the PendingIntent creation needs to be tweaked to\nbe able to handle USER_CURRENT by evaluating the user at the point the\npending intent is sent.\n\nThat\u0027s for another change, however.\n\nChange-Id: I468e14dce8def0e13e0870571e7c31ed32b6310c\n"
    },
    {
      "commit": "786b44046a79d6c4c9cd07f5989d491c7196ad80",
      "tree": "ac3d22036260f4e56340903c4ae71f8f7c81e8fe",
      "parents": [
        "9d9ea05cde56f6663f57925212c87860d1cbc1b2"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Aug 27 15:14:02 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Aug 27 15:16:33 2012 -0700"
      },
      "message": "Fix installing applications from non-primary users.\n\nWe also now send the correct broadcasts to each user.\n\nYou no longer need to be running the shell as root\nto be able to create/remove users.\n\nAlso added some more man page material to the pm command, and\ngot rid of a bunch of showUsage() calls that now make error\nmessages completely buried because of how large the usage info\nhas become.\n\nAnd the package manager now shows the user each historical broadcast\nwas sent to.\n\nChange-Id: Iab42498e1352a0c023069139c80fc04d2d69ab4b\n"
    },
    {
      "commit": "7e0e19d4201374d72b7082492bd269dbdb17d972",
      "tree": "32b9080c4bf6da4ed4fb51fc46dbbefdaf1b5b92",
      "parents": [
        "71d7c3c628fbce04b8bdb60f127588ada00bae13"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Aug 27 10:57:30 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Aug 27 10:57:30 2012 -0700"
      },
      "message": "Restore man page entries.\n\nChange-Id: I002808037ec117c039aeb71f425c1f43d4cac6d8\n"
    },
    {
      "commit": "7767eac3232ba2fb9828766813cdb481d6a97584",
      "tree": "41cc717fb9f11190e9da3dc12d61faf23a22861d",
      "parents": [
        "1552586283f329253edc4786a6cf40c5bb69ea36"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Aug 23 18:25:40 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Aug 24 13:53:13 2012 -0700"
      },
      "message": "Keep track of whether an app is installed for each user.\n\nThis add a new per-user state for an app, indicating whether\nit is installed for that user.\n\nAll system apps are always installed for all users (we still\nuse disable to \"uninstall\" them).\n\nNow when you call into the package manager to install an app,\nit will only install the app for that user unless you supply\na flag saying to install for all users.  Only being installed\nfor the user is just the normal install state, but all other\nusers have marked in their state for that app that it is not\ninstalled.\n\nWhen you call the package manager APIs for information about\napps, uninstalled apps are treated as really being not visible\n(somewhat more-so than disabled apps), unless you use the\nGET_UNINSTALLED_PACKAGES flag.\n\nIf another user calls to install an app that is already installed,\njust not for them, then the normal install process takes place\nbut in addition that user\u0027s installed state is toggled on.\n\nThe package manager will not send PACKAGE_ADDED, PACKAGE_REMOVED,\nPACKAGE_REPLACED etc broadcasts to users who don\u0027t have a package\ninstalled or not being involved in a change in the install state.\nThere are a few things that are not quite right with this -- for\nexample if you go through a full install (with a new apk) of an\napp for one user who doesn\u0027t have it already installed, you will\nstill get the PACKAGED_REPLACED messages even though this is\ntechnically the first install for your user.  I\u0027m not sure how\nmuch of an issue this is.\n\nWhen you call the existing API to uninstall an app, this toggles\nthe installed state of the app for that user to be off.  Only if\nthat is the last user user that has the app uinstalled will it\nactually be removed from the device.  Again there is a new flag\nyou can pass in to force the app to be uninstalled for all users.\n\nAlso fixed issues with cleaning external storage of apps, which\nwas not dealing with multiple users.  We now keep track of cleaning\neach user for each package.\n\nChange-Id: I00e66452b149defc08c5e0183fa673f532465ed5\n"
    },
    {
      "commit": "706e8ba26bf0de19ad5f736516dae40c4c88c2d7",
      "tree": "2c45b61e1420f9a7442de8517b1eca6802d507c0",
      "parents": [
        "99de2459e200e0c86d55d5eee7ea000fd030990f"
      ],
      "author": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Mon Aug 20 13:20:14 2012 -0700"
      },
      "committer": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Mon Aug 20 13:20:14 2012 -0700"
      },
      "message": "Pass URLs to package verifiers\n\nThis change passes the originating URL and accompanied referrer to\npackage verifiers, when available.\n\nBug: 6544677\nChange-Id: I9ebc71bc13f549bd88267e444816151a99bda000\n"
    },
    {
      "commit": "258848d2ae04f447ff1c18023fa76b139fcc0862",
      "tree": "8736421f4007d81206d0f0ea8b32a2013508976a",
      "parents": [
        "75f0fac91bd7fa67fa76cfdd4e163b9f35be0432"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Aug 10 17:06:33 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Sat Aug 11 18:24:07 2012 -0700"
      },
      "message": "User Manager service to manage users and query user details\n\nMoved a bunch of methods from PackageManager to UserManager.\n\nFix launching of activities from recents to correct user.\n\nGuest creation APIs\n\nChange-Id: I0733405e6eb2829675665e225c759d6baa2b708f\n"
    },
    {
      "commit": "e1d7c711df3e3a2d2f195457882aa4ddb5626167",
      "tree": "d27b6e508c1bdbd29028034471ee46acfe5d6cf8",
      "parents": [
        "24713907fe4632d263aea82f7a35c8fb08918a09"
      ],
      "author": {
        "name": "Rich Cannings",
        "email": "richc@google.com",
        "time": "Wed Aug 08 12:46:06 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Aug 08 12:46:06 2012 -0700"
      },
      "message": "Revert \"Pass URLs to package verifiers\"\n\nThis reverts commit 24713907fe4632d263aea82f7a35c8fb08918a09\n\nChange-Id: Ie04ba73475b813635c4a74915c45e83250801b6b\n"
    },
    {
      "commit": "24713907fe4632d263aea82f7a35c8fb08918a09",
      "tree": "fbf80caed2388c579d64b20b86b9b9f2586b1640",
      "parents": [
        "26ea2e5df58edfd14717c86854f6bb99975b6a77"
      ],
      "author": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Thu Jul 26 14:07:53 2012 -0700"
      },
      "committer": {
        "name": "rich cannings",
        "email": "richc@google.com",
        "time": "Thu Aug 02 11:26:47 2012 -0700"
      },
      "message": "Pass URLs to package verifiers\n\nThis change passes the originating URL and accompanied referrer to\npackage verifiers, when available.\n\nBug: 6544677\nChange-Id: If9ff6663ad7f3426b7aea2aceb1413b689788138\n"
    },
    {
      "commit": "197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0ac",
      "tree": "91ddac285a05fd389615ed6fab622d65b4bf2cee",
      "parents": [
        "9c469ca0ff92ffa533faed9416d725be2204ed55"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Jul 12 14:46:04 2012 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Jul 12 14:46:04 2012 -0700"
      },
      "message": "Improve cleanup of file caches.\n\nThis rewrites installd\u0027s code for deleting cache files to be better:\n\n- Isn\u0027t really stupid about just deleting directories in the order\n  they are found on the filesytem; now collects all cache files and\n  sorts them by mod time to determine which to delete.\n- Also deletes cache files in /data/media and for all users.\n\nThis also tweaks DeviceStorageMonitor to be a little smarter about\ndeciding when to flush cache files, having upper and lower limits\nthat it allows memory to get down to and then flash files to reach\nthe higher free storage limit.  This should reduce the amount that\nwe perform flushing when starting to reach the storage limit.\n\nFinally add a new pm command to force a cache flush.\n\nChange-Id: I02229038e1ad553d1168393e5cb6d5025933271d\n"
    },
    {
      "commit": "fd3d009dde21d7670d42d26f197f67c4c8e59184",
      "tree": "7e91bd87dcab0b4e6e470400924ce9e657642259",
      "parents": [
        "5ab6e12b450d13c8eb501001c7a8669826b86ea4"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed May 30 17:57:06 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed May 30 17:57:06 2012 -0700"
      },
      "message": "Remove some unnecessary man page entries\n\nChange-Id: I1ceda3f5efac83b80ab4b6e7cae4086aeed5062a\n"
    },
    {
      "commit": "ceb1b0bfaea56251796b08c07b963de7403d84eb",
      "tree": "fea73b05f6b4d47da174eca362693958cf5d785a",
      "parents": [
        "476b03b0c0d5cae4d1b114c6f80858d59ba36cad"
      ],
      "author": {
        "name": "Anonymous Coward",
        "email": "nobody@android.com",
        "time": "Tue Apr 24 10:35:16 2012 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Mon May 07 16:34:49 2012 -0700"
      },
      "message": "Add encryption parameters to package installation\n\nChange-Id: Ic9f8ab9f8110f08bb3c00725cfce5b8ee7b766f3\n"
    },
    {
      "commit": "719a6320a789e76566d6416d5ec35491d21f5c44",
      "tree": "3054ec8d31d3c2cd1936667aaeac46ae257109f5",
      "parents": [
        "263d044c790923d7d83ab036e79a3decc25c7b4d"
      ],
      "author": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Apr 30 13:46:54 2012 -0700"
      },
      "committer": {
        "name": "Jeff Sharkey",
        "email": "jsharkey@android.com",
        "time": "Mon Apr 30 13:46:54 2012 -0700"
      },
      "message": "Change permission enforcement through pm command.\n\nAdd \"set-permission-enforced\", which can currently only mutate\nenforcement of READ_EXTERNAL_STORAGE.\n\nBug: 6363043\nChange-Id: I3f7929738c8c36b0a54fbf171c03fe16c09b5d99\n"
    },
    {
      "commit": "483f3b06ea84440a082e21b68ec2c2e54046f5a6",
      "tree": "cc0dff8ea3d133a4dc910bc1e90c85380cea2064",
      "parents": [
        "8fca15f1f2273fa429e58f783d0970251d0942e5"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Tue Mar 13 16:08:00 2012 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Mar 22 10:08:24 2012 -0700"
      },
      "message": "Package restrictions per user\n\nPackages can be enabled/disabled per user.\nThis requires maintaining stopped/launched states and\nenabled / disabled components and packages per user.\n\nRefactored pm.Settings and PackageSettingsBase to keep\ntrack of states per user.\n\nMigrated the stopped-packages.xml to users/\u003cu\u003e/package-restrictions.xml\n\nChanged intent resolution to handle individual user restrictions.\nBunch of IPackageManager calls now have a userId argument.\nMake AppWidgetService handle removals of packages.\n\nAdded some tests for pm.Settings and PackageManager.\n\nChange-Id: Ia83b529e1df88dbcb3bd55ebfc952a6e9b20e861\n"
    },
    {
      "commit": "e639da7baa23121e35aa06d6e182558e0e755696",
      "tree": "7d956fc301eb1988a8646ff3a62786639a843da0",
      "parents": [
        "b8678d76c3e09d0d65255f3971b6112a48e19099"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Feb 21 15:11:13 2012 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu Feb 23 16:39:15 2012 -0800"
      },
      "message": "New development permissions.\n\nThese are permissions that an application can request, but won\u0027t\nnormally be granted.  To have the permission granted, the user\nmust explicitly do so through a new \"adb shell pm grant\" command.\n\nI put these permissions in the \"development tools\" permission\ngroup.  Looking at the stuff there, I think all of the permissions\nwe already had in that group should be turned to development\npermissions; I don\u0027t think any of them are protecting public APIs,\nand they are really not things normal applications should use.\n\nThe support this, the protectionLevel of a permission has been\nmodified to consist of a base protection type with additional\nflags.  The signatureOrSystem permission has thus been converted\nto a signature base type with a new \"system\" flag; you can use\n\"system\" and/or \"dangerous\" flags with signature permissions as\ndesired.\n\nThe permissions UI has been updated to understand these new types\nof permissions and know when to display them.  Along with doing\nthat, it also now shows you which permissions are new when updating\nan existing application.\n\nThis also starts laying the ground-work for \"optional\" permissions\n(which development permissions are a certain specialized form of).\nCompleting that work requires some more features in the package\nmanager to understand generic optional permissions (having a\nfacility to not apply them when installing), along with the\nappropriate UI for the app and user to manage those permissions.\n\nChange-Id: I6571785c6bb5f6b291862b7a9be584885f88f3a5\n"
    },
    {
      "commit": "742a67127366c376fdf188ff99ba30b27d3bf90c",
      "tree": "4a801b0b2e9ee10fb322e3b450e2af9eb6e3002f",
      "parents": [
        "8ca8a69d5801ad4b809e7b9dbf53bd728820924b"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Wed May 04 14:49:28 2011 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Feb 03 12:01:47 2012 -0800"
      },
      "message": "Multi-user - 1st major checkin\n\nSwitching activity stacks\nCache ContentProvider per user\nLong-press power to switch users (on phone)\n\nAdded ServiceMap for separating services by user\nLaunch PendingIntents on the correct user\u0027s uid\nFix task switching from Recents list\nAppWidgetService is mostly working.\n\nCommands added to pm and am to allow creating and switching profiles.\n\nChange-Id: I15810e8cfbe50a04bd3323a7ef5a8ff4230870ed\n"
    },
    {
      "commit": "92a208c6d3e0fdae54bbc942e7e041e48812bcaa",
      "tree": "061f326b5e1e58b7545336ebdb4c003d8889b3c3",
      "parents": [
        "d3209c1bb21ce026d4e41464740e3d8f57cdd56f"
      ],
      "author": {
        "name": "Ashish Sharma",
        "email": "ashishsharma@google.com",
        "time": "Tue Nov 01 18:16:12 2011 -0700"
      },
      "committer": {
        "name": "Ashish Sharma",
        "email": "ashishsharma@google.com",
        "time": "Fri Dec 09 00:31:54 2011 -0800"
      },
      "message": "Add a command option to display installerPackageName\n\nChange-Id: I2e5cb5891c610531d9ba7c359fd5dd521f8ecfec\n"
    },
    {
      "commit": "5ab2157bf1f105b02d3e2913cd3a33f9765b74ca",
      "tree": "5c2241ddca3526545b73472ed0006eaba0439da1",
      "parents": [
        "dd7bc9f457204e60feeea53b0b12ba706d6964df"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Wed Jul 27 11:11:19 2011 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Mon Aug 15 17:26:31 2011 -0700"
      },
      "message": "Infrastructure to support package verifier\n\nAllow a package verifier to approve or disapprove of a package being\ninstalled.\n\nChange-Id: Ibfea0f2b1aaa4ab1589a4e59f96144702b9bf94b\n"
    },
    {
      "commit": "46d110329e659cc9cb9514e220ce273701eb151d",
      "tree": "17e69181373b20f3ca37857e63a3bbd378e87e7f",
      "parents": [
        "58b868417755805ebdfe4feb65664ad98c00bf35"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Jun 24 13:22:45 2011 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Jun 24 13:22:45 2011 -0700"
      },
      "message": "Small cleanup of am/pm commands.\n\nChange-Id: I5af730bc177635821a82d4dd3ec9130a5dcd525a\n"
    },
    {
      "commit": "0ac3031c159a0904e73eb4439cdc724d8df4a6e6",
      "tree": "27d80b0cb1d37b10c898340348ae863014c4a6e0",
      "parents": [
        "3a3efe756389cbda3ddf74c0c55d7a3ce68f3780"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Jun 17 14:49:23 2011 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri Jun 17 14:49:45 2011 -0700"
      },
      "message": "Implement remaining infrastructure for user disabling apps.\n\nChange-Id: If8135eb0e27ec36f8f159eb7b6397add7acd0299\n"
    },
    {
      "commit": "a51b6fd6f8a53f040894ef07cf23695581595e6b",
      "tree": "b2e2b02e6a0568054fa279c54f50b7d2c80a9b18",
      "parents": [
        "3a9e712aca65ac49e7155e98e5d6b815da76f94b",
        "b2d0ee164a1cf7bab31302c5d3cdd62322574271"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Thu May 19 15:02:18 2011 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Thu May 19 15:02:18 2011 -0700"
      },
      "message": "resolved conflicts for merge of b2d0ee16 to master\n\nChange-Id: I4483a6d0ccecfea4a1e66bb6eba80d13e8b9a3a4\n"
    },
    {
      "commit": "e6cd0c747e76723bc51a23925c239ae10f9d3b5c",
      "tree": "6fd4fa9f3e207f5a0aaf50edf972374196390a49",
      "parents": [
        "0a36cec642fb58e295d0608026890d95d0ae3cc0",
        "2433c443bb5fe96d9a39b59e10e3c03d791e2278"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Thu May 19 12:48:14 2011 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Thu May 19 12:48:14 2011 -0700"
      },
      "message": "resolved conflicts for merge of 2433c443 to honeycomb-plus-aosp\n\nChange-Id: I3385f57e5761679e6700bcbe3c41deb3ecd43ba1\n"
    },
    {
      "commit": "2433c443bb5fe96d9a39b59e10e3c03d791e2278",
      "tree": "7feb2b64268b9b476e4fa5c91b19cdee3f86c117",
      "parents": [
        "4b999030ad3e9f8d392d72c725134ec3fb6d2290",
        "f2006f3123dcdf598e052051041b49c89710b53e"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Thu May 19 11:04:01 2011 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu May 19 11:04:01 2011 -0700"
      },
      "message": "am f2006f31: Merge \"Break apart queries to getInstalled* API\" into gingerbread\n\n* commit \u0027f2006f3123dcdf598e052051041b49c89710b53e\u0027:\n  Break apart queries to getInstalled* API\n"
    },
    {
      "commit": "3d0724dc220a2e027b9e38f61c39c84c28a505d5",
      "tree": "d0bb402a46c3de05da7f086c629b78c3b175b3ba",
      "parents": [
        "674b595fa5299d138e068b2b786027d6d6225394",
        "0e59729b104e48c7d935026f565c4b45f1f37d12"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu May 12 15:39:41 2011 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu May 12 15:39:41 2011 -0700"
      },
      "message": "resolved conflicts for merge of 0e59729b to master\n\nChange-Id: I2d3a6bddf66b1df0c101c45ea2fec1cf65caf01b\n"
    },
    {
      "commit": "0f1de9adde0b52d2a385a76232bd7ac30c3eeea2",
      "tree": "6d30064324ea987411955a88cb0272ddb27d39b2",
      "parents": [
        "f3cdea937b8b659f959d5e77f4a17f749f85c6ae"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed May 11 17:34:49 2011 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu May 12 13:28:45 2011 -0700"
      },
      "message": "New compat mode front end: UI and persistence.\n\nAdds a really crappy UI for toggling compat mode.\n\nPersists compat mode selection across boots.\n\nTurns on compat mode by default for newly installed apps.\n\nChange-Id: Idc83494397bd17c41450bc9e9a05e4386c509399\n"
    },
    {
      "commit": "0e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3",
      "tree": "f39c38afc819ce0d75513880cca7fefcdab6925c",
      "parents": [
        "71a556f24e2b8d489bf81b22fab6fe5e99a9eae0"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Fri Apr 15 17:50:10 2011 -0700"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Tue Apr 19 09:57:54 2011 -0700"
      },
      "message": "Break apart queries to getInstalled* API\n\nTo avoid blowing past the Binder IPC limit, change the\nPackageManagerService to have a DB-like interaction where the client\ntells the service the last \"row\" that it read.\n\nThe fact that we use a HashMap instead of a TreeMap makes this\nproblematic. For now we\u0027re just making a new ArrayList for the keys and\nthen sorting them for each call. This can make the API slower for callers\nof this, but it\u0027s probably greatly overshadowed by the cost of the data\ntransfer itself.\n\nBug: 4064282\nChange-Id: Ic370fd148d4c3813ae4f2daffa1a7c28d63d5a09\n"
    },
    {
      "commit": "0b285499db739ba50f2f839d633e763c70e67f96",
      "tree": "77e6ecb6572cefdfae2095dcf64c4388adae15c2",
      "parents": [
        "4123211637dcc0155091016f0c0987b80e56ab7b"
      ],
      "author": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Thu Apr 14 17:35:23 2011 -0700"
      },
      "committer": {
        "name": "Amith Yamasani",
        "email": "yamasani@google.com",
        "time": "Fri Apr 15 15:15:27 2011 -0700"
      },
      "message": "Plumbing in PackageManager and installd for multi-user support.\n\n- Create /data/user directory and symlink /data/user/0 -\u003e /data/data for\n  backward compatibility\n- Create data directories for all packages for new user\n\n- Remove data directories when removing a user\n\n- Create data directories for all users when a package is created\n\n- Clear / Remove data for multiple users\n\n- Fixed a bug in verifying the location of a system app\n\n- pm commands for createUser and removeUser (will be disabled later)\n\n- symlink duplicate lib directories to the original lib directory\n\nChange-Id: Id9fdfcf0e62406a8896aa811314dfc08d5f6ed95\n"
    },
    {
      "commit": "c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffeb",
      "tree": "a17b98261c9fa066d13363442585f0a227a29ce7",
      "parents": [
        "051d4430715ea257f0afd124b919a14ced6385b8"
      ],
      "author": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Mon Feb 28 13:27:19 2011 -0800"
      },
      "committer": {
        "name": "Kenny Root",
        "email": "kroot@google.com",
        "time": "Tue Mar 01 09:27:57 2011 -0800"
      },
      "message": "Switch to returnCode for IPackageDeleteObserver\n\nBefore the IPackageDeleteObserver only knew whether the deletion\nsucceeded or failed, but not the reason why.\n\nBug: 2520191\nChange-Id: I1f0d7c04f06c539660b6e17e7e133defb0f61b5b\n"
    },
    {
      "commit": "4f05220d10338b6ad668c87e70cbe7b9914a9047",
      "tree": "fe400e54a2fa2ad9dfd09a4f09f8255f22df1171",
      "parents": [
        "bdd8d17d81c4ef41a2ae82c7f73ecff6b48f493e",
        "690d20bb53ba2485f59d128b365eff991d5cc3e6"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Sun Jan 09 11:59:12 2011 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Sun Jan 09 11:59:12 2011 -0800"
      },
      "message": "Merge commit \u0027690d20bb53ba2485f59d128b365eff991d5cc3e6\u0027 into manualmerge\n"
    },
    {
      "commit": "95db1cfc741c23c7f4192128e3b7bb3c43761bdb",
      "tree": "903faca55d157e428f374f010243f21b3b22981e",
      "parents": [
        "9688fdf51edb82a73e1a6d436bf7bce706c049fb",
        "cd23823d4f533431c76baa104eb50b7803b3b391"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Sun Jan 09 11:44:17 2011 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Sun Jan 09 11:44:17 2011 -0800"
      },
      "message": "am cd23823d: Merge \"Fix issue # 3227963: SecurityException: Neither user 10023 nor...\" into gingerbread\n\n* commit \u0027cd23823d4f533431c76baa104eb50b7803b3b391\u0027:\n  Fix issue # 3227963: SecurityException: Neither user 10023 nor...\n"
    },
    {
      "commit": "690d20bb53ba2485f59d128b365eff991d5cc3e6",
      "tree": "dc9e90632571711a17a963e39d04fa85613cdc11",
      "parents": [
        "3ce86481cbde92e2cb6fe3a46cbedd8b2a5c4b48"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Dec 22 14:03:29 2010 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Wed Dec 22 16:31:44 2010 -0800"
      },
      "message": "Fix issue # 3227963: SecurityException: Neither user 10023 nor...\n\n...current process has android.permission.WAKE_LOCK\n\nWhen updating a system app, we would actually uninstall the package\nof the system app, which also meant removing its uid...!  It was just\nluck that we would get the same uid when installing the update after\nthat.  During that time, if anyone tried to do anything related to\nthat uid, it would be unknown.\n\nThis change tweaks how we go about replacing system apps by making\nit more like normal apps -- to make this work, if we need to disable\nthe system app, we generate a new PackageSetting from the current\nsystem app and replace it into our data structures, so we can update\nthat without trashing the current correct information about the (still\nactually there) system app.\n\nAlso fixed a problem where we were not killing the currently running\napp before installing, like we do when updating a normal application.\n\nAnd fixed a problem where we were not deleting the /data .apk when\nuninstalling a system app update.\n\nAnd added a new option to the \"pm\" command to clear the data associated\nwith an app.\n\nChange-Id: I0e879677849aa42950a3c360bf78ad820e87674b\n"
    },
    {
      "commit": "ccc714131359eb1022d8c6702b7d82ab9e93f27c",
      "tree": "150c9798fc3d0d5dfee9c83d75845014a5edf983",
      "parents": [
        "ffdd591a829af7fddd36a7b80d2a3b8188c871a6",
        "78e9f4cbaece783b7b87ce3fb0a157dae766012a"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Dec 13 14:55:25 2010 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Dec 13 14:55:25 2010 -0800"
      },
      "message": "resolved conflicts for merge of 78e9f4cb to master\n\nChange-Id: I1135361e6d66f524c3f349e2bf1f31bd4191c634\n"
    },
    {
      "commit": "78e9f4cbaece783b7b87ce3fb0a157dae766012a",
      "tree": "92ab76a16e62d5284f826fa58499bae963245b84",
      "parents": [
        "6d13b146e0444f40f45b9fe5812093c5e611b68e",
        "e4a5951925f16f18dae91ed65567e96528f17fee"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Dec 13 14:37:09 2010 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Mon Dec 13 14:37:09 2010 -0800"
      },
      "message": "am e4a59519: Fix issue #3154576: battery stats checkin should include UID -\u003e packages+ map\n\n* commit \u0027e4a5951925f16f18dae91ed65567e96528f17fee\u0027:\n  Fix issue #3154576: battery stats checkin should include UID -\u003e packages+ map\n"
    },
    {
      "commit": "e4a5951925f16f18dae91ed65567e96528f17fee",
      "tree": "b96636542b481ce23865326f49c5ddff934e71cd",
      "parents": [
        "e3f6336bcffc250da90ec864bccfa73ad1d016b9"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue Dec 07 11:08:07 2010 -0800"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon Dec 13 14:31:40 2010 -0800"
      },
      "message": "Fix issue #3154576: battery stats checkin should include UID -\u003e packages+ map\n\nIncludes some other small fixes to battery collection and a few\nother things.\n\nOutput of package info looks like this:\n\n5,0,i,uid,1000,com.android.settings\n5,0,i,uid,1000,com.android.providers.subscribedfeeds\n5,0,i,uid,1000,com.android.providers.settings\n5,0,i,uid,1000,com.android.server.vpn\n5,0,i,uid,1000,android\n5,0,i,uid,1000,com.android.systemui\n5,0,i,uid,1000,com.google.android.backup\n5,0,i,uid,1001,com.android.phone\n5,0,i,uid,1001,com.android.providers.telephony\n5,0,i,uid,1022,com.android.nfc\n5,0,i,uid,10021,com.google.android.location\n5,0,i,uid,10021,com.google.android.syncadapters.calendar\n5,0,i,uid,10021,com.google.android.gsf\n5,0,i,uid,10021,com.google.android.syncadapters.contacts\n5,0,i,uid,10026,com.android.providers.downloads.ui\n5,0,i,uid,10026,com.android.providers.media\n5,0,i,uid,10026,com.android.providers.drm\n5,0,i,uid,10026,com.android.providers.downloads\n5,0,i,uid,10032,com.android.launcher\n5,0,i,uid,10039,com.google.android.gm\n5,0,i,uid,10041,com.google.android.gallery3d\n5,0,i,uid,10049,com.android.providers.calendar\n\nChange-Id: I9e38f254eef146339113ad270f5c6e8b60fb7a1d\n"
    },
    {
      "commit": "edebb2fe1d1c4d3ad17db91cd7e2bfe8feafd0b7",
      "tree": "763749fe5178479da84f47bc75e5d4f9607fdff7",
      "parents": [
        "0d76ca7a979b8e7cdf27a619a2a6df8b331a0d31",
        "b087ceead79bcb304e5793c6ae9109ce590847dc"
      ],
      "author": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Thu Dec 02 08:03:25 2010 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Dec 02 08:03:25 2010 -0800"
      },
      "message": "am b087ceea: am 40eade14: Merge from open-source master\n\n* commit \u0027b087ceead79bcb304e5793c6ae9109ce590847dc\u0027:\n  Fix crash by \"adb shell pm list permissions -f|-s\"\n"
    },
    {
      "commit": "1c3274ca12a6931568693b897c269107f0346eab",
      "tree": "f16be948fd0c11f124c2e8b402b1f290c1956879",
      "parents": [
        "f0f6c54b13831b11bd7a3bd7a01dc49b7505e56e"
      ],
      "author": {
        "name": "Ali Utku Selen",
        "email": "aliutku.selen@sonyericsson.com",
        "time": "Tue Nov 30 10:37:10 2010 +0100"
      },
      "committer": {
        "name": "Kenneth Andersson",
        "email": "kenneth.andersson@sonyericsson.com",
        "time": "Tue Nov 30 16:22:56 2010 +0100"
      },
      "message": "Fix crash by \"adb shell pm list permissions -f|-s\"\n\npm command makes the assumption that every permission should\ncontain android:description and android:label attributes while\nthey are not mandatory. If a permission does not contain these\ntwo attributes, we get \"android.content.res.\nResources$NotFoundException: String resource ID #0x0\"\nfollowed by a NPE when using -f or -s options.\n\nWith the following change, users will get \"null\" in output for\nrespective fields.\n\nChange-Id: I4e7f407592fa071abdab1d979775f46ec27dc9d2\n"
    },
    {
      "commit": "babe28e01c6e845e41f8a7d23ab0b2a2c93a2e6b",
      "tree": "acf55cad9d5266bcfe6a9a953b59dfe3f8401b0a",
      "parents": [
        "f827a0cf1d42e3f69050c2888221e901d7f80330"
      ],
      "author": {
        "name": "Joe Malin",
        "email": "jmalin@google.com",
        "time": "Mon Aug 30 15:52:14 2010 -0700"
      },
      "committer": {
        "name": "Joe Malin",
        "email": "jmalin@google.com",
        "time": "Tue Aug 31 13:31:20 2010 -0700"
      },
      "message": "Doc change: Update pm command usage for test packages\n\nChange-Id: If9c51e0265394538023a913fa271dfb80f14a92e\n"
    },
    {
      "commit": "40e472521a544f26cb6956995788f7c36fff1404",
      "tree": "b579a480e80d8ac15128c31c142b22d0938a44f8",
      "parents": [
        "4b18ced6b5409bb9dd4013c06b9562b76a062939"
      ],
      "author": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Wed Apr 07 16:15:50 2010 -0700"
      },
      "committer": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Wed Apr 07 20:43:54 2010 -0700"
      },
      "message": "Fix 2579461\nMove install location values to secure settings.\nDiable attribute for UI. Set default value to auto.\nAdd command line interface to set install location via pm.\n\nChange-Id: I80e97b3d24845adad7102f40dcbe238f00efa406\n"
    },
    {
      "commit": "e99bb5f10b90736d10cee9729b56cba156fc0921",
      "tree": "2977919e3fb3e0fcfeb5954240a2ee37abb55617",
      "parents": [
        "cbf953ed09b036441d90e14b0723a2ea417b3f35"
      ],
      "author": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Fri Mar 19 14:36:49 2010 -0700"
      },
      "committer": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Mon Mar 22 10:49:49 2010 -0700"
      },
      "message": "Add new method call back in MountService.\nPackageManager invokes this call back when its done handling\nthe media status update.\nAdd new uid check for updateExternalMediaStatus\nChange killPids method in ActivityManager.\nRemove mountsd command in Pm.java We cannot arbitrarily enable/disable\npackages in PackageManager now.\n\nChange-Id: I28dcba4afd2b4486f68abdaa1628a31b66544c91\n"
    },
    {
      "commit": "14b6abda1309631d49d4bebbb0317a7e1dfc0a50",
      "tree": "bee361e635743a09bb7253fef333d6fb94df6322",
      "parents": [
        "d246ca811575eee9122070648e93b7484f6edd81"
      ],
      "author": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Wed Mar 17 08:37:04 2010 -0700"
      },
      "committer": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Wed Mar 17 18:43:31 2010 -0700"
      },
      "message": "Add new install flag to install on internal flash only\nChange default install location policy for new flag.\nNew error code for media unavailable.\n\nChange-Id: I5a5d0828b067692b2b94a15a2bcc7534f796c1a2\n"
    },
    {
      "commit": "8946dd3355fc1dcbad872c0546e356474d4cc5de",
      "tree": "8b614c938152df8ad809fd9bf03c6876c8a7a58e",
      "parents": [
        "eac461cf7c246df737d2b0e7bd30be176a34c36e"
      ],
      "author": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Fri Feb 19 09:19:34 2010 -0800"
      },
      "committer": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Fri Feb 19 14:20:54 2010 -0800"
      },
      "message": "Move package from internal to external and vice versa.\n"
    },
    {
      "commit": "5b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2",
      "tree": "fc25f9f6adee005c287454a74837f6cbc1a072a0",
      "parents": [
        "70251b1704b9bb81443e7533d365400645dd5eaa"
      ],
      "author": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Fri Feb 12 09:43:29 2010 -0800"
      },
      "committer": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Fri Feb 12 18:50:47 2010 -0800"
      },
      "message": "Include install location preference when installing packages.\nChanges include\nAdd new remote call in default container service to determine\ninstall location.\nRename INSTALL_ON_SDCARD\nRemove recommentAppInstall method\nAdd some additional flags used in remote stubs.\nMove check for protected apps prior to copy.\nUnit tests\n\nDefaultContainerService first parses the file uri(if content uri is specified\nit returns a default install internal only value) and returns\na recommended location. Based on which the temporary id is determined\neither a file name or a container id and the file is copied there.\nThis is then later renamed during install.\nTodo\u0027s light weight parsing of package when determining location since we\njust need the install location attribute only when finding out\nrecomended location. This will also enable to move the check for\nupdated system apps(cannot be on sdcard) prior to copying.\n"
    },
    {
      "commit": "fd3530f90562bb7e66edfee39d90fc8beda82f1d",
      "tree": "3829a74034270ac5434a0863e5dd115172443dfc",
      "parents": [
        "97d1195832829905b07b7680b73bed8af959f430"
      ],
      "author": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Mon Jan 18 00:15:59 2010 -0800"
      },
      "committer": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Tue Jan 19 14:04:54 2010 -0800"
      },
      "message": "Mount/Unmount secure containers\nPersist flags in PackageSetting. Flags are relevant to ApplicationInfo.FLAG_SYSTEM, Application.FLAG_ON_SDCARD, ApplicationInfo.FLAG_FORWARD_LOCK.\nNew pm command to simulate mount/unmount in Pm. This will be removed\nwhen MountService/vold event generation gets fixed.\nCalls from MountService into PackageManager when media gets mounted/unmounted.\nScan the packages and grant permissions when the sdcard gets mounted.\nThis api might change again.\n"
    },
    {
      "commit": "af8e9f4805643f90a9dc0ecfa119e0a860c12f8a",
      "tree": "a6ea88a10b61204a5256901dca8b958849e13dc4",
      "parents": [
        "f6fff20a96268b0b1136a2c44199ad8de46ced5d"
      ],
      "author": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Tue Jan 12 10:17:28 2010 -0800"
      },
      "committer": {
        "name": "Suchi Amalapurapu",
        "email": "asuchitra@google.com",
        "time": "Thu Jan 14 14:02:39 2010 -0800"
      },
      "message": "app install on sdcard. provide skeleton implementation\nto install an app on sdcard, just resources.\nAdd new install path for /asec in installd.\nignore . when checking for apk path since the sdcard packages id\u0027ed\nby package name.\nAdd new -s option to adb shell pm\nRefactor fwd locked from scanMode to ApplicationInfo.\nAdd new flag for sd install\nAdd new parse flags for fwd locking and installing on sdcard\nNew mock api\u0027s in PackageManagerService to invoke MountService api\u0027s. These\nwill be refactored again and so have been wrapped internally.\nSome error codes in PackageManager\nChanges in PackageManagerService to use mPath and mScanPath during installation\nand switch to using PackageParser.Package.applicationInfo attributes for\nsource and public resource directories.\nSome known issues that will be addressed later\n using system_uid for now. needs some tinkering with uid and packagesetting creation to use the actual app uid\n error handling from vold not very robust. ignoring lot of things for now\n sending a delayed destroy to delete packages. will revisit later\n revisit temp file creation later. just copy for now\n"
    },
    {
      "commit": "039c68e75606e837cf021815a0210836724574ad",
      "tree": "c65d4f12f6401a113421e3d6b59601da3d7ea97d",
      "parents": [
        "075a18d607c3aa8386b4d06aea22f4bfacbe447b"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Sat Sep 26 16:39:23 2009 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Sat Sep 26 16:39:23 2009 -0700"
      },
      "message": "The touch screen is probably a feature.\n\nAlso extend the feature APIs a bit.\n\nChange-Id: I99e932d7f4e61edb0e20f75c55e9831e4b59a14d\n"
    },
    {
      "commit": "23b4faf69437b732d681d9bee5c9a84379d5ccad",
      "tree": "b2f7ef4edda01b216aa7ed2137e7296b9e080f50",
      "parents": [
        "a0cad2f5d19d95cfe496ebb82f3227dd4ed7c169"
      ],
      "author": {
        "name": "Xavier Ducrohet",
        "email": "xav@android.com",
        "time": "Thu Sep 24 17:41:13 2009 -0700"
      },
      "committer": {
        "name": "Xavier Ducrohet",
        "email": "xav@android.com",
        "time": "Fri Sep 25 11:57:44 2009 -0700"
      },
      "message": "Use reflection to figure out a readable string from install error code.\n\nInstead of a switch that needs to be maintained, the code now\nlook for public static final int fields in PackageManager\nwhose names start with INSTALL_FAILED or INSTALL_PARSE_FAILED.\n\nIf their int value match the error code, the name of the field\nis used as a human readable error string.\n\nChange-Id: If58ddc4d9ccc40a9a8aaec9de4cc7e4931db0292\n"
    },
    {
      "commit": "f03fb486ac089bf68ae3bfe7b6687dd4b928a340",
      "tree": "f6c8348268a6a80175d4dd42f90398cfd6a637a5",
      "parents": [
        "550d48f3342f01ccf6c310845e8c0b986ab7b506"
      ],
      "author": {
        "name": "Xavier Ducrohet",
        "email": "xav@android.com",
        "time": "Mon Aug 31 16:40:30 2009 -0700"
      },
      "committer": {
        "name": "Xavier Ducrohet",
        "email": "xav@android.com",
        "time": "Mon Aug 31 16:42:12 2009 -0700"
      },
      "message": "Add error output to pm for FAILED_MISSING_FEATURE\n\nChange-Id: Ib9955b69b69db7d442402ab33e148cb40dec3d40\n"
    },
    {
      "commit": "b181118b6e58c0014da4e9d52bf38548adc73a8a",
      "tree": "4f62cb71cacc03d25935e5430d8aa431dbeef854",
      "parents": [
        "5b6a5cee4c48fd2ffc35f07ebe9f24eb53086b9a"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Thu May 21 15:45:42 2009 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri May 22 18:45:25 2009 -0700"
      },
      "message": "Define TARGET_CPU_ABI for finding native code in .apks\n"
    },
    {
      "commit": "ade3ecad94d1f4431576f53bae26c35efbf7a2c9",
      "tree": "066fc83ddeb6c52011e13744152b594911895094",
      "parents": [
        "807f23b2d8c7148cf6fc95bb88cfc2f78e4be66a"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Mon May 11 18:54:45 2009 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Tue May 12 16:09:43 2009 -0700"
      },
      "message": "Implement issue #1783881 (manifest option for adb-install-only apps)\n\nYou can now use android:testOnly\u003d\"true\" to not allow your .apk to be installed\nas a normal app.  The only way to do so is with the pm command and giving the\n-t option, which sets a new INSTALL_ALLOW_TEST flag when installing.\n\nI also used this to clean up the install API...  actually, mostly to hide\nit, since it is not accessible to apps so shouldn\u0027t be in the SDK.  We\nwill be doing some more work on it, so this will prevent adding yet\nanother backwards-compatibility-for-no-reason version.\n"
    },
    {
      "commit": "c64322c35212e919906ffd66118c7d5d3ad36636",
      "tree": "846d1a95480c87f18975245ceea201535e23c553",
      "parents": [
        "3e3439d5ba0cf5eda060c4991219c32af917fc5b"
      ],
      "author": {
        "name": "Jacek Surazski",
        "email": "jaceks@google.com",
        "time": "Tue Apr 28 15:26:38 2009 +0200"
      },
      "committer": {
        "name": "Jacek Surazski",
        "email": "jaceks@google.com",
        "time": "Tue May 12 23:16:20 2009 +0200"
      },
      "message": "PackageManager keeps track of who installed what.\n\nStores the package name of the installer app in packages.xml\n"
    },
    {
      "commit": "851a54143c15a1c33361efae2db3f7f45059b472",
      "tree": "c9e6ced5424530ff9a40f5471afb969e15cac35e",
      "parents": [
        "ed3b804f2cc61029cf2969cbfa499ea230c22bb0"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri May 08 12:06:44 2009 -0700"
      },
      "committer": {
        "name": "Dianne Hackborn",
        "email": "hackbod@google.com",
        "time": "Fri May 08 15:15:36 2009 -0700"
      },
      "message": "Implement targetSdkVersion and maxSdkVersion, plus version code names.\n\nThis adds new attributes for specifying a targetSdkVersion and maxSdkVersion.\nThere is a new ApplicationInfo flag that is set if the application has set\nits targetSdkVersion to the current platform or later.  Also you can now\nuse a string for minSdkVersion and targetSdkVerion, to indicate you are\nbuilding against a development tree instead of an official platform.\n"
    },
    {
      "commit": "105925376f8d0f6b318c9938c7b83ef7fef094da",
      "tree": "3b19ee2bd8704cb9c6a0da7e42dec6759183de6d",
      "parents": [
        "ba87e3e6c985e7175152993b5efcc7dd2f0e1c93"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Mar 18 17:39:46 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Mar 18 17:39:46 2009 -0700"
      },
      "message": "auto import from //branches/cupcake_rel/...@140373\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": "b798689749c64baba81f02e10cf2157c747d6b46",
      "tree": "da394a395ddb1a6cf69193314846b03fe47a397e",
      "parents": [
        "f013e1afd1e68af5e3b868c26a653bbfb39538f8"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:51:23 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:51:23 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@125939\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"
    }
  ]
}
