<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Category1 on opoojkk</title><link>https://opoojkk.com/categories/category1/</link><description>Recent content in Category1 on opoojkk</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 30 Jul 2026 07:52:51 +0800</lastBuildDate><atom:link href="https://opoojkk.com/categories/category1/index.xml" rel="self" type="application/rss+xml"/><item><title>20260730</title><link>https://opoojkk.com/content/posts/20260730/</link><pubDate>Thu, 30 Jul 2026 07:52:51 +0800</pubDate><guid>https://opoojkk.com/content/posts/20260730/</guid><description/></item><item><title>ADB protocol</title><link>https://opoojkk.com/posts/2025/01/04/adb-protocol/</link><pubDate>Sat, 04 Jan 2025 09:10:44 +0800</pubDate><guid>https://opoojkk.com/posts/2025/01/04/adb-protocol/</guid><description>&lt;h2 class="heading" id="说明">
 说明&lt;span class="heading__anchor"> &lt;a href="#%e8%af%b4%e6%98%8e">#&lt;/a>&lt;/span>
&lt;/h2>&lt;p>网上太多文章写ADB，不尽详细，大多一知半解，干脆找来官方文件。&lt;/p>
&lt;p>你最好按照下面的顺序阅读：&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://opoojkk.com/posts/2025/01/04/adb-overview/" title="OVERVIEW.txt">adb overview&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://opoojkk.com/posts/2025/01/04/adb-readme/" title="README.md">adb readme&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://opoojkk.com/posts/2025/01/04/adb-services/" title="SERVICES.txt">adb service&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://opoojkk.com/posts/2025/01/04/adb-protocol/" title="protocol.txt">adb protocol&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>三篇都是复制自AOSP13源码，无修改，请放心阅读。&lt;/p>
&lt;h2 class="heading" id="原文">
 原文&lt;span class="heading__anchor"> &lt;a href="#%e5%8e%9f%e6%96%87">#&lt;/a>&lt;/span>
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;span class="lnt">124
&lt;/span>&lt;span class="lnt">125
&lt;/span>&lt;span class="lnt">126
&lt;/span>&lt;span class="lnt">127
&lt;/span>&lt;span class="lnt">128
&lt;/span>&lt;span class="lnt">129
&lt;/span>&lt;span class="lnt">130
&lt;/span>&lt;span class="lnt">131
&lt;/span>&lt;span class="lnt">132
&lt;/span>&lt;span class="lnt">133
&lt;/span>&lt;span class="lnt">134
&lt;/span>&lt;span class="lnt">135
&lt;/span>&lt;span class="lnt">136
&lt;/span>&lt;span class="lnt">137
&lt;/span>&lt;span class="lnt">138
&lt;/span>&lt;span class="lnt">139
&lt;/span>&lt;span class="lnt">140
&lt;/span>&lt;span class="lnt">141
&lt;/span>&lt;span class="lnt">142
&lt;/span>&lt;span class="lnt">143
&lt;/span>&lt;span class="lnt">144
&lt;/span>&lt;span class="lnt">145
&lt;/span>&lt;span class="lnt">146
&lt;/span>&lt;span class="lnt">147
&lt;/span>&lt;span class="lnt">148
&lt;/span>&lt;span class="lnt">149
&lt;/span>&lt;span class="lnt">150
&lt;/span>&lt;span class="lnt">151
&lt;/span>&lt;span class="lnt">152
&lt;/span>&lt;span class="lnt">153
&lt;/span>&lt;span class="lnt">154
&lt;/span>&lt;span class="lnt">155
&lt;/span>&lt;span class="lnt">156
&lt;/span>&lt;span class="lnt">157
&lt;/span>&lt;span class="lnt">158
&lt;/span>&lt;span class="lnt">159
&lt;/span>&lt;span class="lnt">160
&lt;/span>&lt;span class="lnt">161
&lt;/span>&lt;span class="lnt">162
&lt;/span>&lt;span class="lnt">163
&lt;/span>&lt;span class="lnt">164
&lt;/span>&lt;span class="lnt">165
&lt;/span>&lt;span class="lnt">166
&lt;/span>&lt;span class="lnt">167
&lt;/span>&lt;span class="lnt">168
&lt;/span>&lt;span class="lnt">169
&lt;/span>&lt;span class="lnt">170
&lt;/span>&lt;span class="lnt">171
&lt;/span>&lt;span class="lnt">172
&lt;/span>&lt;span class="lnt">173
&lt;/span>&lt;span class="lnt">174
&lt;/span>&lt;span class="lnt">175
&lt;/span>&lt;span class="lnt">176
&lt;/span>&lt;span class="lnt">177
&lt;/span>&lt;span class="lnt">178
&lt;/span>&lt;span class="lnt">179
&lt;/span>&lt;span class="lnt">180
&lt;/span>&lt;span class="lnt">181
&lt;/span>&lt;span class="lnt">182
&lt;/span>&lt;span class="lnt">183
&lt;/span>&lt;span class="lnt">184
&lt;/span>&lt;span class="lnt">185
&lt;/span>&lt;span class="lnt">186
&lt;/span>&lt;span class="lnt">187
&lt;/span>&lt;span class="lnt">188
&lt;/span>&lt;span class="lnt">189
&lt;/span>&lt;span class="lnt">190
&lt;/span>&lt;span class="lnt">191
&lt;/span>&lt;span class="lnt">192
&lt;/span>&lt;span class="lnt">193
&lt;/span>&lt;span class="lnt">194
&lt;/span>&lt;span class="lnt">195
&lt;/span>&lt;span class="lnt">196
&lt;/span>&lt;span class="lnt">197
&lt;/span>&lt;span class="lnt">198
&lt;/span>&lt;span class="lnt">199
&lt;/span>&lt;span class="lnt">200
&lt;/span>&lt;span class="lnt">201
&lt;/span>&lt;span class="lnt">202
&lt;/span>&lt;span class="lnt">203
&lt;/span>&lt;span class="lnt">204
&lt;/span>&lt;span class="lnt">205
&lt;/span>&lt;span class="lnt">206
&lt;/span>&lt;span class="lnt">207
&lt;/span>&lt;span class="lnt">208
&lt;/span>&lt;span class="lnt">209
&lt;/span>&lt;span class="lnt">210
&lt;/span>&lt;span class="lnt">211
&lt;/span>&lt;span class="lnt">212
&lt;/span>&lt;span class="lnt">213
&lt;/span>&lt;span class="lnt">214
&lt;/span>&lt;span class="lnt">215
&lt;/span>&lt;span class="lnt">216
&lt;/span>&lt;span class="lnt">217
&lt;/span>&lt;span class="lnt">218
&lt;/span>&lt;span class="lnt">219
&lt;/span>&lt;span class="lnt">220
&lt;/span>&lt;span class="lnt">221
&lt;/span>&lt;span class="lnt">222
&lt;/span>&lt;span class="lnt">223
&lt;/span>&lt;span class="lnt">224
&lt;/span>&lt;span class="lnt">225
&lt;/span>&lt;span class="lnt">226
&lt;/span>&lt;span class="lnt">227
&lt;/span>&lt;span class="lnt">228
&lt;/span>&lt;span class="lnt">229
&lt;/span>&lt;span class="lnt">230
&lt;/span>&lt;span class="lnt">231
&lt;/span>&lt;span class="lnt">232
&lt;/span>&lt;span class="lnt">233
&lt;/span>&lt;span class="lnt">234
&lt;/span>&lt;span class="lnt">235
&lt;/span>&lt;span class="lnt">236
&lt;/span>&lt;span class="lnt">237
&lt;/span>&lt;span class="lnt">238
&lt;/span>&lt;span class="lnt">239
&lt;/span>&lt;span class="lnt">240
&lt;/span>&lt;span class="lnt">241
&lt;/span>&lt;span class="lnt">242
&lt;/span>&lt;span class="lnt">243
&lt;/span>&lt;span class="lnt">244
&lt;/span>&lt;span class="lnt">245
&lt;/span>&lt;span class="lnt">246
&lt;/span>&lt;span class="lnt">247
&lt;/span>&lt;span class="lnt">248
&lt;/span>&lt;span class="lnt">249
&lt;/span>&lt;span class="lnt">250
&lt;/span>&lt;span class="lnt">251
&lt;/span>&lt;span class="lnt">252
&lt;/span>&lt;span class="lnt">253
&lt;/span>&lt;span class="lnt">254
&lt;/span>&lt;span class="lnt">255
&lt;/span>&lt;span class="lnt">256
&lt;/span>&lt;span class="lnt">257
&lt;/span>&lt;span class="lnt">258
&lt;/span>&lt;span class="lnt">259
&lt;/span>&lt;span class="lnt">260
&lt;/span>&lt;span class="lnt">261
&lt;/span>&lt;span class="lnt">262
&lt;/span>&lt;span class="lnt">263
&lt;/span>&lt;span class="lnt">264
&lt;/span>&lt;span class="lnt">265
&lt;/span>&lt;span class="lnt">266
&lt;/span>&lt;span class="lnt">267
&lt;/span>&lt;span class="lnt">268
&lt;/span>&lt;span class="lnt">269
&lt;/span>&lt;span class="lnt">270
&lt;/span>&lt;span class="lnt">271
&lt;/span>&lt;span class="lnt">272
&lt;/span>&lt;span class="lnt">273
&lt;/span>&lt;span class="lnt">274
&lt;/span>&lt;span class="lnt">275
&lt;/span>&lt;span class="lnt">276
&lt;/span>&lt;span class="lnt">277
&lt;/span>&lt;span class="lnt">278
&lt;/span>&lt;span class="lnt">279
&lt;/span>&lt;span class="lnt">280
&lt;/span>&lt;span class="lnt">281
&lt;/span>&lt;span class="lnt">282
&lt;/span>&lt;span class="lnt">283
&lt;/span>&lt;span class="lnt">284
&lt;/span>&lt;span class="lnt">285
&lt;/span>&lt;span class="lnt">286
&lt;/span>&lt;span class="lnt">287
&lt;/span>&lt;span class="lnt">288
&lt;/span>&lt;span class="lnt">289
&lt;/span>&lt;span class="lnt">290
&lt;/span>&lt;span class="lnt">291
&lt;/span>&lt;span class="lnt">292
&lt;/span>&lt;span class="lnt">293
&lt;/span>&lt;span class="lnt">294
&lt;/span>&lt;span class="lnt">295
&lt;/span>&lt;span class="lnt">296
&lt;/span>&lt;span class="lnt">297
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">--- a replacement for aproto -------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When it comes down to it, aproto&amp;#39;s primary purpose is to forward
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">various streams between the host computer and client device (in either
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">direction).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">This replacement further simplifies the concept, reducing the protocol
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">to an extremely straightforward model optimized to accomplish the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">forwarding of these streams and removing additional state or
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">complexity.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The host side becomes a simple comms bridge with no &amp;#34;UI&amp;#34;, which will 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">be used by either commandline or interactive tools to communicate with 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">a device or emulator that is connected to the bridge.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The protocol is designed to be straightforward and well-defined enough 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">that if it needs to be reimplemented in another environment (Java 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">perhaps), there should not problems ensuring perfect interoperability.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The protocol discards the layering aproto has and should allow the 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">implementation to be much more robust.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- protocol overview and basics ---------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The transport layer deals in &amp;#34;messages&amp;#34;, which consist of a 24 byte
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">header followed (optionally) by a payload. The header consists of 6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">32 bit words which are sent across the wire in little endian format.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">struct message {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> unsigned command; /* command identifier constant (A_CNXN, ...) */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> unsigned arg0; /* first argument */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> unsigned arg1; /* second argument */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> unsigned data_length; /* length of payload (0 is allowed) */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> unsigned data_crc32; /* crc32 of data payload */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> unsigned magic; /* command ^ 0xffffffff */
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">};
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Receipt of an invalid message header, corrupt message payload, or an
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">unrecognized command MUST result in the closing of the remote
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">connection. The protocol depends on shared state and any break in the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">message stream will result in state getting out of sync.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The following sections describe the six defined message types in
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">detail. Their format is COMMAND(arg0, arg1, payload) where the payload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">is represented by a quoted string or an empty string if none should be
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sent.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The identifiers &amp;#34;local-id&amp;#34; and &amp;#34;remote-id&amp;#34; are always relative to the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">*sender* of the message, so for a receiver, the meanings are effectively
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reversed.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- CONNECT(version, maxdata, &amp;#34;system-identity-string&amp;#34;) ----------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_CNXN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The CONNECT message establishes the presence of a remote system.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The version is used to ensure protocol compatibility and maxdata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">declares the maximum message body size that the remote system
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">is willing to accept.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Currently, version=0x01000000 and maxdata=256*1024. Older versions of adb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hard-coded maxdata=4096, so CONNECT and AUTH packets sent to a device must not
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">be larger than that because they&amp;#39;re sent before the CONNECT from the device
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">that tells the adb server what maxdata the device can support.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Both sides send a CONNECT message when the connection between them is
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">established. Until a CONNECT message is received no other messages may
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">be sent. Any messages received before a CONNECT message MUST be ignored.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">If a CONNECT message is received with an unknown version or insufficiently
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">large maxdata value, the connection with the other side must be closed.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The system identity string should be &amp;#34;&amp;lt;systemtype&amp;gt;:&amp;lt;serialno&amp;gt;:&amp;lt;banner&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">where systemtype is &amp;#34;bootloader&amp;#34;, &amp;#34;device&amp;#34;, or &amp;#34;host&amp;#34;, serialno is some
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kind of unique ID (or empty), and banner is a human-readable version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">or identifier string. The banner is used to transmit useful properties.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- STLS(type, version, &amp;#34;&amp;#34;) --------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_STLS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The TLS message informs the recipient that the connection will be encrypted
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">and will need to perform a TLS handshake. version is the current version of
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">the protocol.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- AUTH(type, 0, &amp;#34;data&amp;#34;) ----------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_AUTH
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The AUTH message informs the recipient that authentication is required to
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">connect to the sender. If type is TOKEN(1), data is a random token that
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">the recipient can sign with a private key. The recipient replies with an
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AUTH packet where type is SIGNATURE(2) and data is the signature. If the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">signature verification succeeds, the sender replies with a CONNECT packet.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">If the signature verification fails, the sender replies with a new AUTH
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">packet and a new random token, so that the recipient can retry signing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">with a different private key.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Once the recipient has tried all its private keys, it can reply with an
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AUTH packet where type is RSAPUBLICKEY(3) and data is the public key. If
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">possible, an on-screen confirmation may be displayed for the user to
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">confirm they want to install the public key on the device.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- OPEN(local-id, 0, &amp;#34;destination&amp;#34;) -----------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_OPEN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The OPEN message informs the recipient that the sender has a stream
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">identified by local-id that it wishes to connect to the named
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">destination in the message payload. The local-id may not be zero.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The OPEN message MUST result in either a READY message indicating that
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">the connection has been established (and identifying the other end) or
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">a CLOSE message, indicating failure. An OPEN message also implies
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">a READY message sent at the same time.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Common destination naming conventions include:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;tcp:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;#34; - host may be omitted to indicate localhost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;udp:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;#34; - host may be omitted to indicate localhost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;vsock:&amp;lt;CID&amp;gt;:&amp;lt;port&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;local-dgram:&amp;lt;identifier&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;local-stream:&amp;lt;identifier&amp;gt;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;shell&amp;#34; - local shell service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;upload&amp;#34; - service for pushing files across (like aproto&amp;#39;s /sync)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* &amp;#34;fs-bridge&amp;#34; - FUSE protocol filesystem bridge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- READY(local-id, remote-id, &amp;#34;&amp;#34;) -------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_OKAY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The READY message informs the recipient that the sender&amp;#39;s stream
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">identified by local-id is ready for write messages and that it is
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">connected to the recipient&amp;#39;s stream identified by remote-id.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Neither the local-id nor the remote-id may be zero.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A READY message containing a remote-id which does not map to an open
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stream on the recipient&amp;#39;s side is ignored. The stream may have been
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">closed while this message was in-flight.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The local-id is ignored on all but the first READY message (where it
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">is used to establish the connection). Nonetheless, the local-id MUST
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">not change on later READY messages sent to the same stream.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- WRITE(local-id, remote-id, &amp;#34;data&amp;#34;) ---------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_WRTE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The WRITE message sends data to the recipient&amp;#39;s stream identified by
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote-id. The payload MUST be &amp;lt;= maxdata in length.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A WRITE message containing a remote-id which does not map to an open
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stream on the recipient&amp;#39;s side is ignored. The stream may have been
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">closed while this message was in-flight.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A WRITE message may not be sent until a READY message is received.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Once a WRITE message is sent, an additional WRITE message may not be
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sent until another READY message has been received. Recipients of
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">a WRITE message that is in violation of this requirement will CLOSE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">the connection.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- CLOSE(local-id, remote-id, &amp;#34;&amp;#34;) -------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_CLSE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The CLOSE message informs recipient that the connection between the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sender&amp;#39;s stream (local-id) and the recipient&amp;#39;s stream (remote-id) is
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">broken. The remote-id MUST not be zero, but the local-id MAY be zero
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">if this CLOSE indicates a failed OPEN.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A CLOSE message containing a remote-id which does not map to an open
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stream on the recipient&amp;#39;s side is ignored. The stream may have
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">already been closed by the recipient while this message was in-flight.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The recipient should not respond to a CLOSE message in any way. The
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">recipient should cancel pending WRITEs or CLOSEs, but this is not a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">requirement, since they will be ignored.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- SYNC(online, sequence, &amp;#34;&amp;#34;) -----------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Command constant: A_SYNC
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">*** obsolete, no longer used ***
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The SYNC message was used by the io pump to make sure that stale
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">outbound messages are discarded when the connection to the remote side
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">is broken. It was only used internally to the bridge and never valid
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">to send across the wire.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* when the connection to the remote side goes offline, the io pump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sends a SYNC(0, 0) and starts discarding all messages
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* when the connection to the remote side is established, the io pump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sends a SYNC(1, token) and continues to discard messages
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">* when the io pump receives a matching SYNC(1, token), it once again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> starts accepting messages to forward to the remote side
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- message command constants ------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_SYNC 0x434e5953
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_CNXN 0x4e584e43
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_AUTH 0x48545541
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_OPEN 0x4e45504f
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_OKAY 0x59414b4f
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_CLSE 0x45534c43
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_WRTE 0x45545257
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">#define A_STLS 0x534C5453
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- implementation details ---------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The core of the bridge program will use three threads. One thread
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">will be a select/epoll loop to handle io between various inbound and
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">outbound connections and the connection to the remote side.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The remote side connection will be implemented as two threads (one for
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reading, one for writing) and a datagram socketpair to provide the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">channel between the main select/epoll thread and the remote connection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">threadpair. The reason for this is that for usb connections, the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kernel interface on linux and osx does not allow you to do meaningful
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nonblocking IO.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The endian swapping for the message headers will happen (as needed) in
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">the remote connection threadpair and that the rest of the program will
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">always treat message header values as native-endian.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The bridge program will be able to have a number of mini-servers
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">compiled in. They will be published under known names (examples
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;shell&amp;#34;, &amp;#34;fs-bridge&amp;#34;, etc) and upon receiving an OPEN() to such a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service, the bridge program will create a stream socketpair and spawn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">a thread or subprocess to handle the io.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- simplified / embedded implementation -------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">For limited environments, like the bootloader, it is allowable to
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">support a smaller, fixed number of channels using pre-assigned channel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ID numbers such that only one stream may be connected to a bootloader
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">endpoint at any given time. The protocol remains unchanged, but the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;embedded&amp;#34; version of it is less dynamic.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The bootloader will support two streams. A &amp;#34;bootloader:debug&amp;#34; stream,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">which may be opened to get debug messages from the bootloader and a 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;bootloader:control&amp;#34;, stream which will support the set of basic 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bootloader commands.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Example command stream dialogues: 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;flash_kernel,2515049,........\n&amp;#34; &amp;#34;okay\n&amp;#34; 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;flash_ramdisk,5038,........\n&amp;#34; &amp;#34;fail,flash write error\n&amp;#34; 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;bogus_command......&amp;#34; &amp;lt;CLOSE&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- future expansion ---------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">I plan on providing either a message or a special control stream so that
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">the client device could ask the host computer to setup inbound socket
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">translations on the fly on behalf of the client device.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The initial design does handshaking to provide flow control, with a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">message flow that looks like:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;gt;OPEN &amp;lt;READY &amp;gt;WRITE &amp;lt;READY &amp;gt;WRITE &amp;lt;READY &amp;gt;WRITE &amp;lt;CLOSE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The far side may choose to issue the READY message as soon as it receives
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">a WRITE or it may defer the READY until the write to the local stream
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">succeeds. A future version may want to do some level of windowing where
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">multiple WRITEs may be sent without requiring individual READY acks.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--- smartsockets -------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Port 5037 is used for smart sockets which allow a client on the host
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">side to request access to a service in the host adb daemon or in the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remote (device) daemon. The service is requested by ascii name,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">preceeded by a 4 digit hex length. Upon successful connection an
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;OKAY&amp;#34; response is sent, otherwise a &amp;#34;FAIL&amp;#34; message is returned. Once
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">connected the client is talking to that (remote or local) service.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">client: &amp;lt;hex4&amp;gt; &amp;lt;service-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">server: &amp;#34;OKAY&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">client: &amp;lt;hex4&amp;gt; &amp;lt;service-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">server: &amp;#34;FAIL&amp;#34; &amp;lt;hex4&amp;gt; &amp;lt;reason&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item></channel></rss>