)]}'
{
  "log": [
    {
      "commit": "60971e6ce22bd4fee531dc72875acb4b913f69a7",
      "tree": "aa80b358efb90ac48551640a81e29dc0d52aefad",
      "parents": [
        "6f735df0d1268cc976e5834c3cb1cc9e6fe9395d"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 10 10:40:47 2019 -0700"
      },
      "committer": {
        "name": "Tobias Thierer",
        "email": "tobiast@google.com",
        "time": "Fri Sep 13 16:48:35 2019 +0100"
      },
      "message": "init: add reboot_on_failure service option\n\nThis replaces the recently added `exec_reboot_on_failure` builtin, since\nit\u0027ll be cleaner to extend service definitions than extending `exec`.\nThis is in line with what we decided when adding `exec_start` instead\nof extending `exec` to add parameters for priority.\n\nTest: `exec_start` a service with a reboot_on_failure option and watch\n      the system reboot appropriately when the service is not found and when\n      the service terminates with a non-zero exit code.\n\nChange-Id: I332bf9839fa94840d159a810c4a6ba2522189d0b\n"
    },
    {
      "commit": "4e46a33c70c50940b19e37af7b99924f559b8542",
      "tree": "78ed479609281bf3e45c2a2ee2731fa127f9a71b",
      "parents": [
        "483c2f90598aedfcdedd120fcce26ab7c39989a4",
        "1ab3dfcab469198114c4bb4a3914c6b64b891f72"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 10 17:04:57 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Sep 10 17:04:57 2019 +0000"
      },
      "message": "Merge \"Reland^2: \"init: run property service in a thread\"\""
    },
    {
      "commit": "1ab3dfcab469198114c4bb4a3914c6b64b891f72",
      "tree": "7e8fb97277f79767cb4f473b22f1173011c3d149",
      "parents": [
        "50e408db2d1bd015f87996f98b0bc21a39402ab0"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 22 17:46:37 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Sep 05 14:42:58 2019 -0700"
      },
      "message": "Reland^2: \"init: run property service in a thread\"\n\nIt\u0027s been a long standing issue that init cannot respond to property\nset messages when it is running a builtin command.  This is\nparticularly problematic when the commands involve IPC to vold or\nother daemons, as it prevents them from being able to set properties.\n\nThis change has init run property service in a thread, which\neliminates the above issue.\n\nThis change may also serve as a starting block to running property\nservice in an entirely different process to better isolate init from\nhandling property requests.\n\nReland: during reboot, init stops processing property_changed messages\nfrom property service, since it will not act on these anyway.  This\nhad an unexpected effect of causing future property_set calls to block\nindefinitely, since the buffer between init and property_service was\nfilling up and the send() call from property_service would then\nblock.  This change has init tell property_service to stop sending it\nproperty_changed messages once reboot begins.\n\nTest: CF boots, walleye boots, properties are set appropriately\nChange-Id: I26902708e8be788caa6dbcf4b6d2968d90962785\n"
    },
    {
      "commit": "1136f1592a50c90b3b59fbc3293e4c1e155972e0",
      "tree": "1a2e18452d2a0167ca52d7f86ddf7bc728fe59bd",
      "parents": [
        "7896e7adccbd272533ee2250f4a9c65cd4ca66d0"
      ],
      "author": {
        "name": "Tobias Thierer",
        "email": "tobiast@google.com",
        "time": "Fri Aug 23 14:05:29 2019 +0100"
      },
      "committer": {
        "name": "Tobias Thierer",
        "email": "tobiast@google.com",
        "time": "Thu Sep 05 01:41:08 2019 +0100"
      },
      "message": "Init: Run boringssl self test via separate binaries.\n\nInstead of init.cpp knowning about the boringssl self\ntest, use init.rc to exec dedicated self test executables.\n\nAdvantages:\n - The self test is run not only both the copy of libcrypto\n   in /system but also /apex/com.android.conscrypt.\n - The self test is run not only for the primary (e.g. 64bit)\n   ABI but also for a secondarry (e.g. 32bit) ABI.\n - The dependency on libcrypto is kept to the self test binary.\n - The self test binary abstracts the exact native API for\n   running the self test (this will change soon because the\n   self test will be run when the library is loaded).\n\nBug: 137267623\nTest: Check that logcat shows both binaries being started as root,\n      and finishing with exit code 0.\n\nChange-Id: I1e716749ee2133993f0f7b2836483391fd1a62f0\n"
    },
    {
      "commit": "905a5df83d1cdfd133ad53b3b6af999ddb485f94",
      "tree": "58fe73c80a7dce4a9fb7110a1e11f8abfeb22717",
      "parents": [
        "2b73b60c66d7c43515ed3c0db89735b9485f8ce6"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 30 14:12:56 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 30 14:20:05 2019 -0700"
      },
      "message": "init: Always reap processes before handling properties\n\nThere is a race that manifests like this:\n\n1) A service dies (not processed by init yet).\n2) service_manager processes death notification.\n3) service_manager gets checkService and calls init to start service.\n4) init gets the ctl.start / ctl.interface_start for the service\n   but the service already appears started, so it does nothing.\n5) init gets sigchld, but doesn\u0027t do anything else to restart the\n   service\n\nWe can avoid all of this if we already reap pending processes before\nhandling properties in the main loop of init.  Since reaping the\nservices calls waitid(), there\u0027s no race even if the signalfd for\nsigchld hasn\u0027t triggered yet.  It also won\u0027t cost us much efficiency,\nsince it\u0027s only a single system call.\n\nTest: CF boots, init unit tests pass\nChange-Id: Ie24ef406055b283797b41b1821c8ebcccead4db4\n"
    },
    {
      "commit": "9800ad839a6c8f851cc0fdfba488ed604ed371c1",
      "tree": "dace8a22655c9ff97a52197005d41fea5546f7b9",
      "parents": [
        "956c204f1e0fa1bcb246ec776f5551f12e23d971"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Wed Aug 28 18:34:24 2019 -0700"
      },
      "committer": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Thu Aug 29 16:08:36 2019 +0000"
      },
      "message": "init: -1 log for control message error paths.\n\nFixes: 140136969\nTest: check logs\nChange-Id: Id80f59927b44d1026c6e3389c80ca96baf0733c4\n"
    },
    {
      "commit": "4adbd2905a102c32775e83a1a90b04ccd293bd87",
      "tree": "4f83d46b3031492c3e2b05b5e0e1ef31bf599105",
      "parents": [
        "88bba9598937f18086fcf2bfbd5fafc785734aad",
        "3da2ba6d4aa16e5d087f98c1e8aa3e2e0820deef"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 28 17:50:00 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 28 17:50:00 2019 +0000"
      },
      "message": "Merge \"Revert \"Reland: \"init: run property service in a thread\"\"\""
    },
    {
      "commit": "3da2ba6d4aa16e5d087f98c1e8aa3e2e0820deef",
      "tree": "ce8954219e3664034069ec15747a401eb4952bf5",
      "parents": [
        "8efca4bbb378ff5bd3af06d8511ea75a7ed49f99"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 28 17:47:49 2019 +0000"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 28 17:47:49 2019 +0000"
      },
      "message": "Revert \"Reland: \"init: run property service in a thread\"\"\n\nThis reverts commit 8efca4bbb378ff5bd3af06d8511ea75a7ed49f99.\n\nReason for revert: Still broken\n\nChange-Id: I3b37b1b00ff4b19f2eec2d8bd72042463d47cee3\n"
    },
    {
      "commit": "88bba9598937f18086fcf2bfbd5fafc785734aad",
      "tree": "d2a922a342caf30ca25d82b993c056d91483659b",
      "parents": [
        "34f25373933d7c092cf713bc60b48a381fdfe0bc",
        "33783fc29c4235822516e90277632b9bbef1c982"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Wed Aug 28 17:44:55 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 28 17:44:55 2019 +0000"
      },
      "message": "Merge \"init: set SetKptrRestrict before early-init\""
    },
    {
      "commit": "33783fc29c4235822516e90277632b9bbef1c982",
      "tree": "f97da0e115f7858df3f6bf0a084a5fc36ae911b8",
      "parents": [
        "3bd09415a3f859467fae2b1516ffa3e95431bfa0"
      ],
      "author": {
        "name": "Ravi Kumar Siddojigari",
        "email": "rsiddoji@codeaurora.org",
        "time": "Tue Jul 30 16:41:20 2019 +0530"
      },
      "committer": {
        "name": "Jeff Vander Stoep",
        "email": "jeffv@google.com",
        "time": "Wed Aug 28 14:28:08 2019 +0200"
      },
      "message": "init: set SetKptrRestrict before early-init\n\nAs part of debugging long run issue we are enabling\nmodule info as part of debug build under the config key\nDEBUG_MODULE_LOAD_INFO , But doing so can lead to info leak\nas modules/dlkm are loaded in early-init and setting the\nkptr_restriction is done after early-init.\n\nSo moving setting of kptr_restrict much before early-init.\n\nBug: 138641073\n\nChange-Id: Ic3c0ca57a94c8b20136a15331dd646bd8825b625\n"
    },
    {
      "commit": "8efca4bbb378ff5bd3af06d8511ea75a7ed49f99",
      "tree": "6581b531b039c688547511960bb886a6306c3bad",
      "parents": [
        "a033693a9e5e39725be039140851756d88e7cc1b"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 22 17:46:37 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 26 17:08:41 2019 -0700"
      },
      "message": "Reland: \"init: run property service in a thread\"\n\nIt\u0027s been a long standing issue that init cannot respond to property\nset messages when it is running a builtin command.  This is\nparticularly problematic when the commands involve IPC to vold or\nother daemons, as it prevents them from being able to set properties.\n\nThis change has init run property service in a thread, which\neliminates the above issue.\n\nThis change may also serve as a starting block to running property\nservice in an entirely different process to better isolate init from\nhandling property requests.\n\nTest: CF boots, walleye boots, properties are set appropriately\nChange-Id: I13b8bf240c9fcb1d2d5890a8be2f0ef74efd4adf\n"
    },
    {
      "commit": "f451426205b9f2919c998d7dff87fda300944178",
      "tree": "3f98ab68d1f96d9311ecdc45df8b9a02608c85ab",
      "parents": [
        "26f5e7da3a8d99813d1db00bfb04e4ccd49e3221"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 26 16:33:40 2019 +0000"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 26 16:33:40 2019 +0000"
      },
      "message": "Revert \"init: run property service in a thread\"\n\nThis reverts commit 26f5e7da3a8d99813d1db00bfb04e4ccd49e3221.\n\nReason for revert: bluecross boot stability issue\n\nBug: 140009641\nChange-Id: I7ddb9509dfb2c6f644037129aa9d3fb9ff1740aa\n"
    },
    {
      "commit": "26f5e7da3a8d99813d1db00bfb04e4ccd49e3221",
      "tree": "cd49180a9683bf3bc6ec0843d5427d7b40d88841",
      "parents": [
        "3707d328a148e1886dcf8e6dc5dd88407bc6c40c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 22 17:46:37 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 21 08:26:09 2019 -0700"
      },
      "message": "init: run property service in a thread\n\nIt\u0027s been a long standing issue that init cannot respond to property\nset messages when it is running a builtin command.  This is\nparticularly problematic when the commands involve IPC to vold or\nother daemons, as it prevents them from being able to set properties.\n\nThis change has init run property service in a thread, which\neliminates the above issue.\n\nThis change may also serve as a starting block to running property\nservice in an entirely different process to better isolate init from\nhandling property requests.\n\nTest: CF boots, walleye boots, properties are set appropriately\nChange-Id: Id9534a5916abb2f7d2a49cda54e33c1b69c50c2f\n"
    },
    {
      "commit": "d52a5b3c10ad341e38f61466e81b7a963e6eb92e",
      "tree": "4a39211c457d181b091a854d8faeedb1be7170c5",
      "parents": [
        "b3fc1b7441b8cc4d11384cf8867682308daffb15"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jul 22 16:05:36 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jul 23 14:39:38 2019 -0700"
      },
      "message": "init: simplify keyword_map\n\nI\u0027ve heard that keyword_map is too complex, in particular the tuple\nand the pair in BuiltinFunctionMap, so this change removes a lot of\nthat complexity and, more importantly, better documents how all of\nthis works.\n\nTest: boot, init unit tests\n\nChange-Id: I74e5f9de7f2ec524cb6127bb9da2956b5f307f56\n"
    },
    {
      "commit": "4280165ae03280acd22765ef13042b2e166c6a19",
      "tree": "852b4ad19687b2e1f1f61916879d568b83e880a0",
      "parents": [
        "6da50e319c159e276c6186b319c71b80a5d6998e",
        "4ee27039e0ee4d7c1b5314642d51f01096bfa79e"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Thu Jul 11 20:56:12 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Jul 11 20:56:12 2019 +0000"
      },
      "message": "Merge \"Remove binder dependency in init.\""
    },
    {
      "commit": "4ee27039e0ee4d7c1b5314642d51f01096bfa79e",
      "tree": "cf786f28c3699d703d4676823b3d5f2ca2d76d0f",
      "parents": [
        "99087decb9c9bb63ea20e18f6fa5ccbcefe8cf2b"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Mon Jun 24 12:55:25 2019 -0700"
      },
      "committer": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Wed Jul 10 17:01:31 2019 +0000"
      },
      "message": "Remove binder dependency in init.\n\n- unused\n- using binder requires twoway calls (since getting a service from\n    servicemanager requires two calls)\n\nBug: 135768100\nTest: N/A\nChange-Id: Idc41f487bad2d8343e99ded98812f3a84e2b8e37\n"
    },
    {
      "commit": "7eaf9b58ecbaae486e2ecf98fa803c30f10fc3dc",
      "tree": "6160aa2b78e00dba7f4b39ce4cc4f0367ade845f",
      "parents": [
        "3f407fcc37b401c91784700c0a691ba8b1f7ef15"
      ],
      "author": {
        "name": "Justin Yun",
        "email": "justinyun@google.com",
        "time": "Fri Jun 28 14:28:00 2019 +0900"
      },
      "committer": {
        "name": "Justin Yun",
        "email": "justinyun@google.com",
        "time": "Tue Jul 09 23:34:17 2019 +0000"
      },
      "message": "Rename product_services to system_ext\n\nUpdate ld.config.txt and init.\n\nBug: 134359158\nTest: make \u0026\u0026 check boot and ld.config.txt file\nChange-Id: Ie1dce42e690414fb45b26759506ea7f64d06740d\n"
    },
    {
      "commit": "3df8dc58b2b5b1f60d45793e6a7c1f51a2fd2383",
      "tree": "a888e3b89fc5abe85c0c2f9f7352f7f10424ced2",
      "parents": [
        "c4117afdc9144e925bfb663d25c15a16b0700842"
      ],
      "author": {
        "name": "Daniel Norman",
        "email": "danielnorman@google.com",
        "time": "Thu Jun 27 12:18:08 2019 -0700"
      },
      "committer": {
        "name": "Daniel Norman",
        "email": "danielnorman@google.com",
        "time": "Fri Jun 28 13:31:54 2019 -0700"
      },
      "message": "Checks each interface in an init_rc file is a known hidl_interface.\n\nTest: Adding a misspelling to an init_rc\u0027s interface line and observing\nbuild failure.\nBug: 77646540\nChange-Id: I58f66d73f0bd9b4203e8259161843b56ad428d73\n"
    },
    {
      "commit": "172c83f972cd2e2603fc12efc21a0b0b69b18b8e",
      "tree": "86095bd5338a9eb6a80fda51434b93a730429d7f",
      "parents": [
        "ff88e3012671dbd36d1bfae07b168ea1c86ab07f"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jun 26 14:44:37 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jun 26 14:46:58 2019 -0700"
      },
      "message": "init: remove last init.cpp global\n\nBy moving it into builtins.cpp..., but that\u0027s less bad than it is\nnow, especially since this is defunct in code targeting Q+.  Remove\nthe guards that init.h isn\u0027t being included by other files too as it\u0027s\nnot useful anymore.\n\nTest: build\nChange-Id: Ic564fcff9e8716ec924098b07a8c9d94ca25f960\n"
    },
    {
      "commit": "ff88e3012671dbd36d1bfae07b168ea1c86ab07f",
      "tree": "2ba67a794559fae63f27f27e13a360aee261c059",
      "parents": [
        "b1ffb1ded56b4d6f01d337f234f67e245fb2462f"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jun 26 14:20:53 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jun 26 14:20:53 2019 -0700"
      },
      "message": "init: remove console_init_action\n\nThere\u0027s no fundamental reason to store this aside.  That property can\nonly be written by init, so it\u0027s not likely that we\u0027re going to\ncorrupt it.\n\nTest: boot and use serial console\nChange-Id: I9248fbaf959ea913d09add829d4cb509af99d570\n"
    },
    {
      "commit": "2aeb1addeeb7cca6b8c6c266ad4770b1b9530f97",
      "tree": "c28ccbd08772a5db244bb8def9d9b4b16a2fcb1e",
      "parents": [
        "c0349199db745ee53e8d1133ddfce57fccc69cc7"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jun 26 10:46:20 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jun 26 13:45:07 2019 -0700"
      },
      "message": "Split out ServiceList and ServiceParser from service.cpp/.h\n\nThese always should have been in their own files.\n\nTest: build\nChange-Id: I201109b5ee63016e78901bbfd404846d45e1d4e6\n"
    },
    {
      "commit": "39fafedc5a0f8c7e53e9f441a3ff6a7a0fc54bd3",
      "tree": "65238b2f52ea3320678a7ee9d5172a08c00efdfa",
      "parents": [
        "bc1ccde87c0934be5e9135699f50880798083fa6"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jun 10 17:49:59 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jun 10 18:08:01 2019 -0700"
      },
      "message": "init: use a property instead of file to communicate cold boot done\n\nUeventd can\u0027t set properties currently, but this is an artificial\nlimitation, since ueventd communicates to init that it has finished\ncold boot via a file, and init polls this file instead of returning to\nthe epoll loop, where properties are handled.\n\nThis change replaces that file with a property and thus frees ueventd\nto be able to set properties.\n\nBug: 62301678\nTest: boot, check that properties are set\nChange-Id: I985688e9299456efcb2dfeef9b92668991aa9c05\n"
    },
    {
      "commit": "bbcbc2ffb339b2388e0cc282bb698fe436100b42",
      "tree": "3b1ab414d943a4a9b50dd29c581807fa2092ed06",
      "parents": [
        "caa95d551d7f3b86d609b09bb4ab98e2435f6bc8"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jun 10 11:08:01 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jun 10 12:39:18 2019 -0700"
      },
      "message": "init: replace Result\u003cSuccess\u003e with Result\u003cvoid\u003e\n\nNow that Result\u003cT\u003e is actually expected\u003cT, ...\u003e, and the expected\nproposal states expected\u003cvoid, ...\u003e as the way to indicate an expected\nobject that returns either successfully with no object or an error,\nlet\u0027s move init\u0027s Result\u003cSuccess\u003e to the preferred Result\u003cvoid\u003e.\n\nBug: 132145659\nTest: boot, init unit tests\nChange-Id: Ib2f98396d8e6e274f95a496fcdfd8341f77585ee\n"
    },
    {
      "commit": "92c236e41b3fafada7891c8691ee148ef67b5156",
      "tree": "f13dd81d1a0cd4e079a84b494a4fa2c4b4fbd6b2",
      "parents": [
        "e20f357f4f40a9ced6321d0f9e36052f61b4d8b7"
      ],
      "author": {
        "name": "Vic Yang",
        "email": "victoryang@google.com",
        "time": "Tue May 28 15:58:35 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed May 29 15:09:39 2019 -0700"
      },
      "message": "init: Refactor selinux.h/cpp\n\nThis change factors out functions that handle selabels from\nselinux.h/cpp into selabel.h/cpp.  This allows util.cpp to be used by\nthe upcoming native zygote without a bunch of define flags that are\nrequired for selinux.cpp.\n\nBug: 133443795\nTest: Build and boot cuttlefish.\nChange-Id: Ie238a96c6407c6698a605dd8803c1727abfaae7b\n"
    },
    {
      "commit": "59656fb37769b3c0de927c20f8e9f5855a0f7ac3",
      "tree": "29b2b4c79cb6886aef4ed80896db0e8b4b980834",
      "parents": [
        "5f7314b7e1ee607a0aa703dcf3f8febd9123611c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue May 28 10:19:44 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed May 29 08:58:29 2019 -0700"
      },
      "message": "init: dump stack when aborting\n\nDump init stacks when aborting either due to LOG(FATAL) or in\nuserdebug/eng builds due to signals, including signals from\nsanitizers.\n\nDoesn\u0027t work for static first stage init yet, b/133450393 tracks\nthat.\n\nAlso, ensure that LOG(FATAL) in child processes calls abort() in all\nstages of init, not just 2nd stage init.\n\nBug: 131747478\nTest: abort init in various ways and see stacks\nTest: hang or crash in backtrace handler and see child reboot\nChange-Id: Ib53b5d3e7e814244203f875de016ada9900dfce8\n"
    },
    {
      "commit": "5f01d3af77d420c0bd0688e86ceb9c7772c1c76a",
      "tree": "08921f798ec7950828b8068e29f8a86d8e092fc3",
      "parents": [
        "cbe0876f8b1d12dfd662bbf6c59eb1eba25ac2cb"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Thu May 23 12:13:29 2019 -0700"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Thu May 23 12:43:09 2019 -0700"
      },
      "message": "init: add error handling in control message\n\nBug: 133432022\nTest: boot\nTest: setprop ctl.interface_restart android.hardware.power@1.0::IPower/default success\nTest: setprop ctl.interface_restart android.hardware.power@1.0::IPower/abc fail\nChange-Id: I66342b2723eb01022fb4e0d98f0b6ffc2752bcac\n"
    },
    {
      "commit": "44505ecdd926328f0843c1b2abe247c25d715cec",
      "tree": "53ef0ee284109f035ada9416b79d52e85f06077c",
      "parents": [
        "a6e6c7d9666d2e0b5f60a9caa0567ed696b6cbd5"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed May 08 12:44:50 2019 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed May 08 13:50:21 2019 -0700"
      },
      "message": "init: move \"started at\" environment var names to headers\n\nMove \"FIRST_STAGE_STARTED_AT\" to env_first_stage_started_at variable\nin first_stage_init.h.  Move \"SELINUX_STARTED_AT\" to\nenv_selinux_started_at variable in selinux.h.\n\nTest: build\nBug: 124491153\nBug: 129780532\nChange-Id: I512d1835dcee5a3d034ac453b27b0709eed23cff\n"
    },
    {
      "commit": "10377df9f88dcb6d5d1be9b1a989d677aa76ecc3",
      "tree": "3c51729dfd1b475d4b1adcbed8f2502d4981459b",
      "parents": [
        "3e182b6170c818ce454e5ee9641c8e6824a9b53e"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed Mar 27 08:10:41 2019 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed May 08 16:07:10 2019 +0000"
      },
      "message": "init: ro.boottime.init.first_stage\n\nAdd a property ro.boottime.init.first_stage to provide us a\nfirst stage init duration from start to exec completed in\nnanoseconds.\n\nFor consistency, report nanoseconds duration for\nro.boottime.init.selinux as well instead of milliseconds.\nNow also report consistently from start to exec completed\ninstead of just the selinux load time.\n\nSideEffects: ro.boottime.init.selinux is reported to TRON and\n             may alarm with the millionfold increase in precision.\n             ro.boottime.init is now also consistent with ns\n             precision.\n\nTest: inspect\nBug: 124491153\nBug: 129780532\nChange-Id: Iff4f1a3a1ab7ff0a309c278724c92da0832b9a69\n"
    },
    {
      "commit": "72d8d2f2c605375643e396da1d67c7a5f0735775",
      "tree": "4e8eedf8927565ae9593020474d4fe215c3a86c8",
      "parents": [
        "9b33cbc0cbe92e7f1e60f7b8a3c2fc35976aadbc",
        "30afda71c0dac4d1d59a91b78256ebff76257ad8"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Fri Apr 19 23:54:53 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Apr 19 23:54:53 2019 +0000"
      },
      "message": "Merge \"Copying debug ramdisk files to /debug_ramdisk/*\""
    },
    {
      "commit": "a7c103eb8ed82f3a4886ebd07a1a9b3664cafa8f",
      "tree": "d35a70b8ae1b53c5c0a1e8540e297d38efbfe7fd",
      "parents": [
        "f072aaffe06bcdd7a3c05c2bb3ec0f909376c756",
        "45d8174fe7b6f35883f74ceefdf591b209f1fab2"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Fri Apr 19 02:17:50 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Apr 19 02:17:50 2019 +0000"
      },
      "message": "Merge \"init: set oom_adj early before fork vendor_init\""
    },
    {
      "commit": "30afda71c0dac4d1d59a91b78256ebff76257ad8",
      "tree": "dbe9afd63d7c662dddb78a9ae2aaa934e71acc94",
      "parents": [
        "fc1749280c895e42e814e66ec7ec484a962b2f94"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Thu Apr 11 23:57:24 2019 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Fri Apr 19 09:56:14 2019 +0800"
      },
      "message": "Copying debug ramdisk files to /debug_ramdisk/*\n\nIn previous implementation, userdebug sepoilcy and property files are\nloaded from the system.img. This CL changes this to:\n\n  - first-stage init copies userdebug files from ramdisk to /debug_ramisk/*\n  - second-stage init loads files from /debug_ramdisk/*.\n\nNote: same as before, the above can only be triggered, if the device\nis UNLOCKED\n\nWith this, we don\u0027t have to put userdebug related files into the USER\nsystem.img.\n\nBug: 126493225\nTest: boot device with a ramdisk with /force_debuggable, checks related\n      files are loaded\nChange-Id: I63f5f846e82ba78427062bf7615c26173878d8f3\n"
    },
    {
      "commit": "45d8174fe7b6f35883f74ceefdf591b209f1fab2",
      "tree": "df599c65a8fc7afef44ef70a77047dd337734c37",
      "parents": [
        "d71d30179ca14991c22f65a0d23ddc6686735477"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Thu Apr 18 14:56:24 2019 -0700"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Thu Apr 18 16:14:08 2019 -0700"
      },
      "message": "init: set oom_adj early before fork vendor_init\n\nright now vendor_init is forked before we set oom_adj for init which\nleaves a chance vendor_init could be killed in heavy memory pressure.\n\nthis CL set the oom_adj before forking everything to ensure all native\nhave correct oom_adj settings.\n\nFixes: 130824864\nTest: procrank -o\nChange-Id: I8af129076c3efa29f7b781459449f8f2dc853c98\n"
    },
    {
      "commit": "9d7b89abeacca936aadf94e920caf3987ff1ba48",
      "tree": "56b7819bb8d7cda800f263b4fba29c2d731d8d83",
      "parents": [
        "063b6beef05ae3bed6d6ca2e4b13c642503ff2b4"
      ],
      "author": {
        "name": "Yifan Hong",
        "email": "elsk@google.com",
        "time": "Tue Apr 02 15:10:40 2019 -0700"
      },
      "committer": {
        "name": "Yifan Hong",
        "email": "elsk@google.com",
        "time": "Tue Apr 02 22:31:57 2019 -0700"
      },
      "message": "CgroupSetupCgroups -\u003e CgroupSetup\n\nTest: builds\nBug: 123664216\nChange-Id: I47c46ca9ba5c1fbf3f9f7a1b185dc48b058b1e32\nMerged-In: I47c46ca9ba5c1fbf3f9f7a1b185dc48b058b1e32\n"
    },
    {
      "commit": "6f9ce2e548e4a583392b212ca9017f6debdeebc0",
      "tree": "50eb02285f05ef0b655b0b04bbadc9675f3a82e2",
      "parents": [
        "098323ba5bf4f5e585337369146fd52f032baeec"
      ],
      "author": {
        "name": "Yifan Hong",
        "email": "elsk@google.com",
        "time": "Tue Mar 05 15:47:16 2019 -0800"
      },
      "committer": {
        "name": "Yifan Hong",
        "email": "elsk@google.com",
        "time": "Tue Apr 02 22:31:57 2019 -0700"
      },
      "message": "libprocessgroup: Move CgroupSetupCgroups() to libprocessgroup_setup\n\nOnly init uses SetupCgroups. This functionality is\nmoved from libprocessgroup to its own library, and only\ninit links to it.\n\nAlso, merge CgroupSetupCgroups() with CgroupMap::SetupCgroups()\nbecause the former is just an alias of the latter, and\nCgroupMap does not belong to libcgrouprc_setup.\n\nTest: boots\nBug: 123664216\nChange-Id: I941dc0c415e2b22ae663d43e30dc7a464687325e\nMerged-In: I941dc0c415e2b22ae663d43e30dc7a464687325e\n"
    },
    {
      "commit": "5b5357367163a6238c45c020c9e5ff0dbaa31f59",
      "tree": "748900a5bbdd1b926b2aeea326430d018882e80c",
      "parents": [
        "7f43e9fa40d5440f77a9a0b46edaad9d1b69bd8a"
      ],
      "author": {
        "name": "Suren Baghdasaryan",
        "email": "surenb@google.com",
        "time": "Tue Mar 26 20:34:32 2019 +0000"
      },
      "committer": {
        "name": "Suren Baghdasaryan",
        "email": "surenb@google.com",
        "time": "Thu Mar 28 01:25:22 2019 +0000"
      },
      "message": "libprocessgroup: restrict SetupCgroups to one-time usage and only by init\n\nSetupCgroups is called by init process during early-init stage and is not\nsupposed to be called again by anyone else. Ensure that the caller is the\ninit process, make sure cgroup.rc file is written only one time, keep the\nfile descriptor to cgroup.rc file open by the init process to ensure all\nits further mappings stay valid even if the file is deleted.\n\nBug: 124774415\nTest: build, run, verify no errors or warning in the logcat\n\nChange-Id: Ib8822cf0112db7744e28d442182d54dcf06f46f2\nSigned-off-by: Suren Baghdasaryan \u003csurenb@google.com\u003e\n"
    },
    {
      "commit": "a73ed22cb7d2fec0b330401b764fa8c9b934d0da",
      "tree": "6e32ba0b5e995fb7ef238e73a737de8347c9b43d",
      "parents": [
        "0e5b74deff69312063e9f71d3b62f1f806b29526"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed Mar 13 10:18:24 2019 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Fri Mar 15 11:54:38 2019 -0700"
      },
      "message": "init: add MountHandler property handler\n\nSet properties dev.mnt.blk.\u003cmount_point\u003e\u003d\u003cdevice_block_class\u003e for mount\nand umount operations by setting up an Epoll handler to catch\nEPOLLERR or EPOLLPRI signals when /proc/mounts is changed.  Only\nupdate properties associated with block devices.  For the mount\npoint of /, use the designation of /root instead.\n\nCan use the properties in init rc expansion like:\n\non property dev.mnt.blk.root\u003d*\n    write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb ${boot_read_ahead_kb:-2048}\n\non property dev.mnt.blk.data\u003d*\n    write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb ${boot_read_ahead_kb:-2048}\n\non late-fs\n    setprop boot_read_ahead_kb 128\n    write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb ${boot_read_ahead_kb}\n    write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb ${boot_read_ahead_kb}\n\nTest: boot and inspect getprop results.\nBug: 124072565\nChange-Id: I1b8aff44f922ba372cd926de2919c215c40ee874\n"
    },
    {
      "commit": "1dacd42ae189c685ac9e5bea1c25a845580f67d5",
      "tree": "83c3f5610f543abeed1547b2d69a079c1bc2e1ec",
      "parents": [
        "9b30c0a7e6e72c9a66a7d18ef2f1d41fd00a875b"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Mon Mar 04 17:53:34 2019 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Fri Mar 15 06:12:00 2019 +0800"
      },
      "message": "Allow overriding ro.debuggable to 1 on USER builds\n\nWhen init found \"/force_debuggable\" in the first-stage ramdisk, it will\ndo the following if the device is unlocked:\n  1. load /system/etc/adb_debug.prop (with ro.debuggable\u003d1)\n  2 .load userdebug_plat_sepolicy.cil instead of original plat_sepolicy.cil from\n    /system/etc/selinux/.\n\nThis make it possible to run VTS on a USER build GSI, by using a special\nramdisk containing \"/force_debuggable\".\n\nBug: 126493225\nTest: unlock a USER build device, check \u0027adb root\u0027 can work\nChange-Id: I9b4317bac1ce92f2c0baa67c83d4b12deba62c92\n"
    },
    {
      "commit": "372278c86de490b7db331f2fb60c0662bd0404ac",
      "tree": "7682c0d6ac3318eb9cc4a78f128da1f789c9cc16",
      "parents": [
        "cb13a7766e8eb8393a6ffc6813e7d7686fc9bd4a"
      ],
      "author": {
        "name": "David Anderson",
        "email": "dvander@google.com",
        "time": "Thu Feb 14 12:46:13 2019 -0800"
      },
      "committer": {
        "name": "David Anderson",
        "email": "dvander@google.com",
        "time": "Thu Feb 14 13:23:28 2019 -0800"
      },
      "message": "init: Set a property indicating that we\u0027re booting into a GSI.\n\nBug: 123777418\nTest: gsid.image_running is set after booting into GSI\nChange-Id: I8ec79fa58b41b04676de0c8909fcd520c28c05ab\n"
    },
    {
      "commit": "54f7e57bac97ceb73d5b3b67c4d77ea9ed4f09ba",
      "tree": "707aa25a5121a2798b6d6db976e36a55465b6bd3",
      "parents": [
        "c03169caeac146cef82ca052a839a03eb1aed1c9",
        "c9352bb3831258f3c8d80b60486212e78998b887"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Wed Feb 06 07:28:00 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Feb 06 07:28:00 2019 +0000"
      },
      "message": "Merge \"init: print property/value for wait_for_property\""
    },
    {
      "commit": "c9352bb3831258f3c8d80b60486212e78998b887",
      "tree": "15fce5263c9c8a05f32fb92b5ba359a76579b1bc",
      "parents": [
        "aa257564267c1a1f98f4ee3f51ac8873fd27eecb"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Tue Feb 05 14:45:47 2019 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Feb 06 01:03:53 2019 +0000"
      },
      "message": "init: print property/value for wait_for_property\n\nBug: 123772265\nBug: 123788098\nTest: Build\nChange-Id: Ice130d7efab1f227a2f9021136621ad08f84fd23\n"
    },
    {
      "commit": "82b72a566761b8379fd2964ed801696803867510",
      "tree": "d6183b112c31fc4dc3c391924e7651c1d77f6354",
      "parents": [
        "503cf84f76a3f65d3a2a02f97a6510f7fe3502a6"
      ],
      "author": {
        "name": "Suren Baghdasaryan",
        "email": "surenb@google.com",
        "time": "Fri Dec 21 11:41:50 2018 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sun Feb 03 16:48:35 2019 +0000"
      },
      "message": "libprocessgroup: Add support for task profiles\n\nAbstract usage of cgroups into task profiles that allows for changes\nin cgroup hierarchy and version without affecting framework codebase.\nRework current processgroup and sched_policy API function implementations\nto use task profiles instead of hardcoded paths and attributes.\nMount cgroups using information from cgroups.json rather than from init.rc\n\nExempt-From-Owner-Approval: already approved in internal master\n\nBug: 111307099\nTest: builds, boots\n\nChange-Id: If5532d6dc570add825cebd5b5148e00c7d688e32\nMerged-In: If5532d6dc570add825cebd5b5148e00c7d688e32\nSigned-off-by: Suren Baghdasaryan \u003csurenb@google.com\u003e\n"
    },
    {
      "commit": "6866041ff03e6ddd07145be37f6806c51fc18173",
      "tree": "527e32c5a0f0e783d29a9368ca7ff7206f448bfb",
      "parents": [
        "4695cf0a4dd9b694365d42d77abdb96b5723efce"
      ],
      "author": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Wed Jan 16 23:00:59 2019 +0900"
      },
      "committer": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Wed Jan 30 19:18:22 2019 +0900"
      },
      "message": "Proper mount namespace configuration for bionic\n\nThis CL fixes the design problem of the previous mechanism for providing\nthe bootstrap bionic and the runtime bionic to the same path.\n\nPreviously, bootstrap bionic was self-bind-mounted; i.e.\n/system/bin/libc.so is bind-mounted to itself. And the runtime bionic\nwas bind-mounted on top of the bootstrap bionic. This has not only caused\nproblems like `adb sync` not working(b/122737045), but also is quite\ndifficult to understand due to the double-and-self mounting.\n\nThis is the new design:\n\nMost importantly, these four are all distinct:\n1) bootstrap bionic (/system/lib/bootstrap/libc.so)\n2) runtime bionic (/apex/com.android.runtime/lib/bionic/libc.so)\n3) mount point for 1) and 2) (/bionic/lib/libc.so)\n4) symlink for 3) (/system/lib/libc.so -\u003e /bionic/lib/libc.so)\n\nInside the mount namespace of the pre-apexd processes, 1) is\nbind-mounted to 3). Likewise, inside the mount namespace of the\npost-apexd processes, 2) is bind-mounted to 3). In other words, there is\nno self-mount, and no double-mount.\n\nAnother change is that mount points are under /bionic and the legacy\npaths become symlinks to the mount points. This is to make sure that\nthere is no bind mounts under /system, which is breaking some apps.\n\nFinally, code for creating mount namespaces, mounting bionic, etc are\nrefactored to mount_namespace.cpp\n\nBug: 120266448\nBug: 123275379\nTest: m, device boots, adb sync/push/pull works,\nespecially with following paths:\n/bionic/lib64/libc.so\n/bionic/bin/linker64\n/system/lib64/bootstrap/libc.so\n/system/bin/bootstrap/linker64\nChange-Id: Icdfbdcc1efca540ac854d4df79e07ee61fca559f\n"
    },
    {
      "commit": "dc1f24777a3e450b4bb0c02e8def8e58e78e9e46",
      "tree": "96c9d513b57cfef8f3c8854cd57e8615cbfbcdd9",
      "parents": [
        "2f171cc69ebdb0f2ebaf5168d34d3f8eeed90679"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Fri Jan 11 14:39:45 2019 -0800"
      },
      "committer": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Fri Jan 11 14:41:34 2019 -0800"
      },
      "message": "Init: error on oneway calls.\n\nBefore, this process had no threadpool, so it could make blocking\ncalls, but if it did, they would block forever. Now when this\nhappens, an error is logged so that we can easily see this happen.\n\nBug: 36424585\nTest: boot\nChange-Id: I7d2fa12b6d5a243bdde13ce4d974a444133749f7\n"
    },
    {
      "commit": "044e02764d0f12426c0bb0505de6de596f410eba",
      "tree": "06bc3733f7acb677df5222eb05ebed54613c8a06",
      "parents": [
        "3ecaf2e7f50cae05cb9a98b5254a8701315fefe7",
        "d05211870221e955b2a355c968b6866ab8e2f01a"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Thu Nov 29 16:56:19 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Nov 29 16:56:19 2018 +0000"
      },
      "message": "Merge \"Run BoringSSL self test during startup\""
    },
    {
      "commit": "d05211870221e955b2a355c968b6866ab8e2f01a",
      "tree": "b97ac3e8a7b03a40efda4dfe4412ec8a4cbee1a8",
      "parents": [
        "ef9835967a35694d971c39981bfdf863b3bcb102"
      ],
      "author": {
        "name": "Branden Archer",
        "email": "brarcher@google.com",
        "time": "Thu Nov 15 08:43:48 2018 -0800"
      },
      "committer": {
        "name": "Branden Archer",
        "email": "brarcher@google.com",
        "time": "Wed Nov 28 20:57:00 2018 +0000"
      },
      "message": "Run BoringSSL self test during startup\n\nNIAP certification requires that all cryptographic functions\nundergo a self-test during startup to demonstrate correct\noperation. This change adds such a check.\n\nIf the check fails, it will prevent the device from booting\nby rebooting into the bootloader.\n\nBug: 119826244\nTest: Built for walleye. After device booted examined dmesg and\n      observed logs from init showing that the new task did\n      start. Further, when BoringSSL is built to fail its self\n      check the device did stop during a normal boot and enter\n      the bootloader, and did so before the boot animation stopped.\n\nChange-Id: I07a5dc73a314502c87de566bb26f4d73499d2675\n"
    },
    {
      "commit": "7bfea3d59cdcd275be73bc4eba343ee6a5d3b06b",
      "tree": "8c8b569efb2a27b9daa7307558c2b994c8c26f8c",
      "parents": [
        "13856a05e7e06fae3ed9668de17aa40fdf3aca47"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Nov 06 14:12:05 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Nov 12 16:08:19 2018 -0800"
      },
      "message": "init: clean up the 1st/2nd stage init split\n\nThe first split of 1st/2nd stage init went a bit overboard, since it\nsplit these even in the case of the recovery image and system-as-root,\nwhich don\u0027t actually need the split.  This change simplifies this a\nbit:\n\nsystem-as-root and recovery have a single combined /system/bin/init\nand a symlink from /init to it.\n\nnon-system-as-root has a separate first stage init at /init on the\nfirst stage ramdisk and a combined /system/bin/init on system.img.\n\nTwo particular benefits from this:\n1) Removal of the rsync of TARGET_RAMDISK_OUT to the recovery image\n2) Decrease of overall space on the recovery image since it won\u0027t have\n   a statically linked first stage init\n\nThis also unified the various entry points of init to depend entirely\non the arguments passed to it, instead of the hybrid of arguments and\nenvironment variable used previously.\n\nBug: 80395578\nTest: boot both system-as-root and non-system-as-root\nChange-Id: Ic2f29b6f56b7defc80eaa0e7cd0c9107e978816f\n"
    },
    {
      "commit": "c240440eece9a8d5df5b82a8d6fcb42208d865ee",
      "tree": "14c6d877cb26cbfe6f60a0b8ffe24438874d2ab7",
      "parents": [
        "9e04f6289524966edbe65e241a59c8a34cf3f45d"
      ],
      "author": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Thu Nov 08 17:14:35 2018 +0900"
      },
      "committer": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Sat Nov 10 04:18:09 2018 +0900"
      },
      "message": "init parses *.rc files from APEXes\n\nInit now parses *.rc files from the APEXs when the apexd notifies the\nmount event via apexd.status sysprop.\n\nBug: 117403679\nTest: m apex.test; adb root; adb push \u003cbuiltfile\u003e /data/apex; adb reboot\nadb root; adb shell setprop ctl.start apex.test; dmesg shows that init\ntries to start the service which doesn\u0027t exist.\n\n[   47.979657] init: Could not ctl.start for \u0027apex.test\u0027: Cannot find \u0027/apex/com.android.example.apex/bin/test\u0027: No such file or directory\n\nChange-Id: I3f12355346eeb212eca4de85b6b73257283fa054\n"
    },
    {
      "commit": "6bab0a9c239971091fcd549e21efa4f76c4ee2cf",
      "tree": "be8b8100ec49ac1590d6dc32dbb0159f5dcf542d",
      "parents": [
        "bb3e479268cb79cc1aed39d1a4a68d5e0653e29d"
      ],
      "author": {
        "name": "Justin Yun",
        "email": "justinyun@google.com",
        "time": "Mon Oct 29 18:31:48 2018 +0900"
      },
      "committer": {
        "name": "Justin Yun",
        "email": "justinyun@google.com",
        "time": "Thu Nov 01 10:26:12 2018 +0900"
      },
      "message": "Mount vendor overlay from the system partition\n\nUsing overlayfs, the system partition may provide files for older\nversion of vendor partitions by overlaying on the vendor partition.\nDirectories in /system/vendor_overlay will be overlaid on the\ndirectories in /vendor to override existing files or provide new\nfiles.\n\nThis feature works only if the kernel support overlayfs and has a\npatch for override_creds. Otherwise, no-op.\n\nBug: 114679254\nTest: Build and boot: nothing affected without overlayfs, or\n                      vendor file is overrided with overlayfs\n\nChange-Id: Iff3a308945299034123ba7bcb40dc787e102730e\n"
    },
    {
      "commit": "e0042419f8785ccb6fc02ee26d15e9b9b7805d57",
      "tree": "157b2f122315dc605883953203efd05d3ac5f7da",
      "parents": [
        "30fa1b786418b6a47fb7e605134bc71a2414e412"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Oct 19 11:16:27 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Oct 19 11:18:58 2018 -0700"
      },
      "message": "init: Add some ASAN helpers\n\nInit is special.\n\nIt starts early and does not pick up the Android ASAN options provided\non the environment.  Therefore we pull in /system/asan.options in\nexplicitly if it exists.  We provide sane defaults that will allow the\nsystem to boot otherwise.\n\nLogging is complicated because it needs to go to the kernel log.\nSo use sanitizer functions to install log functions.\n\nBug: 117879229\nTest: m \u0026\u0026 m SANITIZE_TARGET\u003daddress\nTest: init boots with ASAN enabled\nChange-Id: I72c033a1f86ba5d6b2e4f943e7a3acd0d399c8bf\n"
    },
    {
      "commit": "64990d5b457da61a150f39193dda5479cc32da20",
      "tree": "eeb54bf279e59a319a74a6324317d982c40c3ebe",
      "parents": [
        "3356ca30406d04c4b5a48d54862b324a17b49aaf",
        "48e83e629f52a50c5e1317376022ec09fe221f78"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Oct 05 20:41:23 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Oct 05 20:41:23 2018 +0000"
      },
      "message": "Merge \"init: move InitKernelLogging() to first stage init\""
    },
    {
      "commit": "48e83e629f52a50c5e1317376022ec09fe221f78",
      "tree": "ee6d6323147e5ae24d770b0b62dce6ecc943578b",
      "parents": [
        "3da42a6c05311653ff5d12b5057d5f3c40ac0c1a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Oct 04 13:14:14 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Oct 05 10:36:38 2018 -0700"
      },
      "message": "init: move InitKernelLogging() to first stage init\n\nThe kernel opens /dev/console and uses that fd for stdin/stdout/stderr\nif there is a serial console enabled and no initramfs, otherwise it\ndoes not provide any fds for stdin/stdout/stderr.  InitKernelLogging()\nis used to close these existing fds if they exist and replace them\nwith /dev/null.\n\nCurrently, InitKernelLogging() is only called in second stage init,\nwhich means that processes exec\u0027ed from first stage init will inherit\nthe kernel provided fds if any are provided.\n\nIn the case that they are provided, the exec of second stage init\ncauses an SELinux denial as it does not have access to /dev/console.\nIn the case that they are not provided, exec of any further process is\npotentially dangerous as the first fd\u0027s opened by that process will\ntake the stdin/stdout/stderr fileno\u0027s, which can cause issues if\nprintf(), etc is then used by that process.\n\nLastly, simply moving InitKernelLogging() to first stage init is not\nenough, since first stage init still runs in kernel context and future\nchild processes will not have permissions to access kernel context\nresources.  Therefore, it must be done for a second time in second\nstage init.\n\nBug: 117281017\nTest: no audits when booting marlin.\nChange-Id: If27edab5c32b27765e24c32fbed506ef625889de\n"
    },
    {
      "commit": "5f2a21d244be6cbbc64047474b0aca352f93b2d9",
      "tree": "36755473390cce439824c9ae3d46fb01cf8e1a84",
      "parents": [
        "69b83f0af09fa6bf6fa44c370a859d52725e3fe9",
        "73f535e33b1fcb8088bc12c0431647286ef8ea44"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Oct 05 16:15:23 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Oct 05 16:15:23 2018 +0000"
      },
      "message": "Merge \"init: allow customizable restart and timeout periods for services\""
    },
    {
      "commit": "73f535e33b1fcb8088bc12c0431647286ef8ea44",
      "tree": "0f5bc65f909d3f89f56b720c09eef0fac0507211",
      "parents": [
        "3da42a6c05311653ff5d12b5057d5f3c40ac0c1a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Sep 27 16:10:46 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Oct 04 19:52:37 2018 -0700"
      },
      "message": "init: allow customizable restart and timeout periods for services\n\nAllow services to specify a custom restart period via the\nrestart_period service option.  This will allow services to be run\nperiodically, such as a service that needs to run every hour.\n\nAllow services to specify a timeout period via the timeout_period\nservice option.  This will allow services to be killed after the\ntimeout expires if they are still running.  This can be combined with\nrestart_period for creating period services.\n\nTest: test app restarts every minute\nChange-Id: Iad017820f9a602f9826104fb8cafc91bfb4b28d6\n"
    },
    {
      "commit": "5952034c25d4e846fa1d2d0ce2dfe1196d58b3c8",
      "tree": "1877bdf0537dd515e29ef16f2e330e8ee42fdf15",
      "parents": [
        "c448000e424375893ae70870eb80ece1a8cc39f0",
        "5ed32780b4d6f215ad591e6259f7235150b26a63"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Wed Sep 26 02:02:13 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 26 02:02:13 2018 +0000"
      },
      "message": "Merge \"Set device lock status from kernel command line.\""
    },
    {
      "commit": "5ed32780b4d6f215ad591e6259f7235150b26a63",
      "tree": "d81bacefdc824995805ed3a7f6ccf882bf8ddddd",
      "parents": [
        "6590255dbbcbd35c527b3a2e6871275ec88fee64"
      ],
      "author": {
        "name": "Hridya Valsaraju",
        "email": "hridya@google.com",
        "time": "Tue Sep 25 15:43:42 2018 -0700"
      },
      "committer": {
        "name": "Hridya Valsaraju",
        "email": "hridya@google.com",
        "time": "Tue Sep 25 15:49:59 2018 -0700"
      },
      "message": "Set device lock status from kernel command line.\n\nDevice is considered to be unlocked if\nandroidboot.verifiedbootstate is \"orange\".\n\nTest: adb shell getprop ro.boot.flash.locked\n\nChange-Id: Id3aeec757908ea63a37e28ad880a6c71d53083ac\n"
    },
    {
      "commit": "d9e53dacf58eaaf252f7a93942690c9fbe8f6b47",
      "tree": "9525190b7d66f6ffda72d18db3f30e9e304b8899",
      "parents": [
        "146fd24c4bc8798fa3ed211f2f7bb3082566bf82"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Sep 05 15:37:26 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 18 11:24:56 2018 -0700"
      },
      "message": "init: move selinux and seccomp set up to 2nd stage init.\n\nIf there is no valid pre-compiled SEPolicy policy, init may call\nsecilc, which exists on the system partition.  1st stage init won\u0027t\nalways live on this partition, so we need to move this SELinux setup\nto 2nd stage init, which always lives on the system partition, to\nensure that both secilc and its caller are updated together.\n\nBug: 114059212\nTest: hikey boots, sailfish boots\nChange-Id: Iaf7b4af4a5c2ace16755ec2e54510ab95c53f041\n"
    },
    {
      "commit": "62e985a9540e421360532fce73c3e2c543b53255",
      "tree": "99936f5f16cb0483cbda874b66ea91bb9fa12655",
      "parents": [
        "07fd6d029b65908dc21e0bc51431d93cae4d5033"
      ],
      "author": {
        "name": "Martijn Coenen",
        "email": "maco@google.com",
        "time": "Tue Sep 04 06:29:14 2018 +0200"
      },
      "committer": {
        "name": "Martijn Coenen",
        "email": "maco@google.com",
        "time": "Fri Sep 07 15:47:21 2018 +0200"
      },
      "message": "init: Allow restricted use of binder.\n\nAllow init to use binder, but in a restricted way:\n- No binder threadpool\n- Other processes can\u0027t initiate calls to init\n- No death recipients\n\nThis change adds libbinder/libutils and calls into ProcessState,\nwhich also calls into the kernel driver and sets up state there.\nNo other binder calls are made, so that we can let this soak for\na while to see if there any bad side effects of just loading\nthese libraries and initializing the kernel driver.\n\nThis introduces about 120kB of additional memory usage (PSS),\nmostly due to pulling in libbinder and libutils and the private\nstate they have.\n\nWe also don\u0027t include these libraries in the recovery version of\ninit, because space on the recovery partition is limited.\n\nBug: 112684055\nTest: device still boots, /d/binder/proc/1 shows init state\nChange-Id: I972b1eebdb16337f52e20d1f614e3a0dce0f06d2\n"
    },
    {
      "commit": "ab5583b5851613ba47994139fe79ef2c49992d7d",
      "tree": "d76352b0c50ba9da67eedd8048ea938175b2620e",
      "parents": [
        "ad58bf9b1db76b1cd212edb11fcb9de95e0dcfcf"
      ],
      "author": {
        "name": "Dario Freni",
        "email": "dariofreni@google.com",
        "time": "Fri Aug 17 01:01:25 2018 +0100"
      },
      "committer": {
        "name": "Yifan Hong",
        "email": "elsk@google.com",
        "time": "Mon Aug 20 17:46:42 2018 +0000"
      },
      "message": "s/product-services/product_services/g\n\nAttempting to reduce the number of different spellings we have for\n\"product services\" partition in the codebase.\n\nBug: 112431447\nTest: m\nChange-Id: I1a87d7e040a8b1f91f973ac7d90d6360b5b54f71\nMerged-In: I1a87d7e040a8b1f91f973ac7d90d6360b5b54f71\n"
    },
    {
      "commit": "31438489c0e263ca39f7ba77fe4e50334f2efab7",
      "tree": "1a8b58689e62c45b6b4b7a57d09fc05a54df94fc",
      "parents": [
        "f502182ac68b491c278c20e0b8792bd75e235863"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jul 20 14:57:00 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 06 10:36:43 2018 -0700"
      },
      "message": "split first stage init into a separate executable\n\nIn the future, systems with dm-linear will require a ramdisk to set up\nthe mount for system.  In this world, first stage init will be a part\nof this ramdisk and handle setting up dm-linear, mounting the\nnecessary partitions, then pivoting to the system image, which will\nbecome the root partition.\n\nThis also enables previous devices without system-as-root, to be\nunified with system-as-root devices for all aspects of boot after the\npivot_root.\n\nBug: 79758715\nTest: boot hikey\nTest: boot sailfish, boot sailfish into recovery\nChange-Id: Iefa88a3ec5994e7989aa9f26f2de0351ffa5468b\n"
    },
    {
      "commit": "44aceed01649353af82bbc5367098b55cf3b5d69",
      "tree": "bb936682d23b6a4b76dfa29ad3608272f427789d",
      "parents": [
        "132615b8031411aa731fe400ba5a8b21da834560"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 03 13:36:18 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 03 13:40:17 2018 -0700"
      },
      "message": "Split init\u0027s source files init first stage and second stage\n\nThis is a baseline for splitting init first and second stage into\ntheir own executables.\n\nBug: 79758715\nTest: sailfish boots\nChange-Id: I549ad4502893b3a5e4c2a9886f66850f6d31b619\n"
    },
    {
      "commit": "132615b8031411aa731fe400ba5a8b21da834560",
      "tree": "74ccb94aac87f885e21599eb6ce7e2041d87032e",
      "parents": [
        "e961bbcadca5da0ea458da8010f591cadc4fb477",
        "40acb379cdac2e71b888bfa22bdcb409aa2753b1"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 03 19:28:14 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Aug 03 19:28:14 2018 +0000"
      },
      "message": "Merge \"Move watchdogd out of init\""
    },
    {
      "commit": "40acb379cdac2e71b888bfa22bdcb409aa2753b1",
      "tree": "6b13aec6b13ffb7ee635e94d5f4294233070a9d6",
      "parents": [
        "081b710b2ee7f726f1bef282333c397006b6b37f"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 01 13:41:12 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 02 12:25:58 2018 -0700"
      },
      "message": "Move watchdogd out of init\n\nWe\u0027re moving past a world where static executables are needed,\nincluding watchdogd, so treat this like any other executable and place\nit in /system/bin.\n\nBug: 73660730\nTest: watchdogd still runs\nChange-Id: I1f7508fd55dce6e9ee72a6ab7a085011a76c0053\n"
    },
    {
      "commit": "6e05552e357b97403ffa73d8feaf6431689d28a1",
      "tree": "42b18b935aa6e546f1dc12f8d02e37c930b9c7dc",
      "parents": [
        "10601fd5126590a8667a8ac9e98c0f3cbb56c435",
        "81ae07509d3b911915a63dddcd83ac2398dd9583"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 01 21:02:35 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 01 21:02:35 2018 +0000"
      },
      "message": "Merge \"init: run fsck for early mount partitions\""
    },
    {
      "commit": "81ae07509d3b911915a63dddcd83ac2398dd9583",
      "tree": "2f6343505902173156cffa142eff9f0c279ab4bc",
      "parents": [
        "28fb130cbbd7c01ef706d5b6a5a9877b290f275c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jul 30 16:23:49 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jul 31 13:58:17 2018 -0700"
      },
      "message": "init: run fsck for early mount partitions\n\nBug: 111883560\nTest: fsck runs successfully during early mount\nChange-Id: I19bcd2610f87f5331f94c228fcbec8f9379fc5e8\n"
    },
    {
      "commit": "361371009902150d332cb23575f5833a57cf0ef0",
      "tree": "7975ec21d6a7554d8c379ebfe7b716395b465182",
      "parents": [
        "28fb130cbbd7c01ef706d5b6a5a9877b290f275c"
      ],
      "author": {
        "name": "Dario Freni",
        "email": "dariofreni@google.com",
        "time": "Fri May 25 16:07:19 2018 +0100"
      },
      "committer": {
        "name": "Dario Freni",
        "email": "dariofreni@google.com",
        "time": "Thu Jul 26 16:27:28 2018 +0000"
      },
      "message": "Add support for /product-services partition.\n\nThis CL is largely and adaptation of\nIe996def20e25dc1afe0c74af2096af844934b2dc\n\nBug: 80741439\nTest: Successfully built product-services.img with one module in it, and\nflashed on device. Also successfully built image with\n/system/product-services and no dedicated /product-services partition.\n\nChange-Id: I1046dfe19bf874da929c9131b76a1f85422fbb80\nMerged-In: I1046dfe19bf874da929c9131b76a1f85422fbb80\n"
    },
    {
      "commit": "1d2b29a9022ae9910bda2e1371066179bbd176d6",
      "tree": "6a60e5fa7a04ebb1a1cc659f25fda2ba203e49cc",
      "parents": [
        "258109ce4ab00bbb831212c04e6c986899d7bd85",
        "38a11ccdd183248b07c86b51791dc2dafba36738"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Sat Jul 21 02:47:36 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Sat Jul 21 02:47:36 2018 +0000"
      },
      "message": "Merge \"init: rename init_first_stage\""
    },
    {
      "commit": "38a11ccdd183248b07c86b51791dc2dafba36738",
      "tree": "6d7089bc56995bf045c4ed389d6f72318676f3fd",
      "parents": [
        "74be24d696f2d67293de6b9bb6e715c1728abed7"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jul 20 15:18:04 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jul 20 15:31:36 2018 -0700"
      },
      "message": "init: rename init_first_stage\n\nIn preparation for splitting first stage init from the rest of the\ninit executable, rename these files which are specifically involved in\nfirst stage mount operations to a more appropriate name.\n\nTest: builds\nChange-Id: I8a2d4e8c7e1deea1bab45cc8e738727bc2ceb3e5\n"
    },
    {
      "commit": "74069d17347eb64ec932831f8383448fd16e6e0f",
      "tree": "b147aa8faa8d579ba9f479ac8896b0c248ebcc0f",
      "parents": [
        "74be24d696f2d67293de6b9bb6e715c1728abed7"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jul 20 15:26:25 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jul 20 15:30:14 2018 -0700"
      },
      "message": "init: clean up logging initialization\n\nClean up a few mistakes in logging initialization\n\n1) Only init needs to clear stdout/stderr/stdin, so remove this from\n   ueventd, watchdogd, and subcontext init\n2) Only init should reboot due to FATAL errors. This was true even\n   before this change due to getpid() checks, but there\u0027s no reason to\n   not just use the DefaultAborter for other processes.\n3) It\u0027s probably a mistake for FATAL logs in init to try to gracefully\n   shutdown the system, so simply call RebootSystem() here.\n4) Lastly, remove log.cpp since it\u0027s not actually shared code anymore\n\nTest: build\nChange-Id: Ic8c323393dc7ee98ed6bb9691361b51d0d915267\n"
    },
    {
      "commit": "acc31cee1bd5fe270a22f993fdff79d83f827658",
      "tree": "5baf8f578458a6965447c5518ee587d1a9d3c453",
      "parents": [
        "2bbbd06a8a4a104f4f0ca86057a15bae828dc997"
      ],
      "author": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Fri Jun 29 10:15:34 2018 +0800"
      },
      "committer": {
        "name": "Bowgo Tsai",
        "email": "bowgotsai@google.com",
        "time": "Fri Jun 29 10:36:03 2018 +0800"
      },
      "message": "Add /mnt/product rw mount point for product partitions.\n\n1. init creates /mnt/product used to mount product-specific rw partitions.\n2. If a device tree fstab entry for early mount specifies a mount point\n   under /mnt/product e.g. /mnt/product/foo, init will create\n   /mnt/product/foo mount point.\n\nBug: 110808288\nTest: change dt fstab entry to mount /mnt/product/foo; mount point is\n      created correctly, and partition is mounted in early mount.\n\nChange-Id: I321e314992abe1084fd67a382c205f5c0c92bf3d\n"
    },
    {
      "commit": "39d124b92c058eeb041a404839c3a017b138a0fe",
      "tree": "4ec031461c6010e541cd400075c098fc82baadad",
      "parents": [
        "d41a1f9add9c1feb4aa8f38ad9850f39d715d8bf"
      ],
      "author": {
        "name": "Chris Morin",
        "email": "cmtm@google.com",
        "time": "Thu Jun 21 18:42:22 2018 -0700"
      },
      "committer": {
        "name": "Chris Morin",
        "email": "cmtm@google.com",
        "time": "Thu Jun 21 18:54:28 2018 -0700"
      },
      "message": "init: Don\u0027t set ro.serialno when androidboot.serialno is not set\n\nThis functionality is useful for improving boottimes on the ARC++\nproject. Without this change, ro.serialno would be set to the empty\nstring when androidboot.serialno was unset in the kernel commandline.\n\nBug: 62039211\nTest: boot with androidboot.serialno unset and ensure ro.serialno is\nunset\n\nChange-Id: Iaee339dfa3f0c871e5e9c1fc0534347f2b3e8a07\n"
    },
    {
      "commit": "788fc8229c933f44957d27d1447164c0b2538f8d",
      "tree": "5193cdfbfb9cd527d4aa779d50ea79c34fc246d5",
      "parents": [
        "ae74e42d2557b93a3da9ef75c51ef1f6aab3cc0a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jun 12 10:27:28 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jun 12 11:18:17 2018 -0700"
      },
      "message": "init: Actually check the return value for calls during first stage init\n\nInit never checked the return values of the calls made during first\nstage init (since of course they\u0027re not going to fail, right?).  But\nof course commands can fail and they might not necessarily be obvious\nwhen they do, so let\u0027s make it obvious.\n\nSince the kernel log isn\u0027t up until later, this creates a list of the\nfailures that can then be sent to the kernel log once it\u0027s ready\n(pending of course failures in setting it up...)\n\nTest: boot bullhead, don\u0027t see errors\nChange-Id: I8c12c61fa12e4368346e8b0e1c0bb0844b5d0377\n"
    },
    {
      "commit": "1385725e0995052ad96b482a60e9ffd5b663ddb5",
      "tree": "02b9690f42bb6a8782f54686843b44a6a8af0aee",
      "parents": [
        "06aeb41c16cb26e0f53cb964e657fe528437bb4d"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Fri May 18 15:25:15 2018 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Tue May 29 15:18:38 2018 -0700"
      },
      "message": "init: switch out keychord id with std::vector match of chords\n\nDrop all references to keychord_id and id and instead use keycodes_\nas the id.  The keycodes are a std::vector\u003cint\u003e with an unique\nsorted-order emplacement method added in the parser.  Solves the\nacademic issue with duplicate keychords and trigger all services\nthat match rather than first match only.\n\nTest: init_tests\nBug: 64114943\nChange-Id: I5582779d81458fda393004c551c0d3c03d9471e0\n"
    },
    {
      "commit": "06aeb41c16cb26e0f53cb964e657fe528437bb4d",
      "tree": "8f3b41c142e3f89ee504b1394dcbe7b092ac50cd",
      "parents": [
        "eca25076343945f901c7f631aad5e915c14c1a56"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Fri May 18 15:25:15 2018 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Tue May 29 13:46:12 2018 -0700"
      },
      "message": "init: turn keychords into a standalone class\n\nTest: init_tests\nBug: 64114943\nChange-Id: Ie760e4a3a661260ed2aabb8a92fe65fc93521cb5\n"
    },
    {
      "commit": "eca25076343945f901c7f631aad5e915c14c1a56",
      "tree": "4f20292ea17582f6b464d08ca355afd92a899199",
      "parents": [
        "e82401e592c6c45eca854525c91530ef8422db40"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed May 16 15:10:24 2018 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Tue May 29 13:20:19 2018 -0700"
      },
      "message": "init: refactor keychord for testing\n\nMove things around so that keychords.cpp is independent of service\nand init and can be individually tested with few dependencies.\nPermits also rolling out the keychords as a class in a future commit.\nImprove parser checking.\n\nTest: init_tests\nBug: 64114943\nChange-Id: I82570bc6269ed478db784ec38a8bc916da2be2be\n"
    },
    {
      "commit": "6c6ec7240c561934437b2f23065bcd9a3e9811f7",
      "tree": "7f602001eea23aefb368d6b611e597668595499f",
      "parents": [
        "e0a52774b4236f8dab6e1f0f246c6021ec0df698"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Sat Oct 24 16:20:18 2015 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Mon May 21 14:58:03 2018 -0700"
      },
      "message": "init: separate out epoll into a class\n\nTest: init_tests\nBug: 64114943\nChange-Id: I5f03314773b02b9e30e8e21895b6bdcfd4909e88\n"
    },
    {
      "commit": "4880d44d2af62eefaa95242cc98a6a3a7420d53b",
      "tree": "8f3d51ded2fc788bfb7de4fb1e759ced8c29dfd0",
      "parents": [
        "53248e47f42aa3deae74d3859958c4ea9dae2f85",
        "6227e345e72ddebb71b1e3655d7f79fb76f32271"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Wed May 09 19:34:22 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed May 09 19:34:22 2018 +0000"
      },
      "message": "Merge changes from topic \"interface_builtins\"\n\n* changes:\n  init: ServiceList FindInterface\n  builtins: interface_{start, stop, restart}\n"
    },
    {
      "commit": "6227e345e72ddebb71b1e3655d7f79fb76f32271",
      "tree": "2e94d0c1883a7fc7f1a2ba45457ac939a69b8e6a",
      "parents": [
        "612d7a47bd2aea662b8077bf24761d07e7a1ceff"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Tue May 08 13:46:39 2018 -0700"
      },
      "committer": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Tue May 08 14:26:44 2018 -0700"
      },
      "message": "init: ServiceList FindInterface\n\nFindService can\u0027t be used w/ interfaces due\nto the fact that multiple interfaces can be\nadded to any given interface.\n\nBug: 79418581\nTest: boot device, manually use ctl commands\nChange-Id: I7c152630462c9b7509473bc190f5b30460fcc2bc\n"
    },
    {
      "commit": "353bf1f945aa6f95d2a7856ddee344936bf95673",
      "tree": "6da39d9a1f223c1a9283d0ba9310be0163f10ea6",
      "parents": [
        "8ae7375f020367bab2e99a0737d7f7bde69cddf9"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Mon Apr 30 07:33:31 2018 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Tue May 08 13:19:12 2018 -0700"
      },
      "message": "init: switch from /dev/keychord to /dev/input/\n\nReplace deprecated /dev/keychord driver with /dev/input/ interface.\nWill restrict which nodes are active and relevant, and try to mask\nout any unreferenced inputs with EVIOCSMASK if available.\n\nTest: manual, boot, check registered chord works\nBug: 64114943\nChange-Id: I2bbf84a6e472d720f02282e10d56795b75ac62d1\n"
    },
    {
      "commit": "8ae7375f020367bab2e99a0737d7f7bde69cddf9",
      "tree": "9f184fb311ec513c206bcfcff37591bee83791bc",
      "parents": [
        "b004620f807984d898ae4c75660a220b9a4e20a3"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue May 01 13:39:52 2018 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Tue May 08 13:19:12 2018 -0700"
      },
      "message": "init: use std::function for epoll handling\n\nAlso allow unregistering of epoll handlers.\n\nBug: 64114943\nTest: boot\nChange-Id: I2abe6a56fd451839931d607dddb91669a7d02ff1\n"
    },
    {
      "commit": "4640149fd566cc1f73fa4ac972220acdcbb05b81",
      "tree": "7f6657e333fb926d6e12f7ac4b23e7e31ce51ba4",
      "parents": [
        "b41879111db50b66894b0285a61f6869cfc76fc1",
        "0b66969ba03464bea45a12c978f51b59c4c200a9"
      ],
      "author": {
        "name": "Tri Vo",
        "email": "trong@google.com",
        "time": "Wed Apr 18 19:32:32 2018 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Apr 18 19:32:32 2018 +0000"
      },
      "message": "Merge \"Add /mnt/vendor rw mount point for vendor partitions.\""
    },
    {
      "commit": "8f38048f7d23686a6f008e24cefb45972299d309",
      "tree": "42223b38bcda5296332d00d525b8cc70d8c671c9",
      "parents": [
        "22dc27b9fa46b20aca4f5982979681a858a97284"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 17 14:48:44 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 17 14:52:49 2018 -0700"
      },
      "message": "init: add sigstop option for debugging services from their start\n\nTest: the examples in README.md\nChange-Id: Idb528ea4017f8f4ce62911928c040f4bc558d196\n"
    },
    {
      "commit": "0b66969ba03464bea45a12c978f51b59c4c200a9",
      "tree": "bce361252c1a18e8218a94f1ccab768d74f89281",
      "parents": [
        "ca10ecb3aed00a146e9b3b35549d36797427eb88"
      ],
      "author": {
        "name": "Tri Vo",
        "email": "trong@google.com",
        "time": "Tue Apr 10 20:20:13 2018 -0700"
      },
      "committer": {
        "name": "Tri Vo",
        "email": "trong@google.com",
        "time": "Tue Apr 17 11:19:44 2018 -0700"
      },
      "message": "Add /mnt/vendor rw mount point for vendor partitions.\n\nChanges to init\u0027s behavior during early mount:\n1. Mounting of tmpfs on /mnt is moved from init stage to early mount.\n2. init creates /mnt/vendor used to mount vendor partitions.\n3. If a device tree fstab entry for early mount specifies a mount point\nunder /mnt/vendor e.g. /mnt/vendor/foo, init will create\n/mnt/vendor/foo mount point.\n\nBug: 64905218\nTest: change dt fstab entry to mount persist to /mnt/vendor/persist;\nmount point is created correctly, and partition is mounted in early\nmount. See go/pag/1069774\nTest: device boots with /mnt/vendor and previous contents of /mnt present,\nand selinux label \"mnt_vendor_file\" is applied correctly.\nTest: cts-tradefed run commandAndExit cts --skip-all-system-status-check\n--primary-abi-only --skip-preconditions -m CtsAppSecurityHostTestCases\n-t android.appsecurity.cts.PermissionsHostTest\nChange-Id: I3739130739eadf508355c7f2531366fcaed74175\nMerged-In: I3739130739eadf508355c7f2531366fcaed74175\n(cherry picked from commit b51147566461d411ad452df81d54dc800c554e06)\n"
    },
    {
      "commit": "1325ec8cfb85806867b6e88aa2c63f3d183a3353",
      "tree": "9a5797679ec99b4c125526ac3e05c871f4d6c930",
      "parents": [
        "af15fbf9aa6bb991a6abe8b2b72acc1a9405eff9"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Wed Apr 11 18:46:38 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Apr 12 14:15:26 2018 -0700"
      },
      "message": "init: use signalfd to catch SIGCHLD\n\nPreviously, if init received too many SIGCHLD signals, then the write to\nsignal_write_fd could fail with EAGAIN. The handler tried to log the\nEAGAIN error, and init deadlocked if the interrupted init process had\nalready acquired a logging-related lock.\n\nBug: b/77867680\nTest: manual\nChange-Id: Ief0b5e94d8517827a5a7d03773391ba3ba9447c4\n"
    },
    {
      "commit": "6f2d56d584159f1aece2e50e604d8db61deed383",
      "tree": "2c64e3cf63b4d8dab129cb3bde929156330f243e",
      "parents": [
        "2733708cfb2ed041e0a82593eeaae5b48ca44a66"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Feb 21 10:37:44 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Feb 21 16:36:03 2018 -0800"
      },
      "message": "init: log control messages along with the process that sent them\n\nIt\u0027s currently not clear that init stops processes due to being sent a\ncontrol message nor who sent that message.\n\nBug: 73343913\nTest: send control messages and see the logs\nChange-Id: I9e9eff2001e649814107ea961b3b747a1f6da598\n"
    },
    {
      "commit": "0f6417f232e92aad0d712ab1b131c0829869cddd",
      "tree": "1443f21b57b95cc361fe7d903091dc8eee83478b",
      "parents": [
        "cd2fa1f43215b829bd4359bf7725daa220b08dbf"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Feb 13 15:25:29 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Feb 13 15:26:14 2018 -0800"
      },
      "message": "Move ActionParser to its own file\n\nBug: 36970783\nTest: build\nChange-Id: Idd5b923e4789760bb9ef67c10982b2642bc6a31a\n"
    },
    {
      "commit": "4a4ec14e42e3a395086cfb8d992768a62b33aba4",
      "tree": "7557d02179877f6a7740cf70453cd3e0b189d354",
      "parents": [
        "0ce76f910b1794d422f8d45d77a3ee2b95ec3d3e"
      ],
      "author": {
        "name": "yusukes",
        "email": "yusukes@google.com",
        "time": "Thu Feb 01 17:14:30 2018 -0800"
      },
      "committer": {
        "name": "yusukes",
        "email": "yusukes@google.com",
        "time": "Fri Feb 02 15:28:03 2018 -0800"
      },
      "message": "Do not block SIGTERM in init\u0027s child processes\n\nPreviously, unless the process unblocks the signal by itself,\nthe signal was never delivered to the process. This caused at\nleast one CTS test failure.\n\nBug: 72453675\nTest: \u0027kill -TERM app_pid\u0027 terminates the app process\n\nChange-Id: I3977cac75e2673b52c5cf91d34d7a9c258c1a0e4\n"
    },
    {
      "commit": "dff165d3a2db868689bae12db1ed8b3c74fa7d60",
      "tree": "6237fc0bf1607237788962972b1b47ed4170f003",
      "parents": [
        "ccb9960bebe4e8ec7d674d8d1b778e5cd9669b48"
      ],
      "author": {
        "name": "Jaekyun Seok",
        "email": "jaekyun@google.com",
        "time": "Tue Nov 28 12:10:10 2017 +0900"
      },
      "committer": {
        "name": "Jaekyun Seok",
        "email": "jaekyun@google.com",
        "time": "Thu Jan 25 09:37:20 2018 +0900"
      },
      "message": "Support /product partition\n\nThis CL will enable reading /product/build.prop and add product paths\ninto ld.config.txt.in.\n\nBug: 64195575\nTest: tested with \u0027PRODUCT_PRODUCT_PROPERTIES :\u003d ro.product.abc\u003dabc\u0027 on\nsailfish\n\nChange-Id: Ie996def20e25dc1afe0c74af2096af844934b2dc\n"
    },
    {
      "commit": "618d3102c9aa7d6a6d0e60cc0175ad77319cb27b",
      "tree": "5de0cb7f0bd297ded16a95705311d8e06963722e",
      "parents": [
        "34f8eaab0de825b9a83b90348d837245c19ca728"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jan 19 14:25:48 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jan 19 14:25:48 2018 -0800"
      },
      "message": "Move all of init to libinit\n\nI\u0027d be not doing this for a while since some of this code doesn\u0027t\ncompile on host and libinit previously did.  But after realizing\nthe property_service.cpp (libinit) references symbols in init.cpp\n(init) and seeing a new linker error crop up due to that, it\u0027s time to\nmake the fix.\n\nMy only hold out previously was that libinit compiled on host bionic\nand some of init (builtins.cpp, etc) do not, however given that we\ndon\u0027t actually have host bionic support or host bionic init tests,\nthat isn\u0027t a good reason.  We can and should mock out the libraries\nthat aren\u0027t available with host bionic when ready.\n\nTest: build, unit tests, boot\nChange-Id: Ie49362ddb637924efc272540a4f32b693643fcdc\n"
    },
    {
      "commit": "e055d73396ecfba1dafd41fd2ec0cb3353c81e6a",
      "tree": "737fe623067de671e121ebfbac8070893b12d25a",
      "parents": [
        "796987482f3a56c4bc7ab7500a5dbe033ff11ae1"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Thu Oct 05 18:50:22 2017 -0700"
      },
      "committer": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Thu Oct 19 20:38:47 2017 -0700"
      },
      "message": "init language extension for lazy HIDL services.\n\nThis associates every service with a list of HIDL services\nit provides. If these are disabled, hwservicemanager will\nrequest for the service to startup.\n\nBug: 64678982\nTest: manual with the light service\nChange-Id: Ibf8a6f1cd38312c91c798b74574fa792f23c2df4\n"
    },
    {
      "commit": "8e09b0b953d21837e86b81c9ded43979d6a54dac",
      "tree": "1f153778540f22e931a2960f5506140be6844415",
      "parents": [
        "8b7feee38fe31eb40a50c55144a850cbc37e4089",
        "cb0f9bbc855097e0c8248643015b837255fd569a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Oct 02 19:48:58 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Oct 02 19:48:58 2017 +0000"
      },
      "message": "Merge \"init: run vendor commands in a separate SELinux context\""
    },
    {
      "commit": "cb0f9bbc855097e0c8248643015b837255fd569a",
      "tree": "cc42fe9dc7a6011c2b9e9ee0fd26f9f2454e1746",
      "parents": [
        "9c568d0fc0e290529180e3fc0452f0ac489e5053"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 12 15:58:47 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Sep 29 13:06:26 2017 -0700"
      },
      "message": "init: run vendor commands in a separate SELinux context\n\nOne of the major aspects of treble is the compartmentalization of system\nand vendor components, however init leaves a huge gap here, as vendor\ninit scripts run in the same context as system init scripts and thus can\naccess and modify the same properties, files, etc as the system can.\n\nThis change is meant to close that gap.  It forks a separate \u0027subcontext\u0027\ninit that runs in a different SELinux context with permissions that match\nwhat vendors should have access to.  Commands get sent over a socket to\nthis \u0027subcontext\u0027 init that then runs them in this SELinux context and\nreturns the result.\n\nNote that not all commands run in the subcontext; some commands such as\nthose dealing with services only make sense in the context of the main\ninit process.\n\nBug: 62875318\nTest: init unit tests, boot bullhead, boot sailfish\n\nChange-Id: Idf4a4ebf98842d27b8627f901f961ab9eb412aee\n"
    },
    {
      "commit": "d2b5a2417fb4e9546e1121f89b41cad8b0e028c0",
      "tree": "c98af219819a5b8f3761fd05005ef191e06331ef",
      "parents": [
        "ef9426d883b74c54cf0a7f7506140097ee88e65d",
        "161b8626bdae56350486feeb455865adf32b952a"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed Sep 27 19:32:31 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Sep 27 19:32:31 2017 +0000"
      },
      "message": "Merge \"init: report shutdown,container for sigterm of init\""
    },
    {
      "commit": "161b8626bdae56350486feeb455865adf32b952a",
      "tree": "cfa56570f5cfd838594360948da8d7415382e730",
      "parents": [
        "82ee4060ed01934fe3de94e5219f79aed4d86c9e"
      ],
      "author": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Tue Sep 26 08:26:12 2017 -0700"
      },
      "committer": {
        "name": "Mark Salyzyn",
        "email": "salyzyn@google.com",
        "time": "Wed Sep 27 09:10:00 2017 -0700"
      },
      "message": "init: report shutdown,container for sigterm of init\n\nChange HandleSigtermSignal() handler to report shutdown,container. Add\nthe new reason to bootstat.  Remove log stutter as\nHandlPowerctlMessage will also do a LOG(INFO) reporting\nshutdown,container as reason.\n\nSending SIGTERM to init is to allow a host OS to ask an Android\nContainer instance to shutdown.  The temptation is to report\nshutdown,sigterm but that does not accurately describe the usage\nscenario.\n\nTest: compile\nBug: 63736262\nChange-Id: I3c5798921bdbef5d2689ad22a2e8103741b570b4\n"
    },
    {
      "commit": "4a679454d7055c09ea7c491e265b475bce582a65",
      "tree": "f514470510111d1448131b539e9f4267011a3f45",
      "parents": [
        "f5dba11085eec3a9f5c3d2f97c8d41e2708eca96"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 26 16:30:03 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 26 16:30:03 2017 -0700"
      },
      "message": "init: cleanup exit() uses\n\nPrimarily, this fixes a bug where a forked child of property service\nuses exit() instead of _exit, which has the unintended consequences of\nrunning the global destructors of init proper, which leads to\nunintended cleanup.\n\nSecondly, this replaces the remaining calls of exit() that really\nshould be LOG(FATAL).\n\nTest: boot sailfish\nChange-Id: I779228e7d44a73186bc7685bb723c4b9278a0a2d\n"
    },
    {
      "commit": "3633a4014a1a315000c3e6dee36b419473ab44b9",
      "tree": "6c81c821307ac04cb0253b7a723ce8bb5866bd2f",
      "parents": [
        "19731103556cd33095cff8074191d4693bc0c74a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Sep 13 14:39:45 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Sep 15 21:07:41 2017 +0000"
      },
      "message": "init: fix crash when reboot is triggered by a builtin\n\nBuiltin commands may set the sys.powerctl property, which causes\nreboot to be immediately processed.  Unfortunately, part of the reboot\nprocessing involves clearing the action queue, so when this scenario\nhappens, ActionManager::ExecuteOneCommand() can abort due to its state\nbeing unexpectedly changed.\n\nLonger term, the real fix here is to split init and property service.\nIn this case, the property sets will be sent to property service and\nthe reboot will only be processed once property service responds back\nto init that the property has been set.  Since that will not happen\nwithin the action queue, there will be no risk of failure.\n\nShort term, this change sets a flag in init to shutdown the device\nbefore the next action is run, which defers the shutdown enough to fix\nthe crash, but continues to prevent any further commands from running.\n\nBug: 65374456\nTest: force bullhead into the repro case and observe that it no longer\n      repros\n\nChange-Id: I89c73dad8d7912a845d694b095cab061b8dcc05e\n"
    },
    {
      "commit": "9f97f4794027d8143b7d4f2d3ad4f80ca72ca77a",
      "tree": "d3483bb93fd2fe22fd5b71b0668145ce9571ef29",
      "parents": [
        "6139592321a489607534d9f51533d33908d75ba4"
      ],
      "author": {
        "name": "Luis Hector Chavez",
        "email": "lhchavez@google.com",
        "time": "Wed Sep 06 13:43:57 2017 -0700"
      },
      "committer": {
        "name": "Luis Hector Chavez",
        "email": "lhchavez@google.com",
        "time": "Thu Sep 07 10:47:04 2017 -0700"
      },
      "message": "init: Allow clean system shutdown upon SIGTERM\n\nThis allows Android to cleanly shutdown when running in a PID namespace\nin a way that does not rely on adbd running. This is useful to allow\nAndroid to be running in a container and its lifetime managed by an\nOCI-compliant tool.\n\nBug: 65415372\nTest: `kill -TERM 1` as root is correctly dropped.\nTest: `kill -TERM 1` from the init PID namespace causes init to cleanly shutdown.\nChange-Id: Ia66ebdb436221919081bc4723337c0c7f1e53b09\n"
    },
    {
      "commit": "30bf4b75003a6ca3e290be71ec87545bea82c760",
      "tree": "0cfd7245bc87da1f049200b46bf47809529ca906",
      "parents": [
        "32d2eae8b91d1316dc3c8c3890dc0d60c4cb716d",
        "1ca83249a1748c2458664afa76962e2bb9cdb553"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 28 21:45:38 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Aug 28 21:45:38 2017 +0000"
      },
      "message": "Merge \"init: fix signal handling and LOG(FATAL) in child processes\""
    },
    {
      "commit": "1ca83249a1748c2458664afa76962e2bb9cdb553",
      "tree": "1d2c4ba2a20ae722b75a775e84a9cc63035c29e8",
      "parents": [
        "2732a7e0232d77efbf19d7053f5e5d5d39719910"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 15:10:48 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 15:10:48 2017 -0700"
      },
      "message": "init: fix signal handling and LOG(FATAL) in child processes\n\nChild processes inherit the signal handlers and the \u0027Aborter\u0027 for\nlogging from their parent process.  In the case of init, fork()\u0027ed\nprocesses, will attempt to reboot the system if they receive a fatal\nsignal or if they call LOG(FATAL).  This is not the correct behavior;\nthese processes should terminate due to the provided signal like other\nprocesses on the system.\n\nThis is particularly important as there are multiple LOG(FATAL) calls\nin service.cpp for failures after fork() but before execv() when a\nservice is started.\n\nNote, that pthread_atfork() is not a viable solution since clone() is\nused in some cases instead of fork() and atfork handlers are not\ncalled with clone().\n\nTest: LOG(FATAL) from a child process of init and see that it\n      terminates due to a signal correctly\nTest: LOG(FATAL) from init proper and see that it reboots to the\n      bootloader\n\nChange-Id: I875ebd7a5f6b3f5e3e2c028af3306917c4409db3\n"
    },
    {
      "commit": "702ca9ada2ac3c5d61bd7ae4e13a0e986a472fcb",
      "tree": "44de14089904da4c986e1feb1952c6ebe949ddd4",
      "parents": [
        "2732a7e0232d77efbf19d7053f5e5d5d39719910"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 10:36:52 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 25 11:01:52 2017 -0700"
      },
      "message": "init: log all failures of Service::Start()\n\nThe move to returning Result from Service::Start() for better context\nwhen starting process through init\u0027s builtins stops Service::Start()\nfailures from being logged from other contexts.  This change adds\nthose logs along with their context.\n\nTest: boot bullhead, fail to start services via `setprop ctl.start`,\n      see the expected error in dmesg\n\nChange-Id: I45294f6abf00852f3d4c549a32eaf4920a51e6f0\n"
    },
    {
      "commit": "6de21f11125941ea1b94fdeec754bacea3916fd5",
      "tree": "c230a45f1202300f86ff3551e852612a3519ad73",
      "parents": [
        "7f16cad877571ce8ef0808dcdb81234d61b771ca"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 22 15:41:03 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 23 10:09:21 2017 -0700"
      },
      "message": "init: cleanup environment handling\n\nInit keep its own copy of the environment that it uses for execve when\nstarting services.  This is unnecessary however as libc already has\nfunctions that mutate the environment and the environment that init\nuses is clean for starting services.  This change removes init\u0027s copy\nof the environment and uses the libc functions instead.\n\nThis also makes small clean-up to the way the Service class stores\nservice specific environment variables.\n\nTest: boot bullhead\nChange-Id: I7c98a0b7aac9fa8f195ae33bd6a7515bb56faf78\n"
    }
  ],
  "next": "d8db7ab80d8a79c89393fa0c4ab343e85312d8d5"
}
