日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android源码分析--MediaServer源码分析(二)

發布時間:2025/3/15 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android源码分析--MediaServer源码分析(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上一篇博客中Android源碼分析–MediaServer源碼分析(一),我們知道了ProcessState和defaultServiceManager,在分析源碼的過程中,我們被Android的Binder通信機制中的各種復雜的類關系搞的眼花繚亂,接下來我們就以MediaPlayerService為例來分析一下Binder的通信機制。首先來回顧一下:

  • BpBinder和BBinder都是Android中Binder通信的代表類,其中BpBinder是客戶端用來與Server交互的代理類,p代表的就是proxy,而BBinder則是交互的目的端;
  • BpBinder和BBinder是相互對應的,Binder系統會通過handle來標識對應的BBinder。

Android的通信機制基本上可以看做是Client、Server和ServiceManager三者之間的交互:

  • Server首先要注冊一些Service到ServiceManager;
  • 如果某個Client要使用Service,則首先到ServiceManager中獲得該Service的相關信息;
  • Client得到Service信息,然后和該Service所在的Server進程建立通信之后使用Service。

注冊MediaPlayerService

我們知道若要使用一個Service的話首先要進行注冊,所有首先讓我們來看看MediaService是如何注冊的,文件位置:frameworks\base\media\libmediaplayerservice\MediaPlayerService.cpp

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-reserved" style="box-sizing: border-box;">void</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">MediaPlayerService</span>::instantiate() {defaultServiceManager<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>-></span>addService(String16(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"media.player"</span>), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> MediaPlayerService()); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

defaultServiceManager返回的其實是一個BpServiceManager對象,在這里我看到了注冊的函數addService:

<code class="hljs haskell has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> virtual status_t addService(const <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">String16</span>& name, const sp<<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">IBinder</span>>& service){<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Parcel</span> <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>, reply;</span>//將<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Descriptor</span>作為令牌<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>.writeInterfaceToken<span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">IServiceManager</span>::<span class="hljs-title" style="box-sizing: border-box;">getInterfaceDescriptor</span>()</span>);</span><span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>.writeString16<span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-title" style="box-sizing: border-box;">name</span>)</span>;</span><span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>.writeStrongBinder<span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-title" style="box-sizing: border-box;">service</span>)</span>;</span>status_t err = remote()->transact(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">ADD_SERVICE_TRANSACTION</span>, <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>, &reply);</span>return err == <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">NO_ERROR</span> ? reply.readExceptionCode() : err; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

Parcel類可以看作一個數據塊,在該類的內部主要封裝了一些數據操作的方法。在寫入數據之后remote()->transact方法,remote()方法返回的值是mRemote,在上一篇中我們知道它是一個BpBinder對象,之后我們的通信工作就交由了BpBinder的transact方法:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">status_t BpBinder<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::transact</span>(uint32_t code, const Parcel<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>, Parcel<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> reply, uint32_t flags) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Binder一旦死去將永遠不能復活.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (mAlive) {status_t status <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> IPCThreadState<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::self</span>()<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>transact(mHandle, code, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>, reply, flags);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (status <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> DEAD_OBJECT) mAlive <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> status;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> DEAD_OBJECT; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

BpBinder完全將工作交給了IPCThreadState,接下來的任務也全部轉移到了IPCThreadState類中。

IPCThreadState類分析

IPCThreadState也是以單例模式設計的。由于每個進程只維護了一個ProcessState實例,同時ProcessState只啟動一個 Pool thread,也就是說每一個進程只會啟動一個Pool thread,因此每個進程則只需要一個IPCThreadState即可。首先讓我們來看看這個self方法,文件位置:frameworks\base\libs\binder\IPCThreadState.cpp

<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">IPCThreadState* IPCThreadState::<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span>() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (gHaveTLS) { restart:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> pthread_key_t k = gTLS;IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (st) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> st;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> IPCThreadState;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (gShutdown) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>;pthread_mutex_lock(&gTLSMutex);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!gHaveTLS) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (pthread_key_create(&gTLS, threadDestructor) != <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {pthread_mutex_unlock(&gTLSMutex);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>;}gHaveTLS = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>;}pthread_mutex_unlock(&gTLSMutex);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> restart; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

TLS是Thread Local Storage的縮寫,表示線程本地存儲,類似于Java中的ThreadLocal機制)pthread_getspecific和)pthread_setspecific方法分別提供了設置變量和獲取變量的方法。

在這里我們看到了get方法,有get方法就一定有對應的set方法,set的設置就在構造函數中:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-label" style="box-sizing: border-box;">IPCThreadState:</span>:IPCThreadState(): mProcess(ProcessState::self()),mMyThreadId(androidGetTid()),mStrictModePolicy(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>),mLastTransactionBinderFlags(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {pthread_setspecific(gTLS, this)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>clearCaller()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>mIn<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setDataCapacity</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>mOut<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setDataCapacity</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

可以看到在構造函數中IPCThreadState將自身和線程本地存儲關聯起來了,在每一個IPCThreadState中都存在一個mIn和mOut,mIn用來存儲接收Binder的數據,mOut用來存儲發送到Binder的數據。

接下來看看transact方法:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">status_t IPCThreadState<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::transact</span>(int32_t <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">handle</span>,uint32_t code, const Parcel<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>,Parcel<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> reply, uint32_t flags) {status_t err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>errorCheck();flags <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">|=</span> TF_ACCEPT_FDS;<span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> NO_ERROR) {<span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span>err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> writeTransactionData(BC_TRANSACTION, flags, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">handle</span>, code, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NULL</span>);} <span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (reply) {err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> waitForResponse(reply);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {Parcel fakeReply;err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> waitForResponse(<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span>fakeReply);}<span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span>} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> waitForResponse(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NULL</span>, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NULL</span>);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> err; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>

在這里省略了一些打印輸出信息的語句,在這里我們可以清楚的看到通信的流程:先寫入數據,然后等待接收數據。

如何進行通信

在前面我們知道了通信的流程,首先寫入數據,之后等待回應,那么我們的通信就是這樣不斷的讀寫數據嗎?接下來我們來一下看一下這兩個讀寫的函數:?
1.寫入數據:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">status_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags,int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer) {binder_transaction_data tr<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.target</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.handle</span> = handle<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.code</span> = code<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.flags</span> = binderFlags<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cookie</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sender</span>_pid = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sender</span>_euid = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>const status_t err = data<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.errorCheck</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>if (err == NO_ERROR) {tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.data</span>_size = data<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ipcDataSize</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.data</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ptr</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.buffer</span> = data<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ipcData</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.offsets</span>_size = data<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ipcObjectsCount</span>()*sizeof(size_t)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.data</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ptr</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.offsets</span> = data<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ipcObjects</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>} else if (statusBuffer) {tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.flags</span> |= TF_STATUS_CODE<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>*statusBuffer = err<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.data</span>_size = sizeof(status_t)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.data</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ptr</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.buffer</span> = statusBuffer<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.offsets</span>_size = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>tr<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.data</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ptr</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.offsets</span> = NULL<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>} else {return (mLastError = err)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>}mOut<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.writeInt</span>32(cmd)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>mOut<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.write</span>(&tr, sizeof(tr))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>return NO_ERROR<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul>

在寫入數據之前,我們首先對BpBinder進行了標識,在這里我們看到了之前所說的handle值,這樣印證了之前一篇博客中所說的BBinder和BpBinder是由handle值來相互標識的。

2.等待回應:

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) {int32_t cmd;int32_t err;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//talkWithDriver重要函數之一,負責從Binder中讀寫數據</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((err=talkWithDriver()) < NO_ERROR) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;err = mIn.errorCheck();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (err < NO_ERROR) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (mIn.dataAvail() == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">continue</span>;cmd = mIn.readInt32();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> (cmd) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_TRANSACTION_COMPLETE:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//發送完一個數據包后,可以收到該消息做為成功發送的反饋。</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!reply && !acquireResult) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> finish;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_DEAD_REPLY:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//交互過程中如果發現對方進程或線程已經死亡</span>err = DEAD_OBJECT;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> finish;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_FAILED_REPLY:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//發送失敗</span>err = FAILED_TRANSACTION;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> finish;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_ACQUIRE_RESULT:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲得結果</span>{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> int32_t result = mIn.readInt32();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!acquireResult) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">continue</span>;*acquireResult = result ? NO_ERROR : INVALID_OPERATION;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> finish;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_REPLY:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//當前接收的數據是回復</span>{binder_transaction_data tr;err = mIn.read(&tr, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(tr));ALOG_ASSERT(err == NO_ERROR, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Not enough command data for brREPLY"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (err != NO_ERROR) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> finish;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (reply) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((tr.flags & TF_STATUS_CODE) == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {reply->ipcSetDataReference(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> uint8_t*>(tr.data.ptr.buffer),tr.data_size,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> size_t*>(tr.data.ptr.offsets),tr.offsets_size/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(size_t),freeBuffer, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {err = *<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> status_t*>(tr.data.ptr.buffer);freeBuffer(NULL,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> uint8_t*>(tr.data.ptr.buffer),tr.data_size,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> size_t*>(tr.data.ptr.offsets),tr.offsets_size/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(size_t), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);}} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {freeBuffer(NULL,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> uint8_t*>(tr.data.ptr.buffer),tr.data_size,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> size_t*>(tr.data.ptr.offsets),tr.offsets_size/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(size_t), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">continue</span>;}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> finish;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//第二個重要函數,處理命令</span>err = executeCommand(cmd);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (err != NO_ERROR) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">goto</span> finish;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;}}finish:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (err != NO_ERROR) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (acquireResult) *acquireResult = err;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (reply) reply->setError(err);mLastError = err;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> err; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li></ul>

可以看到我們首先從Binder中讀寫數據,之后執行命令并返回結果狀態碼。

兩個重要函數

IPCThreadState有兩個重要的函數,talkWithDriver函數負責從Binder讀寫數據,executeCommand函數負責解析并執行mIn中的數據。?
1.talkWithDriver:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">status_t IPCThreadState<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::talkWithDriver</span>(bool doReceive) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//用來和Binder交換數據的結構</span>binder_write_read bwr;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 判斷數據是否為空</span>const bool needRead <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">mIn</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>dataPosition() <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">>=</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">mIn</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>dataSize();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 如果caller已經請求讀取下一行數據,或緩沖區中有數據沒讀完的時候我們不會進行任何寫操作</span>const size_t outAvail <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!</span>doReceive <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">||</span> needRead) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">?</span> mOut<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>dataSize() : <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//填充請求命令</span>bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>write_size <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> outAvail;bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>write_buffer <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (long unsigned int)mOut<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (doReceive <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&&</span> needRead) {bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_size <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">mIn</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>dataCapacity();bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_buffer <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (long unsigned int)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">mIn</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//mIn用來存儲接收的Binder數據</span>} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_size <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_buffer <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;} <span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 如果不需要任何操作了立即返回.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>write_size <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&&</span> (bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_size <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> NO_ERROR;bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>write_consumed <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_consumed <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;status_t err;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">do</span> { <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">#if</span> defined(HAVE_ANDROID_OS) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ioctl方式進行通信</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (ioctl(mProcess<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>mDriverFD, BINDER_WRITE_READ, <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span>bwr) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">>=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> NO_ERROR;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-errno</span>; <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">#else</span>err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> INVALID_OPERATION; <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">#endif</span>} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> <span class="hljs-attribute" style="box-sizing: border-box;">-EINTR</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (err <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">>=</span> NO_ERROR) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>write_consumed <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>write_consumed <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span> (ssize_t)mOut<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>dataSize())mOut<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>remove(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>write_consumed);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>mOut<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>setDataSize(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_consumed <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">mIn</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>setDataSize(bwr<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>read_consumed);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">mIn</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>setDataPosition(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> NO_ERROR;} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> err; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li></ul>

可以看到我們的Binder通信并不是采用的讀寫方式,而是ioctl方式,什么是ioctl方式呢?

ioctl是設備驅動程序中對設備的I/O通道進行管理的函數。所謂對I/O通道進行管理,就是對設備的一些特性進行控制,例如串口的傳輸波特率、馬達的 轉速等等。它的調用函數如下:int ioctl(int fd, ind cmd, …);其中fd就是用戶程序打開設備時使用open函數返回的文件標示符,cmd就是用戶程序對設備的控制命令。

2.executeCommand函數:

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">status_t IPCThreadState::executeCommand(int32_t cmd) {BBinder* obj;RefBase::weakref_type* refs;status_t result = NO_ERROR;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> (cmd) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_ERROR:result = mIn.readInt32();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_OK:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_ACQUIRE:refs = (RefBase::weakref_type*)mIn.readInt32();obj = (BBinder*)mIn.readInt32();obj->incStrong(mProcess.get()); mOut.writeInt32(BC_ACQUIRE_DONE);mOut.writeInt32((int32_t)refs);mOut.writeInt32((int32_t)obj);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_RELEASE:refs = (RefBase::weakref_type*)mIn.readInt32();obj = (BBinder*)mIn.readInt32();mPendingStrongDerefs.push(obj);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_INCREFS:refs = (RefBase::weakref_type*)mIn.readInt32();obj = (BBinder*)mIn.readInt32();refs->incWeak(mProcess.get());mOut.writeInt32(BC_INCREFS_DONE);mOut.writeInt32((int32_t)refs);mOut.writeInt32((int32_t)obj);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_DECREFS:refs = (RefBase::weakref_type*)mIn.readInt32();obj = (BBinder*)mIn.readInt32();mPendingWeakDerefs.push(refs);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_ATTEMPT_ACQUIRE:refs = (RefBase::weakref_type*)mIn.readInt32();obj = (BBinder*)mIn.readInt32();{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> success = refs->attemptIncStrong(mProcess.get());mOut.writeInt32(BC_ACQUIRE_RESULT);mOut.writeInt32((int32_t)success);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_TRANSACTION:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//當前接收的數據是請求</span>{binder_transaction_data tr;result = mIn.read(&tr, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(tr));<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (result != NO_ERROR) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;Parcel buffer;buffer.ipcSetDataReference(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> uint8_t*>(tr.data.ptr.buffer),tr.data_size,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">reinterpret_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> size_t*>(tr.data.ptr.offsets),tr.offsets_size/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(size_t), freeBuffer, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> pid_t origPid = mCallingPid;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> uid_t origUid = mCallingUid;mCallingPid = tr.sender_pid;mCallingUid = tr.sender_euid;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> curPrio = getpriority(PRIO_PROCESS, mMyThreadId);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (gDisableBackgroundScheduling) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (curPrio > ANDROID_PRIORITY_NORMAL) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//我們已經從caller實現了一個減小的優先級,但我們不希望它以這</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//種狀態運行在進程中。驅動已經設置了優先級,所以在開始事務</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//前首先將他設置為默認 </span>setpriority(PRIO_PROCESS, mMyThreadId, ANDROID_PRIORITY_NORMAL);}} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (curPrio >= ANDROID_PRIORITY_BACKGROUND) {androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_BG_NONINTERACT);}}Parcel reply;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (tr.target.ptr) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//在這里我們看到了BBinder,還記得嗎,BBinder和BpBinder相對應,</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//是交互的目的端</span>sp<BBinder> b((BBinder*)tr.cookie);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//在transact函數中調用了onTransact方法向reply寫入數據</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> status_t error = b->transact(tr.code, buffer, &reply, tr.flags);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (error < NO_ERROR) reply.setError(error);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> status_t error = the_context_object->transact(tr.code, buffer, &reply, tr.flags);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (error < NO_ERROR) reply.setError(error);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((tr.flags & TF_ONE_WAY) == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {sendReply(reply, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);} mCallingPid = origPid;mCallingUid = origUid; }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_DEAD_BINDER:{BpBinder *proxy = (BpBinder*)mIn.readInt32();proxy->sendObituary();mOut.writeInt32(BC_DEAD_BINDER_DONE);mOut.writeInt32((int32_t)proxy);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_CLEAR_DEATH_NOTIFICATION_DONE:{BpBinder *proxy = (BpBinder*)mIn.readInt32();proxy->getWeakRefs()->decWeak(proxy);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_FINISHED:result = TIMED_OUT;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_NOOP:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BR_SPAWN_LOOPER:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//用于接收方線程池管理。當驅動發現接收方所有線程都處于忙碌狀態且線</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//程池里的線程總數沒有超過BINDER_SET_MAX_THREADS設置的最大線程數 </span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//時,向接收方發送該命令要求創建更多線程以備接收數據。</span>mProcess->spawnPooledThread(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"*** BAD COMMAND %d received from Binder driver\n"</span>, cmd);result = UNKNOWN_ERROR;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (result != NO_ERROR) {mLastError = result;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> result; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li></ul>

在這里我們主要分析一下接收數據請求的情況:在這里我們看到了BBinder對象,并調用了它的transact函數,其實在內部調用了onTransact函數,而這個函數在BBinder中只是定義了兩種code之下的操作,大部分的情況是由它的子類完成。還記得上一篇中那個類的關系圖嗎:BBinder的直接子類是BnInterface,而這是一個接口類,所以所有的任務都落在了BnInterface的子類BnServiceManager中。

總結

看了這個類IPCThreadState,真的有點頭暈眼花,究其原因是:該類將代碼一部分給客戶端使用,一部分給服務端使用,所以有點雜亂。總結一下今天學到的IPCThreadState的工作:

  • 首先,通過線程本地存儲機制IPCThreadState將自身和線程本地存儲關聯起來;
  • 通過writeTransactionData將發生的數據存儲在mOut中;
  • waitForResponse調用了talkWithDriver從Binder設備中讀寫數據,在這里采用的是ioctl方式;
  • 調用executeCommand函數解析并執行mIn中的數據。
  • 原文地址:?http://blog.csdn.net/smbroe/article/details/44725143

    總結

    以上是生活随笔為你收集整理的Android源码分析--MediaServer源码分析(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久视频在线观看中文字幕 | 国产成人精品国内自产拍免费看 | 精品久久久久一区二区国产 | wwxxxx日本 | 在线观看日本高清mv视频 | 精品麻豆 | 天天拍夜夜拍 | 免费福利在线视频 | 亚洲精品videossex少妇 | 国内精品免费 | 色射爱| 国产手机视频在线观看 | 丝袜美腿av | 亚洲精品视频在线播放 | 中文字幕高清 | 久久精品中文字幕少妇 | 97精品欧美91久久久久久 | 天天爱天天色 | 亚洲高清在线观看视频 | 狠狠狠色丁香婷婷综合久久五月 | 亚洲一区二区视频在线播放 | 国产一区二区在线免费 | 久久国产精品色婷婷 | 日韩av一区二区三区四区 | 免费观看成年人视频 | 中文字幕在线观看的网站 | 欧美一级免费在线 | 欧美日韩免费观看一区=区三区 | 缴情综合网五月天 | 亚洲干视频在线观看 | 日韩激情影院 | 天天草天天操 | 精品国产三级a∨在线欧美 免费一级片在线观看 | a黄色大片 | 人人爱夜夜操 | 国产精品美女www爽爽爽视频 | 亚洲在线 | 国产资源在线免费观看 | 久久精品视频网址 | 天天干,天天射,天天操,天天摸 | 欧美精品久久人人躁人人爽 | 国产高清av | 久久久精品欧美一区二区免费 | 午夜精品一区二区三区在线观看 | 久久一久久 | 成人香蕉视频 | 欧美精品少妇xxxxx喷水 | 九色视频网站 | 看国产黄色大片 | 最近字幕在线观看第一季 | 四虎国产永久在线精品 | 中文字幕 国产 一区 | 天天操狠狠干 | 免费午夜在线视频 | 综合色中色 | 亚洲精品综合久久 | 四虎在线观看网址 | 婷婷激情五月 | 国产成人精品久久 | 日韩两性视频 | 少妇bbb搡bbbb搡bbbb | 久久线视频 | 亚洲美女在线一区 | 四虎影视成人永久免费观看亚洲欧美 | 最近免费在线观看 | av电影一区二区三区 | 九九热.com| 天天综合亚洲 | 日韩三级在线观看 | 亚洲国产精品一区二区尤物区 | 久精品在线 | 成人一级免费视频 | 精品在线一区二区三区 | 高清精品在线 | 99久久99久久免费精品蜜臀 | 国产精品夜夜夜一区二区三区尤 | 日韩av影视在线 | 婷婷伊人综合亚洲综合网 | 久久激情视频 | 四虎国产精品成人免费影视 | 日韩字幕在线观看 | 欧美日韩在线播放一区 | 欧美福利片在线观看 | free. 性欧美.com | 免费视频久久 | 精品国自产在线观看 | 欧美性色xo影院 | 亚洲国产精品第一区二区 | 一级黄色在线免费观看 | 国产精品欧美激情在线观看 | 国产福利a| 国产精品入口a级 | 免费欧美高清视频 | 欧美精品在线观看一区 | 国产成人一二三 | 这里只有精品视频在线观看 | 九九精品视频在线观看 | 国产成人精品一区一区一区 | 三级视频国产 | 免费成人黄色av | 日韩久久久久久久久 | 欧美日韩视频免费看 | 亚洲综合网站在线观看 | 亚洲精品国产日韩 | 国产一区二区三区免费在线观看 | 99精品免费久久久久久久久日本 | 日韩高清一二三区 | 日韩视频1| 国产一区二区精品91 | 成人毛片a | 日本在线观看中文字幕无线观看 | 亚洲在线视频网站 | 国产成人精品午夜在线播放 | 国产一区免费看 | 午夜美女av | 久草91视频| 国产精品第10页 | 波多野结衣电影一区二区 | 久久久久久久久综合 | a级黄色片视频 | 99久久精品免费看国产麻豆 | 人人干在线 | 国产精品高 | 五月天婷婷丁香花 | 亚洲日日夜夜 | 成人a大片 | 成人免费视频播放 | 久久五月精品 | 婷婷激情av | av大片免费| 久久看免费视频 | 欧美一级电影 | 国产涩涩在线观看 | 久久黄色成人 | 欧美a级免费视频 | 婷婷网址| 91视频黄色 | 中文乱码视频在线观看 | 日韩一二区在线 | 免费国产在线精品 | 91在线观看视频网站 | 日本护士三级少妇三级999 | 黄污污网站 | 最近中文字幕完整视频高清1 | 91看片网址| 97色资源| 欧美激情视频一区 | 丁香婷婷深情五月亚洲 | 国产福利av在线 | 日韩二区在线播放 | 国产精品12345 | 免费av黄色| 国产精品一区二区三区99 | 欧美极度另类性三渗透 | 亚洲激情综合 | 五月婷婷精品 | 久久a级片 | 久久99亚洲精品 | 国产伦精品一区二区三区四区视频 | 伊人网av | 久久综合五月天 | 亚洲精品久久久久58 | 亚洲国产大片 | 三级av小说 | 国产高清在线一区 | 99久精品视频| 亚洲国产中文字幕在线观看 | 国产精品久久久久久五月尺 | 欧美美女一级片 | 久久精久久精 | 亚洲va在线va天堂va偷拍 | 中文字幕中文字幕在线中文字幕三区 | 欧美精品久久久久久久免费 | 91九色成人蝌蚪首页 | 91精品国产综合久久福利 | 91香蕉视频污在线 | 五月婷婷激情网 | 黄色视屏在线免费观看 | 亚洲国产成人精品在线观看 | 午夜在线观看影院 | www.com黄色| 日韩网站免费观看 | 免费特级黄毛片 | 男女精品久久 | 国产91全国探花系列在线播放 | 91精品国产电影 | 色综合人人 | 成人精品一区二区三区电影免费 | 精品高清视频 | av在线a| www.超碰| 免费在线观看av网址 | 久久99久久99精品免观看软件 | 久久久国产精品一区二区三区 | 亚洲高清资源 | 粉嫩av一区二区三区入口 | 在线小视频国产 | 亚洲国产色一区 | 中文av字幕在线观看 | 色婷婷激情电影 | 国产 一区二区三区 在线 | 色av网站 | 999电影免费在线观看 | 免费在线精品视频 | 国产精品一区二区在线看 | 在线 影视 一区 | 成年人免费观看国产 | 天天操天天添天天吹 | 国产亚洲精品v | 天天拍夜夜拍 | 久久久免费av | 五月婷婷六月丁香在线观看 | 国产尤物在线 | 欧美 国产 视频 | 五月情婷婷 | 日韩在线视频线视频免费网站 | 国产精品久久久久久99 | 超碰在线观看av | 国产午夜精品久久 | 久久综合婷婷国产二区高清 | 国产美女免费视频 | 国产日韩欧美在线 | 娇妻呻吟一区二区三区 | 亚洲伊人成综合网 | 性色av一区二区三区在线观看 | 99久久夜色精品国产亚洲96 | 欧美性久久久久久 | 波多野结衣电影久久 | 久久精品系列 | 精品国产欧美一区二区三区不卡 | 久久99视频免费 | 91精品欧美 | 中文字幕在线免费看 | 天天爽夜夜爽精品视频婷婷 | 毛片精品免费在线观看 | 少妇av网| 最新中文字幕在线观看视频 | 天天射天天色天天干 | 免费在线电影网址大全 | 日韩最新av在线 | 久章操| 精品美女久久久久久免费 | 国产一区二区成人 | 五月婷婷综合在线视频 | 日韩最新理论电影 | 国内外成人在线视频 | 五月天综合色 | 伊人色**天天综合婷婷 | 久久视频这里只有精品 | 高清免费av在线 | 日韩 精品 一区 国产 麻豆 | 丁香婷婷综合色啪 | 国产精品99久久久久 | 精品日韩av| 免费大片黄在线 | 免费91在线观看 | 久久久久久电影 | 中文字幕激情 | 国产破处精品 | 欧美日韩伦理一区 | 日本久久精品视频 | 婷婷色中文网 | 99久久精品久久久久久清纯 | 久久91久久久久麻豆精品 | 久久情侣偷拍 | 国产二区视频在线观看 | 麻豆视频免费网站 | av中文在线影视 | 亚洲天天摸日日摸天天欢 | 久久久天堂 | av高清在线| 亚州性色| 视频在线观看国产 | 色婷婷综合久久久中文字幕 | 亚洲精品资源 | 最新黄色av网址 | 成人久久久久久久久久 | 免费观看91视频 | 三级黄色理论片 | 久久8| 亚洲视频免费在线看 | 亚洲精品欧美成人 | 天天色天天艹 | 久久9999久久免费精品国产 | 激情视频一区二区三区 | 91在线观看视频网站 | a特级毛片 | 毛片激情永久免费 | 久久综合九色欧美综合狠狠 | 伊人狠狠干 | 国产精品久久久久aaaa | 日本久久不卡视频 | 91高清免费观看 | 国产一级二级三级在线观看 | 人人干人人爽 | 丁香视频五月 | 开心激情婷婷 | 99爱国产精品 | 91精品久久久久久综合五月天 | 日韩成人免费在线观看 | 久久久久在线 | 人人爱人人爽 | 国产99自拍 | 日韩精品免费专区 | 九色自拍视频 | 天天超碰 | 午夜视频免费播放 | 亚洲日本中文字幕在线观看 | 免费观看性生交 | 美国人与动物xxxx | 国产经典 欧美精品 | 免费国产在线精品 | 麻豆传媒在线视频 | 日韩欧美69 | 国产精品一区二区av麻豆 | 中文字幕日本在线观看 | 在线一区二区三区 | 成人av免费播放 | 四虎国产永久在线精品 | 国产免费小视频 | 777久久久 | 欧美色图亚洲图片 | 中文字幕永久免费 | 日日夜夜骑 | 成人免费看片网址 | 欧美一级视频在线观看 | 婷婷丁香激情综合 | 国产精品一区久久久久 | 国产精品嫩草影院123 | 国产亚洲综合精品 | 成人亚洲精品国产www | 国产一级不卡毛片 | 亚洲精品在线免费看 | 欧美一区免费在线观看 | 日韩啪视频 | 天天色天天射综合网 | 亚洲热久久 | 日韩专区av| 成人黄色在线 | 日韩a级免费视频 | 97视频在线观看免费 | 狠狠色网 | 99精品视频在线免费观看 | 极品美女被弄高潮视频网站 | 九九热国产视频 | 国产精品久久久久婷婷 | 国产不卡一二三区 | 999超碰 | 欧美日韩中文字幕视频 | 日韩在线观看网站 | 日韩av片无码一区二区不卡电影 | 99热官网| 日韩性色| 国产精久久久久久久 | 久久免费精品一区二区三区 | 97在线观看视频免费 | 丁香六月欧美 | 久久国产精品小视频 | 日韩极品视频在线观看 | 欧美亚洲精品一区 | 久免费| 日韩国产高清在线 | 免费观看的黄色 | 不卡的av在线播放 | 国产精品99久久久久久宅男 | 欧美巨乳波霸 | 九九久久免费 | 日韩高清成人 | 日韩精品免费一区二区三区 | 97看片吧| 特级西西444www高清大视频 | 久久久免费看片 | 国产字幕av| 久久午夜免费观看 | 色婷婷综合久久久久 | 国产激情免费 | 美女视频a美女大全免费下载蜜臀 | 精品久久在线 | 免费高清在线观看成人 | 欧美日韩伦理在线 | 深夜免费福利 | 狠狠色丁香婷婷综合欧美 | 91中文在线 | 亚洲精品国精品久久99热一 | 日韩免费一级电影 | 黄色的网站免费看 | 在线观看黄色小视频 | 久久黄色网址 | 韩日视频在线 | 国产在线观看免费观看 | 色视频网页 | 狠狠网站| 在线观看中文字幕av | 国产剧情一区二区在线观看 | 免费看成人 | 国产精品观看 | 久久精品视频在线 | 97电影网手机版 | 色综合中文字幕 | 欧美三级免费 | av久久久久久 | 99在线精品视频观看 | 国产亚洲精品久久久久久久久久久久 | 西西www444| 中文字幕日韩有码 | 日韩电影一区二区在线 | www婷婷| 精品美女久久久久久免费 | 精品国产乱子伦一区二区 | 国产精品自产拍在线观看蜜 | 国产精品夜夜夜一区二区三区尤 | 亚洲成人免费在线观看 | 亚洲 欧洲 国产 日本 综合 | 最近中文字幕大全 | 日韩视频a | 国产精品18久久久久久久久久久久 | 超碰在线97观看 | 免费一级片在线观看 | 国产激情小视频在线观看 | 亚洲黄色免费 | 国产黄免费在线观看 | 中文字幕精品一区二区精品 | 欧美精品久久久久久久久久久 | 欧美激情精品久久久久久变态 | 色婷av | 亚洲最大av网站 | 91视频这里只有精品 | 丝袜美腿亚洲 | 中文字幕日韩一区二区三区不卡 | 精品久久久免费 | 怡红院久久 | 天天激情站 | 一区二区激情视频 | 五月天丁香 | 成人久久久精品国产乱码一区二区 | 伊人热 | 日韩欧美一区二区不卡 | 制服丝袜天堂 | 97超碰在线资源 | 天天色天天艹 | 在线看一区 | 天天爱天天射 | 日韩在线不卡 | 久久精品99国产精品酒店日本 | 国产精品午夜在线 | 99久久精品国产一区 | 国产一区二区三区免费观看视频 | 久久午夜精品视频 | 91精品国产91久久久久久三级 | 黄色网址在线播放 | 五月婷婷六月丁香激情 | 色99导航| 亚洲91精品 | 成人av电影免费在线播放 | 久久久久亚洲a | 亚洲午夜精品电影 | 国产精品久久久久999 | 日韩高清不卡在线 | 久久精品视频在线免费观看 | 99精品毛片 | av网站播放 | 91激情视频在线观看 | 亚洲伦理一区 | 91在线公开视频 | 久久深夜 | 99视频精品免费观看, | 91精品国产欧美一区二区 | 中文超碰字幕 | 久久99热精品这里久久精品 | 精品久操 | 五月婷婷丁香激情 | 99视频国产精品 | 国内精品免费 | 日韩免费三级 | 一区二区三区在线视频观看58 | 69性欧美| 蜜臀精品久久久久久蜜臀 | 天天操天天艹 | 天天爱天天操天天射 | 91插插影库| 五月天天天操 | 国产精品99精品久久免费 | 欧美黑人性猛交 | 国产一区免费在线观看 | 2022久久国产露脸精品国产 | 中文字幕日韩国产 | 欧美日韩三级在线观看 | 国产在线无 | 日韩av电影手机在线观看 | a级一a一级在线观看 | 激情xxxx | 色多多污污在线观看 | 亚洲成人免费观看 | 日韩久久精品一区二区 | 亚洲伊人第一页 | 色婷婷在线播放 | 黄色99视频 | 日韩在线观看视频免费 | 美女免费网站 | 欧美粗又大 | 狠狠狠色丁香综合久久天下网 | 久草精品网| 五月天婷亚洲天综合网鲁鲁鲁 | 97超碰超碰久久福利超碰 | 色综合久久久久久久久五月 | 国产中文字幕在线免费观看 | 中文字幕亚洲不卡 | 精品久久五月天 | 精品久久久久久国产 | 国产精品久久免费看 | 国产在线播放一区二区三区 | 在线观看中文字幕亚洲 | 欧美激情视频一二区 | av一区二区三区在线 | 亚洲成aⅴ人在线观看 | 福利视频在线看 | 成人毛片在线视频 | 亚洲欧美999 | 精品亚洲欧美一区 | 日韩av在线一区二区 | 亚洲另类xxxx| 国产无套精品久久久久久 | 在线观看的黄色 | 久久99在线 | 亚洲自拍av在线 | 午夜色大片在线观看 | 97成人在线 | 亚洲成人黄色在线 | 日韩大片在线免费观看 | 国产永久免费高清在线观看视频 | 亚洲 综合 激情 | 久草视频网 | 99久久精品午夜一区二区小说 | 天天操网址 | 夜夜爽88888免费视频4848 | 国产精品乱码久久久久 | 97超碰影视 | 久久免费播放视频 | 天天射日| 97超碰色偷偷 | 国产高清视频免费最新在线 | 天天操天天操天天操天天操天天操天天操 | 国产成人一区二区三区电影 | 国内精品视频免费 | 国产aa免费视频 | 中文av一区二区 | 欧美日韩国产一区 | 欧美日韩国产三级 | 国产亚洲免费观看 | www.夜夜爱| 免费三及片 | 色吊丝在线永久观看最新版本 | www四虎影院 | 天天干天天弄 | 久久综合狠狠综合久久综合88 | 欧美精品一区二区在线观看 | www黄| 色婷婷六月天 | 伊人天天狠天天添日日拍 | 激情五月在线视频 | 色婷婷综合视频在线观看 | 国产精品刺激对白麻豆99 | 欧美最猛性xxxxx免费 | 国产精品18久久久久久vr | 黄色一级免费 | 婷色| 日韩精品不卡 | 2020天天干天天操 | 国产美女搞久久 | 亚洲女人av | 亚洲精品免费观看视频 | 91九色在线| 伊人射 | 999久久久免费精品国产 | 亚洲精品视频一二三 | 毛片播放网站 | 天天躁天天操 | 亚洲在线视频播放 | 欧美性色黄 | 亚洲精品女人 | 成人黄色在线电影 | 黄色av一级片 | 久久久久福利视频 | 欧美精品一区二区三区一线天视频 | 亚洲精品乱码久久久久久按摩 | 91视频久久久 | 久久精品理论 | 久草精品免费 | 97在线免费观看 | 国产精品久久久久毛片大屁完整版 | 精品99久久 | 成人午夜电影免费在线观看 | 日日干天天操 | 日韩黄色在线电影 | 96精品视频| 综合色站 | 亚洲免费在线看 | 欧美日在线观看 | 国产精品人成电影在线观看 | 欧美在线1区| 天天综合婷婷 | 五月婷婷国产 | 国产精品永久免费 | 91麻豆精品国产91久久久久久久久 | 天天干天天射天天爽 | 亚洲 中文 在线 精品 | 在线 国产 亚洲 欧美 | 色网站免费在线观看 | 免费精品视频在线观看 | 婷婷在线综合 | 午夜一级免费电影 | 婷婷综合影院 | 欧美日韩在线看 | 欧洲色吧 | 亚洲免费成人av电影 | 综合色在线 | 韩国av不卡 | 夜夜躁狠狠躁 | 九九天堂| 综合久久精品 | 日韩视频三区 | 91桃色免费观看 | 国产aaa免费视频 | 99视频免费观看 | 色综合激情久久 | 久久久国产精品久久久 | 亚洲国产精品va在线看黑人 | 久久免费视频网站 | 日韩在线视频网站 | 午夜美女av | 欧美一区二区三区在线看 | 黄色在线观看www | 五月婷婷中文网 | 深夜福利视频一区二区 | 欧美黑人性猛交 | 国产一级不卡毛片 | 国产在线精品区 | 久久久久国 | 天天操福利视频 | 国产一区视频免费在线观看 | 免费看片网址 | 久久av中文字幕片 | 91视频免费国产 | 丁香六月婷婷综合 | 国产精品美女久久久久久网站 | 9在线观看免费高清完整版在线观看明 | 亚洲精品国偷拍自产在线观看蜜桃 | 99人久久精品视频最新地址 | 国产精品18久久久 | 成年人在线观看免费视频 | 精品国产1区 | 在线观看成人 | 精品国产乱码久久久久 | 99视频久久 | 日本久久中文 | 成人av电影在线观看 | 日韩av一区二区在线影视 | 日韩大陆欧美高清视频区 | 99视频久久 | 在线小视频你懂得 | 国产精品99久久久 | 在线观看日韩视频 | 日本成人中文字幕在线观看 | 91亚洲激情| 中文字幕在线观看完整版电影 | 欧美精品999 | 国产一区不卡在线 | 欧美日韩破处 | 午夜av电影院 | 中文字幕刺激在线 | 99免费在线视频 | 99精品视频在线观看 | 亚洲一级影院 | 在线播放亚洲激情 | 伊人伊成久久人综合网小说 | 96av麻豆蜜桃一区二区 | 国产精品久久久久aaaa九色 | 黄色免费网 | 亚洲精品乱码久久久久久蜜桃动漫 | 99久久99久久精品国产片果冰 | 久久精视频 | 国产在线不卡一区 | 成人性生爱a∨ | 日本在线观看一区 | 久热免费在线 | 精品久久一区二区三区 | 激情综合交 | 日韩毛片精品 | 天天看天天干天天操 | 男女视频久久久 | 91夫妻视频| 91精品国产九九九久久久亚洲 | 97看片网 | 久久久久看片 | 国产精品综合av一区二区国产馆 | 一区二区三区动漫 | 国产一级黄大片 | 五月婷婷在线播放 | 国产精品国产亚洲精品看不卡 | 国产精品99久久久久 | 国产人成看黄久久久久久久久 | 极品久久久久久久 | 精品国产成人av | 亚洲视屏 | 国产精品视频地址 | 九九欧美 | 色婷婷国产在线 | 色婷在线 | 亚洲免费资源 | 国产成人一级 | 91在线免费公开视频 | 97国产超碰 | 在线国产视频 | 在线激情小视频 | 亚洲精品2区 | 久久精品999| 欧美成年性 | 国产女人40精品一区毛片视频 | 色综合久久88色综合天天人守婷 | 国产视频每日更新 | 久久久国产电影 | 国产成人精品999在线观看 | 精品国自产在线观看 | 国产亚洲情侣一区二区无 | 国产成人精品综合 | 毛片一二区 | 天堂黄色片| www.伊人网 | 九七视频在线观看 | 久久久 激情 | 日日爽天天操 | 日韩在线视频线视频免费网站 | 久久久久久久久久久免费 | 国产不卡一二三区 | 99精品欧美一区二区蜜桃免费 | 911在线| 亚洲国产成人av网 | 久久久香蕉视频 | 亚洲精品免费在线视频 | 热re99久久精品国产66热 | 97超碰在线久草超碰在线观看 | 日韩网站在线免费观看 | 色噜噜日韩精品欧美一区二区 | 亚洲在线观看av | 午夜色婷婷| 午夜视频在线观看一区二区三区 | 久久理论影院 | 91精品一区二区在线观看 | 精品人妖videos欧美人妖 | 欧美综合久久 | 欧美日韩xxxxx | www日日| 色多视频在线观看 | 久久免费视频1 | 91人人澡人人爽人人精品 | 最新av在线播放 | 天天操夜夜操天天射 | 久久综合激情 | 国产馆在线播放 | 黄色视屏免费在线观看 | 亚洲精品中文在线资源 | 又爽又黄又无遮挡网站动态图 | 久久99九九99精品 | 亚洲无吗天堂 | 久草免费在线 | 999成人精品 | 色就是色综合 | 91在线播| av免费播放 | 久久精品视频在线免费观看 | 美女免费电影 | 91福利区一区二区三区 | 免费网址你懂的 | 超薄丝袜一二三区 | 国产99久久精品一区二区永久免费 | av黄网站| www激情久久 | 九九热有精品 | 天天综合区 | 国产黄色电影 | 欧美精品在线观看 | 又湿又紧又大又爽a视频国产 | 精品黄色在线 | 18网站在线观看 | www.五月天激情 | 成人h视频 | 久草在线视频免费资源观看 | 中文字幕亚洲不卡 | 波多野结依在线观看 | 91视频电影 | 亚洲国产精久久久久久久 | 亚洲午夜精品在线观看 | 国产精品美女在线观看 | 成 人 黄 色 免费播放 | 波多野结衣精品在线 | 久久免费在线观看视频 | 六月色 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久久视频这里只有精品 | 激情五月色播五月 | 国产精选在线 | 国产精品理论在线观看 | 五月婷久久 | 久日精品| 国产麻豆剧果冻传媒视频播放量 | 黄色片亚洲 | 天天射天天爱天天干 | 国产日韩欧美中文 | 香蕉视频免费在线播放 | 亚洲最新av在线 | 国产手机视频 | 日韩精品中文字幕在线观看 | 亚洲成 人精品 | 日日爽夜夜操 | 国产 一区二区三区 在线 | www.天天色| 99久久精品免费看国产 | 久久免费黄色 | 国产白浆视频 | 91超碰在线播放 | 久久伊人八月婷婷综合激情 | 视频在线观看入口黄最新永久免费国产 | 亚洲欧洲精品一区二区精品久久久 | 成人黄大片 | 免费看成人av | 99人久久精品视频最新地址 | 99久久精品网 | 四虎5151久久欧美毛片 | 久久久久蜜桃 | 特黄特色特刺激视频免费播放 | 成年人黄色免费看 | 色插综合 | 91精品国产92久久久久 | 91亚州| 99热精品视 | 中文字幕日韩国产 | 日韩在线观看精品 | 91精品在线观看视频 | 又湿又紧又大又爽a视频国产 | 久久经典国产 | 精品在线观看一区二区 | 国产精品99免视看9 国产精品毛片一区视频 | 婷婷色综合色 | 天天艹天天 | 国产香蕉97碰碰碰视频在线观看 | 91视频啊啊啊 | 天天操人| 91视频-88av| 在线观看涩涩 | 天天干天天射天天爽 | 久久黄视频 | 欧美一区二视频在线免费观看 | 91av九色 | 五月婷网站 | 婷婷久久亚洲 | 毛片永久新网址首页 | 在线国产福利 | 高清国产午夜精品久久久久久 | 国产精品 欧美 日韩 | 91av影视 | www.99久久.com | 国产精品美女www爽爽爽视频 | 欧美专区国产专区 | 久久久福利 | 青青草在久久免费久久免费 | 亚洲精品高清一区二区三区四区 | 黄在线 | 四虎影视av| 日本精品小视频 | 国产色 在线 | 亚洲精色| 久久视频这里只有精品 | 少妇搡bbbb搡bbb搡忠贞 | 国产成人一二片 | 国产精品亚州 | 久久久国产一区二区三区四区小说 | 九九九热精品免费视频观看 | 最新高清无码专区 | 在线激情网 | 免费a v观看| 日本老少交 | 成人在线免费观看视视频 | 亚洲黄色小说网 | 成年人视频在线 | 91网站免费观看 | 色综合五月天 | av一级片网站| 国内亚洲精品 | 人人添人人 | 日日夜夜天天干 | 韩国在线视频一区 | 美女国产在线 | 国产v在线播放 | 欧美激情第28页 | 黄色av免费 | 97av.com| 久久免费视频在线观看30 | 久草爱视频 | 女人18片毛片90分钟 | 午夜色站| 亚洲色图美腿丝袜 | 精品国产综合区久久久久久 | 天天激情综合 | 麻豆综合网 | 久久久久综合精品福利啪啪 | 国产午夜精品一区二区三区嫩草 | 亚洲片在线观看 | 麻豆视频91 | 久久99精品久久久久蜜臀 | 久久超碰免费 | 日韩专区在线观看 | 久久久久国产精品免费网站 | 国产欧美精品一区二区三区 | 久草电影免费在线观看 | 亚洲视频一区二区三区在线观看 | 91亚洲欧美激情 | 日韩久久精品一区二区 | 中文av在线天堂 | www最近高清中文国语在线观看 | 97人人网 | 国产xxxxx在线观看 | 日本 在线 视频 中文 有码 | 日韩大片免费在线观看 | 中文字幕刺激在线 | 91免费国产在线观看 | 免费特级黄毛片 | 成人精品国产免费网站 | 亚洲欧美精品一区 | 91精品国产入口 | 超碰97人人在线 | 国产精品久久久久久久久久久久午 | 久久午夜网 | 亚洲aⅴ乱码精品成人区 | 国产中文在线字幕 | 2023天天干| 国产综合精品久久 | 欧美激情视频在线观看免费 | 97视频在线免费播放 | 亚洲精品tv久久久久久久久久 | 久久91久久久久麻豆精品 | 欧美日韩中文字幕在线视频 | 欧美日韩视频一区二区三区 | 美女免费黄网站 | 最新日韩在线观看 | 亚洲国内在线 | 视频在线观看国产 | 深爱激情婷婷网 | 在线观看深夜福利 | 中文字幕资源在线观看 | 国产一二区视频 | 99久久久国产精品美女 | 亚洲激情六月 | 91激情在线视频 | 日韩激情精品 | 色婷婷色 | 亚洲精品视频免费在线观看 | 三级在线视频观看 | 狠狠操天天操 | 国产精品美 | 国产一区二区三区在线免费观看 | 国产原厂视频在线观看 | 激情av在线播放 | 狠狠干夜夜爽 | 综合精品久久久 | 亚洲3级 | 99中文字幕在线观看 | 日本黄区免费视频观看 | 97精品国产97久久久久久久久久久久 | 永久免费毛片在线观看 | 免费麻豆 | 天天玩天天干 | 黄av免费在线观看 | 国产亚洲成人网 | 高清国产在线一区 | 免费黄色在线网站 | 麻豆视频在线免费 | 超碰在线人人97 | av免费网页 | 欧美日韩精品综合 | 久久久亚洲成人 | 丁香婷婷综合网 | av电影不卡 | 日韩免费三级 | 婷婷夜夜 | 午夜久久电影网 | 91在线精品秘密一区二区 | 一区二区电影在线观看 | 国产精品永久久久久久久久久 | 久久久精品一区二区 | av国产在线观看 | 91精品一区国产高清在线gif | 日本少妇高清做爰视频 | 午夜精品久久久久久久久久久 | 亚洲成人精品在线 | 国产精品视频你懂的 | 亚洲视频,欧洲视频 | 91中文字幕视频 | 亚洲欧洲在线视频 |