)]}'
{
  "log": [
    {
      "commit": "abdf4c56d0cd0c551f3fa86d849ce417bb0ca273",
      "tree": "ff41c663f6d21399ea4df411b5dc62e4800fe810",
      "parents": [
        "da537075677d85a6c3614020ee2fed893d191534"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 15 11:55:40 2020 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 15 11:55:40 2020 -0700"
      },
      "message": "Fix quoting of paths in auth code.\n\nNoticed looked at the log in http://b/160831491.\n\nTest: builds\nChange-Id: I95c595ba433a868dedeee8059cfba4c6de8ba91b\n"
    },
    {
      "commit": "77b8ff316a62842fc006ee35772db6567b0878c7",
      "tree": "56c38b0640b771c7e575adee4ab66b6fe4cf1111",
      "parents": [
        "8632ca12811aecc96d32ee2d1ee78245164c5d36"
      ],
      "author": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Thu Apr 16 15:58:19 2020 -0700"
      },
      "committer": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Fri Apr 17 16:38:34 2020 -0700"
      },
      "message": "adb: change mdns tls service names (RFC 6763).\n\nEven though mdnsresponder seems to allow us to use _adb_secure_connect\nand _adb_secure_pairing as service names, these names violate the syntax\noutlined in RFC6763, and may not be compatible with other dns-sd\nimplementations.\n\nAlso address some comments from a previous CL.\n\nBug: 154268895\n\nTest: atest adbd_test\nChange-Id: Ia872e976fc4276587b500a827a41d46d9dc755dd\n"
    },
    {
      "commit": "758a27dcfeef993680ecbc65411c25f1400ae120",
      "tree": "b788e07ea2e228abcbae541506694704fe5f7a2c",
      "parents": [
        "43a95f19255333cb68b6a0a724707faf867a79aa"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat Mar 07 12:51:00 2020 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat Mar 07 12:52:36 2020 -0800"
      },
      "message": "adb: improve logging of key loading slightly.\n\nIn particular, always include the file name in the log.\n\nBug: http://b/144462309\nTest: adb kill-server \u0026\u0026 adb devices -l \u0026\u0026 cat /tmp/adb.*.log\nChange-Id: I66b5e063b00381f9dfa9ace222cad3e415e4f43b\n"
    },
    {
      "commit": "64fab7573566c80fb3003a3b7ca9063e240e8db5",
      "tree": "082ff2b553343e1c70db8d02a92ccb94d0f5dc47",
      "parents": [
        "290ccb5dfe946d4dd39a6b8e584dd11ecd61779e"
      ],
      "author": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Tue Jan 21 13:19:42 2020 -0800"
      },
      "committer": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Fri Feb 21 21:07:13 2020 +0000"
      },
      "message": "[adbwifi] Add A_STLS command.\n\nThis command will be sent by adbd to notify the client that the\nconnection will be over TLS.\n\nWhen client connects, it will send the CNXN packet, as usual. If the\nserver connection has TLS enabled, it will send the A_STLS packet\n(regardless of whether auth is required). At this point, the client\u0027s\nonly valid response is to send a A_STLS packet. Once both sides have\nexchanged the A_STLS packet, both will start the TLS handshake.\n\nIf auth is required, then the client will receive a CertificateRequest\nwith a list of known public keys (SHA256 hash) that it can use in its\ncertificate. Otherwise, the list will be empty and the client can assume\nthat either any key will work, or none will work.\n\nIf the handshake was successful, the server will send the CNXN packet\nand the usual adb protocol is resumed over TLS. If the handshake failed,\nboth sides will disconnect, as there\u0027s no point to retry because the\nserver\u0027s known keys have already been communicated.\n\nBug: 111434128\n\nTest: WIP; will add to adb_test.py/adb_device.py.\n\nEnable wireless debugging in the Settings, then \u0027adb connect\n\u003cip\u003e:\u003cport\u003e\u0027. Connection should succeed if key is in keystore. Used\nwireshark to check for packet encryption.\n\nChange-Id: I3d60647491c6c6b92297e4f628707a6457fa9420\n"
    },
    {
      "commit": "290ccb5dfe946d4dd39a6b8e584dd11ecd61779e",
      "tree": "4b0147364e1b01190451052e94a6475be0d92638",
      "parents": [
        "4788202f0f99ce2b301722762b0630950fac989d"
      ],
      "author": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Wed Nov 20 14:18:43 2019 -0800"
      },
      "committer": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Fri Feb 21 21:06:40 2020 +0000"
      },
      "message": "[adbwifi] Add adbwifi_libs, TLS connection, and MDNS implementation.\n\nBug: 111434128, 119493510, 119494503\n\nTest: Enable wireless debugging in Settings UI, click \"pair with pairing code\"\nto generate pairing code.\nOn client, \u0027adb pair \u003cip_address\u003e\u0027, enter pairing code at prompt and hit\nenter. Pairing should complete.\n\u0027adb logcat\u0027.\nChange-Id: I86527bd3fc52e30a8e08ec5843dc3e100abf91fa\nExempt-From-Owner-Approval: approved already\n"
    },
    {
      "commit": "090c8074058afa7742ea33a0b3f2b5918ffc247e",
      "tree": "bbbfe4d911b265e3faf5f00c52c2908d5b1413ce",
      "parents": [
        "4fdea3858892545fd8d7f347d90cde76234ec5ec"
      ],
      "author": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Thu Dec 19 16:36:30 2019 -0800"
      },
      "committer": {
        "name": "Joshua Duong",
        "email": "joshuaduong@google.com",
        "time": "Tue Feb 11 20:49:20 2020 -0800"
      },
      "message": "Move adb RSA utilities into its own library.\n\nSince both the client and daemon will now be generating keys.\n\nBUG: b/111434128\n\nTest: atest adb_crypto_test\nChange-Id: I6fac562ae5629ab30b6639fbd88d822dae6e96bd\n"
    },
    {
      "commit": "3b1ff09678e9f3186bce6ba7b787433ced3a4ce4",
      "tree": "43904b609084d9ede52e4a979057636a040accbe",
      "parents": [
        "1af550e31d39953a4d13a9b63cf84abf3596ea06"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Oct 07 08:21:58 2019 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Oct 07 08:25:42 2019 -0700"
      },
      "message": "adb: log more detail on failure to read keys.\n\nBefore we just got \"Failed to read key\". After:\n\n  adb E 10-07 08:20:14 258249 258249 auth.cpp:176] Failed to read key \\\n    from \u0027/usr/local/google/home/enh/.android/adbkey\u0027\n  94390117965240:error:0900006e:PEM routines:OPENSSL_internal:NO_START_LINE:\\\n    external/boringssl/src/crypto/pem/pem_lib.c:622:Expecting: ANY PRIVATE KEY\n\nAlso fix the misleading \"Failed to generate\" message from adb_auth_init.\n\nBug: http://b/141715453\nTest: manually corrupted key; see above\nChange-Id: I6732ee6b683c8548d596d7c22eeddab8ce9a3cea\n"
    },
    {
      "commit": "972221b30cf00ff910c9d38b446bb91e8fccd21f",
      "tree": "81c6390224a5d06c812dea3579201d5aeb792da4",
      "parents": [
        "dfbc1edce4778d5d90c7605c0d281248466e4b87"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Apr 29 12:36:32 2019 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Apr 29 12:36:32 2019 -0700"
      },
      "message": "adb: restore generation of public key in `adb keygen`.\n\nWe don\u0027t need the public key to be generated at ~/.android/adbkey.pub,\nbut it\u0027s still useful to be able to generate the public key for use with\nADB_VENDOR_KEYS.\n\nBug: http://b/119634232\nTest: manual\nChange-Id: Iecd6ff1bba4af4ba142456034f3faf52bb9e017d\n"
    },
    {
      "commit": "e2f32340d2d852c7d43a2ef07c74faac0d0f7ee5",
      "tree": "ccd9752029e49e7ae441264e3f9f4e63c0331ba6",
      "parents": [
        "c7a409036e606a1d0cace8b066ef9a87e61c5b48"
      ],
      "author": {
        "name": "Greg Kaiser",
        "email": "gkaiser@google.com",
        "time": "Tue Mar 26 11:58:53 2019 -0700"
      },
      "committer": {
        "name": "Greg Kaiser",
        "email": "gkaiser@google.com",
        "time": "Tue Mar 26 12:00:19 2019 -0700"
      },
      "message": "adb: Avoid extra std::string copies\n\nWhen a function argument takes a std::string, it\u0027s inefficient to\npass std::string::c_str(), since that creates an additional copy.\nSo we change these calling sites.\n\nTest: TreeHugger\nChange-Id: I1c0fde7275eb3ebd3baf05ec62581b0243655608\n"
    },
    {
      "commit": "13102c3ed2cc2cc7371364fab946f0cef781eb80",
      "tree": "bde48974a71c03bfa3629b47acd8840b827727d5",
      "parents": [
        "a958fb6ef27d47a259070ea75d1ec44c7dc1be37"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Nov 15 17:45:46 2018 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Nov 15 17:50:57 2018 -0800"
      },
      "message": "adb: stop using adbkey.pub.\n\nAn adbkey/adbkey.pub pair that doesn\u0027t match up results in a\nhard-to-diagnose scenario where \"Always allow from this computer\"\ndoesn\u0027t work. The private key contains all of the information that\u0027s\nin the public key, so just extract the public key out of the private\nkey instead of storing them separately.\n\nBug: http://b/119634232\nTest: rm ~/.android/adbkey.pub; adb kill-server; adb shell true\nTest: rm ~/.android/adbkey*; adb kill-server; adb shell true\nChange-Id: I0ae9033dbcd119c12cfb2b3977f1f1954ac800c1\n"
    },
    {
      "commit": "597044d8f6b82a46cdb61827fec841b66023b54c",
      "tree": "163e7784fa59456a4eb3035b10c77f95d6ca5a94",
      "parents": [
        "fcd0ffbf34d714020f42f2d3ed0b0db65803543e"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Aug 08 16:20:14 2018 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Aug 08 17:40:15 2018 -0700"
      },
      "message": "adb: report connection status when we\u0027re unauthorized.\n\nPreviously, connecting to devices that end up as unauthorized would\nwait 10 seconds before reporting failure to the user. After this\nchange, notification happens as soon as the adb server realizes.\n\nTest: manual\nChange-Id: If7c8d38f22da3d98b952eee6a334abc8566bb751\n"
    },
    {
      "commit": "86e67188a11db7f8db0a1bab3029c6038492e498",
      "tree": "963877f99160913f617086db5542cf453426814d",
      "parents": [
        "7cd4c4f039f8c2dabf6cf7a0c6ab16cc1fa352ff"
      ],
      "author": {
        "name": "Yi Kong",
        "email": "yikong@google.com",
        "time": "Fri Jul 13 18:15:16 2018 -0700"
      },
      "committer": {
        "name": "Yi Kong",
        "email": "yikong@google.com",
        "time": "Fri Jul 13 18:21:00 2018 -0700"
      },
      "message": "[adb] Modernize codebase by replacing NULL with nullptr\n\nFixes -Wzero-as-null-pointer-constant warning.\n\nTest: m\nBug: 68236239\nChange-Id: Ia8c4deacafed2f3b7dbc3d4c3c77c6c632e3de81\n"
    },
    {
      "commit": "7a7c5cb2af1a3aaad517c6e62f178749637f44bd",
      "tree": "0c5f46815ca6f184cde8b208f747025c83ec7817",
      "parents": [
        "52328b65ea21e72de9e5d846f8d1c6167b080ffa"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri May 04 16:04:49 2018 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri May 04 18:05:18 2018 -0700"
      },
      "message": "adb: add authorizing, connecting states to transport.\n\nAdd two states: connecting and authorizing, to disambiguate the offline\nand unauthorized states, respectively.\n\nPreviously, devices would transition as follows:\n\n  offline -\u003e unauthorized -\u003e offline -\u003e online\n  offline -\u003e unauthorized (when actually unauthorized)\n\nWith this patch:\n\n  connecting -\u003e authorizing -\u003e online\n  connecting -\u003e authorizing -\u003e unauthorized (when actually unauthorized)\n\nThis allows test automation and the like to distinguish between offline\ndevices, unauthorized devices, and working devices without having to\ndo retry loops with arbitrary sleeps on their end.\n\nBug: http://b/79257434\nTest: adb_test\nTest: adbd_test\nTest: manually plugging in a device with `while true; do adb shell echo foo; done`\nChange-Id: I036d9b593b51a27a59ac3fc57da966fd52658567\n"
    },
    {
      "commit": "cd2a5290137e1d55f6f16163ac58f39f28e40b00",
      "tree": "c4150b28fecf93e1d7e05f0f7825127643802305",
      "parents": [
        "83d33f8f516fe1730d940fa850aed0b7120e72a2"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Mar 07 16:52:28 2018 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Apr 11 12:54:07 2018 -0700"
      },
      "message": "adb: switch apacket payload to a type that doesn\u0027t initialize its contents.\n\nSwitch from using std::string as the type we use to hold our payload in\napacket to a custom reimplementation that doesn\u0027t zero initialize. This\nimproves bulk transfer throughput in the adb_benchmark microbenchmark\non walleye by ~20%.\n\nTest: adb shell taskset f0 /data/benchmarktest64/adb_benchmark/adb_benchmark\nChange-Id: Ibad797701eb1460c9321b0400c5b167b89b2b4d0\n"
    },
    {
      "commit": "361148b3a71373900c6141d7980e4a1098f1dd68",
      "tree": "6a21731897b364e31c04fd3895fc656f4b8de2aa",
      "parents": [
        "d64d2ed556b0fd62b79b39bfbfab222796cd3029"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Jan 02 12:01:43 2018 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Feb 28 15:29:50 2018 -0800"
      },
      "message": "adb: switch over to Android.bp.\n\nRearrange some files while we\u0027re doing this.\n\nBug: http://b/71721338\nTest: manually ran adb on windows\nChange-Id: Ie47bda82279e4b9521505ad0353bf9ef649fc7d7\n"
    },
    {
      "commit": "839b932f0c28eab8ff9c1cecd3b55af27baf8439",
      "tree": "a18d3410761bad64815bb238f32917f44c763c96",
      "parents": [
        "bbe85f7a9abcca6f86d286155705589a7ace0141"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Feb 05 18:49:10 2018 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Feb 21 14:30:17 2018 -0800"
      },
      "message": "adb: switch apacket over to a std::string payload.\n\nTest: python test_device.py with walleye/x86_64 emulator\nChange-Id: I0a18941af1cb2279e5019a24ace25741def1202f\n"
    },
    {
      "commit": "6aa72894df83bb298c82329cffef3817f8056475",
      "tree": "ef0d392184f6292d7d52261ce642a2f0a9bda4aa",
      "parents": [
        "272e7a68f85706a631b209998ba5c4aeb69ca403"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon May 01 13:45:30 2017 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon May 01 16:05:16 2017 -0700"
      },
      "message": "Stop writing NUL bytes in adbkey.pub.\n\nIn N we moved some code from C to C++ without realizing that EVP_EncodedLength\nincludes space for a terminating NUL and EVP_EncodeBlock writes one. Because\nour key reading code copes with the NUL, we never noticed.\n\nDistinguish between the required space returned by EVP_EncodedLength and the\nactual number of bytes (not including NUL) used return by EVP_EncodeBlock.\n\nBug: http://b/36187819\nTest: hexdump of ~/.android/adbkey.pub\nChange-Id: I81a487ddbb5c884593b6426d1f41cfaece26ff90\n"
    },
    {
      "commit": "6946f119849ebb70a398e432036f93637dc194a5",
      "tree": "faf0bdb04e548a2dfc4e093cf6bc17fa2fbba610",
      "parents": [
        "690b0a9f8b26cb42d450d5ffad345b7d5c85932b"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Jan 18 18:14:17 2017 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Jan 20 15:26:00 2017 -0800"
      },
      "message": "adb: check for and report inotify_init1 failure.\n\nBug: http://b/34396687\nTest: mma\nChange-Id: I55ea84db49017a6533ac54db5072e3e75ba30097\n"
    },
    {
      "commit": "e9e7bac660573957d60ef8125d1615cabb505d66",
      "tree": "3bf12b6559625fc2d3bc53c75af672750584d3e6",
      "parents": [
        "f860798e0070bbdba5b6b3ebd5b1bf3578aa669f"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Dec 14 16:59:29 2016 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Dec 14 17:05:36 2016 -0800"
      },
      "message": "adb: don\u0027t require adb keys to be named \"*.adb_key\".\n\nDon\u0027t require the extension on explicit file paths passed on; only\ncheck for it in monitored directories.\n\nBug: http://b/33638233\nTest: ADB_TRACE\u003d1 ADB_VENDOR_KEYS\u003d$HOME/foo adb server nodaemon\nChange-Id: I7387e0bbe0f2e16878bf22b05d5c6e8d0f9e5a92\n"
    },
    {
      "commit": "67ac379f0125c91c14e6ac9ab389d1f791d02945",
      "tree": "45b68a3848150ccc5abaccb12672f94e8f0fa5a4",
      "parents": [
        "b4e8ba2768d060465ad4fe9f0d39c809b08b93d7"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Oct 06 13:31:44 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Oct 06 14:50:02 2016 -0700"
      },
      "message": "adb: rationalize types.\n\nUse fixed length types for structs going over the wire, constify\narguments where possible, use char* instead of unsigned char* for\napacket data, and assorted other refactoring.\n\nBug: http://b/29273531\nTest: python test_device.py with every combination of old/new adb and adbd\nChange-Id: I0b6f818a32be5386985aa4519f542003cf427f9d\n"
    },
    {
      "commit": "eac2058cad3b4937cea26396b1f38fa468433345",
      "tree": "b87d751fc043320f6e8dbe17cb685b8d619e52f2",
      "parents": [
        "f6b4996674fde5b88e3f3fe98b907a0bb2e328a5"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Oct 05 19:02:29 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Oct 06 12:36:26 2016 -0700"
      },
      "message": "adb: split up adb_auth.cpp.\n\nAll of the functions in adb_auth.cpp were used in only one of\nadb/adbd. Split up them up into adb_auth_host.cpp and adbd_auth.cpp\nrespectively.\n\nBug: http://b/29273531\nTest: built and flashed bullhead, adb still works\nChange-Id: Ib610c5157522634cc273511175152f1306cc52a7\n"
    },
    {
      "commit": "bd4d4e1cb0f245c90a37a7e7adc886e0273cb526",
      "tree": "24247cb0fe50595a0a90b59c731681614fcdfa75",
      "parents": [
        "7d73fcd54c1599ca724f6d6dae2ba75f072810a6"
      ],
      "author": {
        "name": "Pirama Arumuga Nainar",
        "email": "pirama@google.com",
        "time": "Tue Sep 06 13:34:42 2016 -0700"
      },
      "committer": {
        "name": "Pirama Arumuga Nainar",
        "email": "pirama@google.com",
        "time": "Tue Sep 06 13:49:07 2016 -0700"
      },
      "message": "Use \u003ccondition_variable\u003e and \u003cmutex.h\u003e from MinGW\n\nNew MinGW prebuilts update includes pthreads and C++11 threads support.\nUse mutex.h and condition_variable provided by MinGW.\n\nTest: Build AOSP with new MinGW prebuilts\nChange-Id: Ia8f890f86652612df3fc2618c2bfbb450a5a2f52\n"
    },
    {
      "commit": "62ff9d49da6d3d0d1387eec61fce88cbcb62e57b",
      "tree": "1436cb0ed31aa74e68ce95af299d2b282b93901b",
      "parents": [
        "827a4a575d5a880f68d2647f9d4a581aca0341fc"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Aug 30 15:23:35 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 01 15:43:22 2016 -0700"
      },
      "message": "adb: add helper to get the ~/.android directory.\n\nExtract the logic for creating ~/.android out of get_user_key_path into\nits own function. Also, fall back to getpwuid_r when $HOME isn\u0027t\ndefined.\n\nChange-Id: I676a7c750cb364f89b544818ffda07903d14fb97\nTest: ran adb with ~/.android missing\n"
    },
    {
      "commit": "22cb70bd5a2eebe3e584a2a1850499ec8ad40fb8",
      "tree": "9784a650bbae74ea5f0afe733337b0e5e74340e9",
      "parents": [
        "801066a2b8dc1545cba6b6e16218b2f1a806e93d"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Aug 18 22:00:12 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Aug 19 17:32:50 2016 -0700"
      },
      "message": "adb: add support for vendor key directories.\n\nAllow directories to be specified in ADB_VENDOR_KEYS. On Linux, monitor\nthis directory for new keys to be added.\n\nAdditionally, deduplicate keys by hashing their public key.\n\nBug: http://b/29273531\nBug: http://b/30927527\nChange-Id: I8d3312b216b7f2c11900f2235f1f1b1d1c7aa767\nTest: manually tested by adding a key to a directory, and verifying\n      that devices became authorized after replugging.\n"
    },
    {
      "commit": "801066a2b8dc1545cba6b6e16218b2f1a806e93d",
      "tree": "8e34de3e43363904ffe0f4b7a9dd8ff761a3c803",
      "parents": [
        "8ac4599bd63e30677e393281ebd360aa4110a915"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jun 29 17:42:01 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Aug 11 13:53:18 2016 -0700"
      },
      "message": "Clean up key handling in adb.\n\nThis includes the locking we need to be able to re-load the keys at runtime.\n\nWe should rename \"adb_auth_client.cpp\" to \"adb_auth_adbd.cpp\" or\n\"adbd_auth.cpp\" in a later change.\n\nChange-Id: I9e1d5b6b7d0497d6f6e5d9c4fb660118cdff05a8\nTest: \"adb devices\" works against a non-AOSP device with $ADB_VENDOR_KEYS set, says \"unauthorized\" without.\nBug: http://b/29273531\n"
    },
    {
      "commit": "ab942fd3f1e899016b66158c3dab4bfa02685998",
      "tree": "2d35b5696926c3d0438d76572b5fb12c7f03bff1",
      "parents": [
        "de65d30880b35bd044e1870824fa6d3b779f866f"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jun 21 16:50:48 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jun 22 08:38:47 2016 -0700"
      },
      "message": "Address old review comments in adb_auth_host.cpp.\n\nComments from:\nhttps://android-review.googlesource.com/#/c/212781/4/adb/adb_auth_host.cpp@107\n\nBug: http://b/28152031\nChange-Id: I27d062f3eeb8db90f94b1b4f5d7204000a7ac73d\nTest: manually removed ~/.android/adb* and checked they were recreated correctly.\n"
    },
    {
      "commit": "e0a6e2a4b21c1aae27a21ea8e342b123e3e5be11",
      "tree": "2a10ba04138e22764b509bc2ef6d438a550dc51d",
      "parents": [
        "09ecaa50a09866457344c0dce3b397901e4257ba"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu May 26 22:43:19 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 27 16:14:02 2016 -0700"
      },
      "message": "Kill load_file.\n\nChange-Id: I6c332f7d8e94d513605295b3d4d32c4e1cf878dc\n"
    },
    {
      "commit": "09ecaa50a09866457344c0dce3b397901e4257ba",
      "tree": "c0bb19eb7aa866aeef5f4b93dfade466bf7f5ddc",
      "parents": [
        "f1d70c741c9262c14e2c031599912af5fa198f94"
      ],
      "author": {
        "name": "Yurii Zubrytskyi",
        "email": "zyy@google.com",
        "time": "Thu May 26 09:46:10 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 27 14:43:26 2016 -0700"
      },
      "message": "[adb] Followup CL to clean up adb_auth_host.cpp\n\nGet rid of unused includes + replace a fixed-size buffer with an\nstd::string\n\n(cherry-pick of ef21b5556ddd621665107008e2acc3f4843a565d.)\n\nChange-Id: I4f9927b900a79a012b5d52908b9d22ac3d2a401c\n"
    },
    {
      "commit": "70ae70a563ef0bd8ec4c419289e5cc3c177bd3e5",
      "tree": "73cdbf0e35eb4d01864b09123d88689dcd155df2",
      "parents": [
        "ab032ff50c29393da1ab9fde7826dba176295d0a"
      ],
      "author": {
        "name": "Yurii Zubrytskyi",
        "email": "zyy@google.com",
        "time": "Wed May 25 15:17:10 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 27 13:34:40 2016 -0700"
      },
      "message": "[adb] Issue the \"auth\" emulator command before any other one\n\nEmulator console now requires authentication; this means\n\u0027adb emu ...\u0027 commands silently fail because of it.\nThis CL adds an \u0027auth \u003ctoken\u003e\u0027 command to each user command,\nmaking sure it won\u0027t be silently ignored.\n\n(cherry-pick of c0889ab3b0b953e138edc3ace3ffeb10643a9ed5.)\n\nBug: https://code.google.com/p/android/issues/detail?id\u003d211233\nChange-Id: Id9ca4999fd2e6393cc88278eaf444243e13c0ec0\n"
    },
    {
      "commit": "a947b49de093bb36b77e5afb5485d413f8f78a7a",
      "tree": "ab4a7b5f0ea1d021170b2d357b3035d8f0d65546",
      "parents": [
        "43d4313260a2004fc54831e24fd99dc9183dc97f"
      ],
      "author": {
        "name": "Mattias Nissler",
        "email": "mnissler@google.com",
        "time": "Thu Mar 31 16:32:09 2016 +0200"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Apr 12 23:04:11 2016 +0000"
      },
      "message": "Switch fs_mgr and adb to libcrypto_utils.\n\nUpdate code and dependencies to use BoringSSL + libcrypto_utils\ninstead of mincrypt.\n\nChange-Id: Ic75164bd50c84b81b6310e27a67d4b3c174984f9\n"
    },
    {
      "commit": "c573d52b3a78b52e0108d70d3ca378d7c9b3171d",
      "tree": "2918565142088cc520485d368a1c448258e5912b",
      "parents": [
        "ea71e279bd63c510bcf10822fdd2a4689ca82a8d"
      ],
      "author": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Wed Jan 27 08:52:53 2016 -0800"
      },
      "committer": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Mon Feb 01 12:18:26 2016 -0800"
      },
      "message": "base: add SystemErrorCodeToString() function.\n\nPulls the Windows error string generation out of adb into libbase so\nthat it can be used by fastboot as well. Also makes a Unix equivalent\nthat just wraps strerror() so that upcoming fastboot error reporting\ncode can be platform-independent.\n\nThe intent here is just to provide a portable way to report an error to\nthe user. More general cross-platform error handling is out of scope.\n\nBug: http://b/26236380\nChange-Id: I5a784a844775949562d069bb41dcb0ebd13a32bc\n"
    },
    {
      "commit": "f55ead962f2257312af08fe730ef9d3f3d988e76",
      "tree": "75488c67fc418f771691c0aa9caa88346126ed75",
      "parents": [
        "b13dd00d883d02dfef1a403caa63501ddca50a09"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Dec 04 22:00:26 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Dec 04 22:00:26 2015 -0800"
      },
      "message": "Track rename of base/ to android-base/.\n\nChange-Id: Idf9444fece4aa89c93e15640de59a91f6e758ccf\n"
    },
    {
      "commit": "50f5bf18e3831557c5726ae050577f8fe2e6151b",
      "tree": "d497eb61563f4d8b0cfd541b6c378edc98bc0eed",
      "parents": [
        "ac9a78090498f3e75bd0c25064a90f6eb3dc496b"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Thu Nov 12 15:20:15 2015 -0800"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Thu Nov 12 17:13:08 2015 -0800"
      },
      "message": "adb: win32: remove widen()/narrow() in favor of UTF8ToWide()/WideToUTF8()\n\nNow that we have a more standardized API (also available in Chromium),\nswitch to it. Another benefit is real error handling instead of just\nkilling the process on invalid Unicode.\n\nMake UTF8ToWide()/WideToUTF8() set errno to EILSEQ on bad input. This is\nthe same error code that wcsrtombs(3) uses.\n\nUpdate the unittest to check for EILSEQ.\n\nChange-Id: Ie92acf74d37adaea116cf610c1bf8cd433741e16\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "8595283cec8608cd7bc383e6ffe5203772975d94",
      "tree": "f83372d69a901031b44d501dfa5d1b57cb6e8eea",
      "parents": [
        "17b5d9cb74fcd240bac793eec7b7ee860d3188b0"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Oct 07 15:59:35 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Oct 07 16:11:17 2015 -0700"
      },
      "message": "Use const auto\u0026/auto\u0026\u0026 in adb.\n\nChange-Id: I74a7e511302e15e207906f572d181634e0ed5604\n"
    },
    {
      "commit": "19bec5b329fe202795688bfb76d77f4560adf2c6",
      "tree": "e046660c0f6fcf1038982323810cb15e0326d591",
      "parents": [
        "468978294e130807cc37ed295115863c2d7bacaa"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Sep 22 15:52:57 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Sep 23 12:53:38 2015 -0700"
      },
      "message": "Adb: use VLOG() to replace D() for verbose logging.\n\nAs there are too many D(), we can keep both VLOG() and D() now, and get\nrid of D() gradually.\n\nChange-Id: I2f1cb70bcab3e82c99fed939341d03f6b2216076\n"
    },
    {
      "commit": "815ad88d465c07b09eae296db6f41b7bef3c3cc4",
      "tree": "b52bacf0f8fdeaad7b5dfa89f3ffeff841dc8e1d",
      "parents": [
        "7d5e6e62f2d618ba376cbc9b8a5def881a73f1a9"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Sep 02 17:44:28 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Sep 02 20:21:00 2015 -0700"
      },
      "message": "adb: clean up debug tracing a little.\n\nAlways use LOG() for debug tracing.\nRemove useless D_lock. I believe it is useless to lock just before and after fprintf.\n\nI verified the log output both on host and on device. The output looks fine to me.\n\nChange-Id: I96ccfe408ff56864361551afe9ad464d197ae104\n"
    },
    {
      "commit": "1711e01f1452f8f8caf315ca23618b17f0811596",
      "tree": "ff2cbeba5e70405ad1af06daab19eeb0c505f390",
      "parents": [
        "d0bdf9a27e8a3e17b1e666887ed2d85d94d606b5"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sun Aug 02 18:50:17 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sun Aug 02 18:50:17 2015 -0700"
      },
      "message": "adb: win32: call SystemErrorCodeToString() from more places\n\nImprove some error messages, or trace output.\n\nChange-Id: Ib09fac33a296f090d37f125cad7556fc5b5e928e\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "6815c07fbe95c9f38362d5cbf80d8286e3d86950",
      "tree": "4675cd2e9c7cfc7cc929796485b1e36f081ac21e",
      "parents": [
        "c5dc27027a99fb09503d96a875a23c03eb4ac885"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Mon May 11 01:08:48 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jul 31 13:30:41 2015 -0700"
      },
      "message": "adb: win32: Unicode path names, env vars, some console support\n\nInitial support for Unicode file/dir names. Unicode paths can be passed\non the command line, directory enumeration can enumerate Unicode paths,\nUnicode paths are used for file access, and Unicode paths can be output\non the console correctly.\n\nAlso Unicode environment variable access.\n\nInitial support for Unicode output from adb shell (which uses\nadb_fwrite()). This is partial because the corner case of an\nadb_fwrite() call with an incomplete UTF-8 multi-byte sequence does not\noutput correctly, but this should be uncommon, is better than what we\nhad before (*always* incorrect UTF-8 multi-byte sequences) and can be\nfixed in the future.\n\nCalls to Windows APIs with char strings were changed to pass wchar_t\nstrings to the FooW() variants.\n\nFor more details, see the giant comment in sysdeps_win32.cpp.\n\nhttps://code.google.com/p/android/issues/detail?id\u003d8185\n\nChange-Id: I7ebf6713bb635638b986ccee97b354428837c9c5\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "a1c60c0597f8f978fd6568c19fb90993592e031d",
      "tree": "167659e4796194f01f2109748ba035e5e7230f5f",
      "parents": [
        "34f6f58d0fdbaa23288ad4f79503bfd51c7a7ce5"
      ],
      "author": {
        "name": "Tamas Berghammer",
        "email": "tberghammer@google.com",
        "time": "Mon Jul 13 19:12:28 2015 +0100"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 22 13:06:06 2015 -0700"
      },
      "message": "Increase size of the the adb packets sent over the wire\n\nThe reason behing this change is to increase the adb push/pull speed\nwith reduceing the number of packets sent between the host and the\ndevice because the communication is heavily bound by packet latency.\n\nThe change maintains two way compatibility in the communication\nprotocol with negotiating a packet size between the target and the\nhost with the CONNECT packets.\n\nAfter this change the push/pull speeds improved significantly\n(measured from Linux-x86_64 with 100MB of data):\n\n           | Old push | Old pull || New push  | New pull  |\n-----------------------------------------------------------\nHammerhead | 4.6 MB/s | 3.9 MB/s || 13.1 MB/s | 16.5 MB/s |\n-----------------------------------------------------------\nVolantis   | 6.0 MB/s | 6.2 MS/s || 25.9 MB/s | 29.0 MB/s |\n-----------------------------------------------------------\nFugu       | 6.0 MB/s | 5.1 MB/s || 27.9 MB/s | 33.2 MB/s |\n-----------------------------------------------------------\n\nChange-Id: Id9625de31266e43394289e325c7e7e473379c5d8\n"
    },
    {
      "commit": "5c761bdf94bcdaf3a619cde002ef60c9b226f5c3",
      "tree": "62e95a1ffffde3814c2818c52b2d9404856b57ae",
      "parents": [
        "bba4d471283190dd9b153b7e13efdb28da0b6695"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Jul 21 02:06:26 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Jul 21 02:06:26 2015 -0700"
      },
      "message": "adb: logging: newlines, thread ids, error code overwriting\n\nAdd missing \\n to uses of legacy D() macro. This should make the legacy\nlogging easier to read (and harder to miss important stuff).\n\nOn POSIX, use gettid() from libcutils instead of pthread_self() so that\nthe output shows a more reasonable number instead of a pointer value.\nThis should be ok since libbase\u0027s logging already uses gettid().\n\nWin32:\n\nDon\u0027t let the Win32 last error get overwritten by API calls after the\noriginal error\u0027ing API. When encountering an unknown error, log the\nspecific error code.\n\nChange-Id: Ib8f72754efa7ba895d2f1cd914251fec2a1d894c\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "3d978e686996480f3e5e1c7725c2bfdea276fe04",
      "tree": "07cfc912d2f13cb587d368ef5e1281e11c4c1a28",
      "parents": [
        "7d8fc468e4615cf1bcc9f47f3f98f28c704b205c"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jul 09 20:35:09 2015 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jul 09 20:35:09 2015 +0000"
      },
      "message": "Revert \"Turn on -Wformat-nonliteral.\"\n\nOne of my build aliases doesn\u0027t play nice with USE_MINGW\u003d1, so my build lied to me. Will revert until I fix it up.\n\nThis reverts commit 7d8fc468e4615cf1bcc9f47f3f98f28c704b205c.\n\nChange-Id: I7905c5ae5ee85fb2d228ce63d81c79f140998c18\n"
    },
    {
      "commit": "7d8fc468e4615cf1bcc9f47f3f98f28c704b205c",
      "tree": "dd37c9803937e98bcfb085ea3a05697b0ba9ecac",
      "parents": [
        "5f1d5ff74159582d2076120a85b1a70aeced1afe"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 08 13:50:42 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jul 09 10:47:24 2015 -0700"
      },
      "message": "Turn on -Wformat-nonliteral.\n\nApparently there are two classes of this warning in clang.\n-Wformat-security is only emitted for cases of\n`func(nonliteral_fmt_string)` (no args), and -Wformat-nonliteral is\nemitted for cases *with* arguments. For whatever reason, the latter\nisn\u0027t included in -Wextra and must be manually enabled.\n\nTo make this more easily portable to Windows, move the existing\ngnu_printf/__printf__ decision into base/macros.h as ATTRIBUTE_FORMAT.\n\nChange-Id: I3b0990e1d1f0a2e9c13b32f5cd60478946cb5fc6\n"
    },
    {
      "commit": "3a2421b940e844e6c29da9ec389da42dc87f90f2",
      "tree": "331a2e72aa1ce7167daba893914f0ffc386b1b2f",
      "parents": [
        "b1d05de8a377b369b424d0e6c79f1843581bc1e9"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Fri May 22 20:09:06 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Fri May 22 20:20:49 2015 -0700"
      },
      "message": "adb: fix adb_close() vs. unix_close() usage\n\nDocument the differences between adb_*() and unix_*() in the function\nprototypes in sysdeps.h. See the file for the details (CR/LF\ntranslation, well-known file descriptors, etc.).\n\nFix adb_read(), adb_write(), and adb_close() calls that should really be\nunix_read(), unix_write(), and unix_close(). Note that this should have\nno impact on unix because on unix, unix_read/unix_write/unix_close are\nmacros that map to adb_read/adb_write/adb_close.\n\nImprove sysdeps_win32.cpp file descriptor diagnostic logging to output\nthe name of the function that was passed a bad file descriptor.\n\nChange-Id: I0a1d9c28772656c80bcc303ef8b61fccf4cd637c\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "9ca39e3b3771099dc41dd37968c56a2d15c3a4fc",
      "tree": "57ec0602623f840890b7d1ce7978733e71f8b9bc",
      "parents": [
        "211b490c576ad10c862defb62563d9b804ad05d2"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue May 19 22:12:06 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed May 20 12:25:19 2015 -0700"
      },
      "message": "adb / libbase: clean up NOGDI and evil ERROR macro\n\nInstead of defining and undefining NOGDI:\n\n1. Always #include \"base/logging.h\" after #include \u003cwindows.h\u003e.\nUnfortunately, I could not find an easy way to give the user a\nwarning/error if they include in the wrong order.\n\n2. base/logging.h does #undef ERROR to undefine the evil ERROR macro\nthat is from another era and probably a bad idea to begin with.\n\nChange-Id: I995d89620611e849af9d7ec47eb55fc0512377f2\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "60bca2d1ed6b49646e05f2491c8fd9687e32ccb9",
      "tree": "f0c33f3091697049e13f566c6098d3093a77299e",
      "parents": [
        "7dc759fb0c860d8e8cf44375556ed1c9089b52e8"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Thu May 07 19:08:29 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Thu May 07 19:08:29 2015 -0700"
      },
      "message": "adb: win32: fix key files reading/writing\n\nThe issue is that adb uses fopen() with \"e\" (presumably to open the file\nwith O_CLOEXEC), but that flag causes MSVCRT.DLL to return an error. So\nwhen adb_auth_host.cpp goes to read or write the adbkey files, it fails.\n\nThe quick fix is to not use the \"e\" option on adb host code since it\nisn\u0027t necessary there, compared to adbd.\n\nAn alternative fix would be to have a fopen() wrapper on Windows that\nfilters out the \"e\" option.\n\nChange-Id: I7d8ba2847dab0ed558ffe156e79093251eb253c9\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "7dc759fb0c860d8e8cf44375556ed1c9089b52e8",
      "tree": "041eddea8f29e048bef67e7da2a884c60c9495ed",
      "parents": [
        "a8c34142be062033dfa930a4afcc0e2d2bd9013f"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed May 06 16:13:42 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed May 06 18:54:08 2015 -0700"
      },
      "message": "adb: win32: fix adb emu command\n\nThe adb emu command was never working because the socket connection to\nthe emulator was closed without reading all of the data that the\nemulator sent. On Windows, this caused the emulator\u0027s recv() call to\nerror-out, so it never got the command that was sent.\n\nBefore settling on this fix, I also experimented changing the arguments\nto the socket shutdown() call and that didn\u0027t seem to help. I also tried\nremoving the call to shutdown() and that didn\u0027t help. So that should\nrule out shutdown() as the problem. One experiment that helped was\ndelaying before calling adb_close(), but that is of course fragile and\ndoesn\u0027t address the real issue, which is not closing the socket until\nthe commands have been read.\n\nhttps://code.google.com/p/android/issues/detail?id\u003d21021\n\nChange-Id: I8fa4d740a2faa2c9922ec50792e16564a94f6eed\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "fb2ba514edb9ae9a086daef54aa7a61708595442",
      "tree": "0e5ac03f0144b548c0938e3599fd8b8573b41394",
      "parents": [
        "949f2620c7ae33742ad639cf893c007204dc2074"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 24 23:02:00 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Apr 27 19:42:20 2015 -0700"
      },
      "message": "Remove strtok from adb.\n\nAlso fix android::base::Split to behave like Java, Python, and google3.\n\nChange-Id: Ifbffd4e92950a79e7aea5d153c95fe0980648417\n"
    },
    {
      "commit": "db6fe6428c1ca5f397d3853f2b96c3e3e878b172",
      "tree": "7c788a60093d22977baee6c6625107abf40b66e3",
      "parents": [
        "0e0ce0662e948b9cfb1b42e48f18d3c4643b6c1e"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Mar 19 15:21:08 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Mar 19 15:32:33 2015 -0700"
      },
      "message": "File header cleanup.\n\n * sysdeps.h should always be included first.\n * TRACE_TAG needs to be defined before anything is included.\n * Some files were missing copyright headers.\n * Save precious bytes on my SSD by removing useless whitespace.\n\nChange-Id: I88980e6e00b5be1093806cf286740d9e4a033b94\n"
    },
    {
      "commit": "f30d73c74d85ccc2b1f55d6946f616e62d67e48e",
      "tree": "b2302299d3d083ba83949a80213b92d66540201f",
      "parents": [
        "b5f43a12723896c2d8fc98eed5abce563a16f56b"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Feb 25 17:51:28 2015 -0800"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Mar 09 14:06:11 2015 -0700"
      },
      "message": "Move adb to C++.\n\nI keep trying to clean things up and needing std::strings. Might as\nwell just do this now.\n\nusb_linux_client.c is going to stay as C because GCC isn\u0027t smart\nenough to deal with the designated initializers it uses (though for\nsome reason it is in C mode).\n\nThe Darwin files are staying as C because I don\u0027t have a way to test\nthat they build.\n\nThe Windows files are staying as C because while I can actually build\nfor them, it\u0027s slow and painful.\n\nChange-Id: I75367d29205a9049d34460032b3bb36384f43941\n"
    },
    {
      "commit": "b5f43a12723896c2d8fc98eed5abce563a16f56b",
      "tree": "f81933396150903b8b0d0fa38e9faa081376253a",
      "parents": [],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Mar 09 20:29:02 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Mar 09 20:29:07 2015 +0000"
      },
      "message": "Merge \"Fix a writex transcription error.\""
    }
  ]
}
