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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android Binder Driver缺陷导致定屏问题分析

發(fā)布時間:2025/3/15 Android 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Binder Driver缺陷导致定屏问题分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文講解異步Android binder call是如何阻塞整個系統(tǒng)的,通過ramdump信息以及binder通信協(xié)議來演繹并還原定屏現(xiàn)場。

一、背景知識點

解決此問題所涉及到的基礎(chǔ)知識點有:Trace、CPU調(diào)度、Ramdump推導、Crash工具、GDB工具、Ftrace, 尤其深入理解binder IPC機制。

1.1 工具簡介

  • Trace:分析死鎖問題的最基本的技能,通過kill -3可生成相應(yīng)的traces.txt文件,里面記錄著當前時刻系統(tǒng)各線程 所處在的調(diào)用棧。
  • CPU調(diào)度:可通過查看schedstat節(jié)點,得知該線程是否長時間處于RQ隊列的等待
  • Ramdump:把系統(tǒng)memory中某一個時間點的數(shù)據(jù)信息保存起來的內(nèi)存崩潰文件,屬于ELF文件格式。 當系統(tǒng)發(fā)生致命錯誤無法恢復的時候,主動觸發(fā)抓取ramdump能異常現(xiàn)場保留下來,這是屬于高級調(diào)試秘籍。
  • Crash工具:用于推導與分析ramdump內(nèi)存信息。
  • GDB工具:由GNU開源組織發(fā)布的、UNIX/LINUX操作系統(tǒng)下的基于命令行的強大調(diào)試工具,比如用于分析coredump
  • Ftrace:用于分析Linux內(nèi)核的運行時行為的強有力工具,比如能某方法的耗時數(shù)據(jù)、代碼的執(zhí)行流情況。

1.2 Binder簡介

Binder IPC是最為整個Android系統(tǒng)跨進程通信的基石,整個系統(tǒng)絕大多數(shù)的跨進程都是采用Binder,如果對Binder不太了解看本文會非常吃力,在Gityuan.com博客中有大量講解關(guān)于Binder原理的文章,見http://gityuan.com/2015/10/31/binder-prepare/。這里不再贅述,簡單列兩張關(guān)于Binder通信架構(gòu)的圖。

Binder通信采用C/S架構(gòu),主要包含Client、Server、ServiceManager以及binder驅(qū)動部分,其中ServiceManager用于管理系統(tǒng)中的各種服務(wù)。Client向Server通信過程圖中畫的是虛線,是由于它們彼此之間不是直接交互的,而是采用ioctl的方式跟Binder驅(qū)動進行交互的,從而實現(xiàn)IPC通信方式。

接下來再以startService為例,展示一次Binder通信過程的方法執(zhí)行流:

從圖中,可見當一次binder call發(fā)起后便停在waitForResponse()方法,等待執(zhí)行完具體工作后才能結(jié)束。 那么什么時機binder call端會退出waitForResponse()方法?見下圖:

退出waitForResponse場景說明:

  • 1)當Client收到BR_DEAD_REPLY或BR_FAILED_REPLY(往往是對端進程被殺或者transaction執(zhí)行失敗),則無論是同步還是異步的binder call都會結(jié)束waitForResponse()方法。
  • 2)正常通信的情況下,當收到BR_TRANSACTION_COMPLETE則結(jié)束同步binder call; 當收到BR_REPLY則結(jié)束異步binder call。

二、初步分析

有了以上背景知識的鋪墊,接下來就進入正式實戰(zhàn)分析過程。

2.1 問題描述

Android 8.0系統(tǒng)用幾十臺手機連續(xù)跑幾十個小時Monkey的情況下有概率出現(xiàn)定屏問題。

定屏是指屏幕長時間卡住不動,也可以成為凍屏或者hang機,絕大多數(shù)情況下都是由于多個線程之間存在直接或者間接死鎖而引發(fā),而本案例實屬非常罕見例子, 異步方法處于無限等待狀態(tài)被blocked,從而導致的定屏。

2.2 初步分析

通過查看trace,不難發(fā)現(xiàn)導致定屏的原因如下:

system_server的所有binder線程以及其中重要現(xiàn)場都在等待AMS鎖, 而AMS鎖被線程Binder:12635_C所持有; Binder:12635_C線程正在執(zhí)行bindApplication()方法,調(diào)用棧如下:

終極難題:attachApplicationLocked()是屬于異步binder call,之所以叫異步binder call,就是由于可異步執(zhí)行而并不會阻塞線程。 但此處卻能阻塞整個系統(tǒng),這一點基本是毀三觀的地方。

懷疑1:有同學可能會覺得是不是Binder驅(qū)動里的休眠喚醒問題,對端進程出現(xiàn)異常導致無法喚醒該binder線程從而阻塞系統(tǒng)??
回答1:這個觀點咋一看,好像合情合理,還挺能唬人的。接下來,我先來科普一下,以正視聽。

如果熟悉Binder原理的同學,應(yīng)該知道上面說的是不可能發(fā)生的事情。oneway binder call,也就是所謂的異步調(diào)用, Binder機制設(shè)計絕不可能傻到讓異步的binder call來需要等待對端進程的喚醒。

真正的oneway binder call, 一旦是事務(wù)發(fā)送出去。 a)如果成功,則會向自己線程thread->todo隊列里面放上BINDER_WORK_TRANSACTION_COMPLETE; b)如果失敗,則會向自己線程thread->todo隊列里面放上BINDER_WORK_RETURN_ERROR。

緊接著,就會在binder_thread_read()過程把剛才的BINDER_WORK_XXX讀取出去,然后調(diào)出此次binder call。 之所以要往自己隊列放入BINDER_WORK_XXX,為了告知本次事務(wù)是否成功的投遞到對端進程。但整個過程,無需對端進程的參與。

也就是說bindApplication()方法作為異步binder調(diào)用方法,只會等待自己向自己todo隊列寫入的BR_TRANSACTION_COMPLETE或BR_DEAD_REPLY或BR_FAILED_REPLY。

所以說,對端進程無法喚醒的說法是絕無可能的猜想。

懷疑2:CPU的優(yōu)先級反轉(zhuǎn)問題,當前Binder線程處于低優(yōu)先級,無法分配到CPU資源而阻塞系統(tǒng)??
回答2:從bugreport中來分析定屏過程被阻塞線程的cpu調(diào)度情況。

先講解之前,先來補充一點關(guān)于CPU解讀技巧:

nice值越小則優(yōu)先級越高。此處nice=-2, 可見優(yōu)先級還是比較高的;

schedstat括號中的3個數(shù)字依次是Running、Runable、Switch,緊接著的是utm和stm

  • Running時間:CPU運行的時間,單位ns
  • Runable時間:RQ隊列的等待時間,單位ns
  • Switch次數(shù):CPU調(diào)度切換次數(shù)
  • utm: 該線程在用戶態(tài)所執(zhí)行的時間,單位是jiffies,jiffies定義為sysconf(_SC_CLK_TCK),默認等于10ms
  • stm: 該線程在內(nèi)核態(tài)所執(zhí)行的時間,單位是jiffies,默認等于10ms

可見,該線程Running=186667489018ns,也約等于186667ms。在CPU運行時間包括用戶態(tài)(utm)和內(nèi)核態(tài)(stm)。 utm + stm = (12112 + 6554) ×10 ms = 186666ms。

結(jié)論:utm + stm = schedstat第一個參數(shù)值。

有了以上基礎(chǔ)知識,再來看bugreport,由于系統(tǒng)被hang住,watchdog每過一分鐘就會輸出依次調(diào)用棧。我們把每一次調(diào)用找的schedstat數(shù)據(jù)拿出來看一下,如下:

可見,Runable時間基本沒有變化,也就說明該線程并沒有處于CPU等待隊列而得不到CPU調(diào)度,同時Running時間也幾乎沒有動。 所以該線程長時間處于非Runable狀態(tài),從而排除CPU優(yōu)先級反轉(zhuǎn)問題。

再看Event Log

01-19 19:02:33.668 12635 24699 I am_proc_start: [0,6686,10058,com.xxx.calculator,activity,com.xxx.calculator/.convert.ConvertActivity] 01-19 19:02:33.840 12635 12846 I am_kill : [0,6686,com.xxx.calculator,-10000,remove task] 01-19 19:02:33.911 12635 13399 I am_proc_bound: [0,6686,com.xxx.calculator] 01-19 19:02:33.913 12635 13399 I am_proc_died: [0,6686,com.xxx.calculator,18]

疑問:appDiedLock()方法一般是通過BinderDied死亡回調(diào)的情況下才執(zhí)行,但死亡回調(diào)肯定是位于其他線程,由于該binder線程正處于繁忙狀態(tài),并沒有時間處理。 為什么同一個線程正在執(zhí)行attachApplication()的過程,并沒有結(jié)束的情況下還能執(zhí)行appDiedLock()方法?

觀察多份定屏的EventLog,最后時刻都會先執(zhí)行attachApplication(),然后執(zhí)行appDiedLock()。此處懷疑跟殺進程有關(guān),或者是在某種Binder嵌套調(diào)用的情況下,將這兩件事情合在binder線程?這些都只是猜疑,本身又是概率問題,需要更深入地分析才能解答這些疑團。

三、ramdump分析

有效的信息太少,基本無法采用進一步分析,只能通過抓取ramdump希望能通過里面的蛛絲馬跡來推出整個過程。

抓取的ramdump是只是觸發(fā)定屏后的最后一刻的異常現(xiàn)場,這就好比犯罪現(xiàn)場最后的畫面,我們無法得知案發(fā)的動機是什么, 更無法得知中間到底發(fā)生了哪些狀態(tài)。要基于ramdump的靜態(tài)畫面,去推演整個作案過程,需要強大的推演能力。 先來分析這個ramdump信息,找到盡可能多的有效信息。

3.1 結(jié)構(gòu)體binder_thread

從ramdump中找到當前處于blocked線程的調(diào)用棧上的方法binder_ioctl_write_read(), 該方法的的第4個參數(shù)指向binder_read結(jié)構(gòu)體, 采用crash工具便可進一步找到binder_thread的結(jié)構(gòu)體如下:

解讀:

  • waiting_thread_node為空,則說明binder線程的 thread→transaction_stack不為空 或者 thread→todo不為空;
  • todo為空,結(jié)合前面的waiting_thread_node,則說明thread→transaction_stack一定不為空;
  • return_error和reply_error的cmd等于29185, 轉(zhuǎn)換為16進制等于0x7201, 代表的命令為BR_OK = _IO(‘r’, 1), 說明該binder線程的終態(tài)并沒有error,或者中間發(fā)生error并且已被消耗掉;
  • looper = 17, 說明該線程處于等待狀態(tài)BINDER_LOOPER_STATE_WAITING

3.2 binder_transaction結(jié)構(gòu)體

既然thread→transaction_stack不為空,根據(jù)結(jié)構(gòu)體binder_thread的成員transaction_stack = 0xffffffddf1538180, 則解析出binder_transaction結(jié)構(gòu)體

解讀:

  • from = 0x0, 說明發(fā)起端進程已死
  • sender_euid=10058, 這里正是event log中出現(xiàn)的被一鍵清理所殺的進程,這里隱約能感受到此次異常跟殺進程有關(guān)
  • to_thread所指向的是當前system_server的binder線程,說明這是遠端進程向該進程發(fā)起的請求
  • flags = 16, 說明是同步binder call
  • code = 11,說明該調(diào)用attachApplication(),此處雖無法完成確定,但從上下文以及前面的stack,基本可以這么認為,后續(xù)會論證。

到這里,想到把binder接口下的信息也拿出來,看看跟前面基本是吻合的code=b, 也應(yīng)該是attachApplication(), 如下:

thread 13399: l 11 need_return 0 tr 0 incoming transaction 2845163: ffffffddf1538180 from 0:0 to 12635:13399 code b flags 10 pri 0:120 r1 node 466186 size 92:8 data ffffff8014202c98

3.3 特殊的2916

看一下kernel Log,被hang住的binder線程有一個Binder通信失敗的信息:

binder : release 6686:6686 transaction 2845163 out, still active binder : 12635:13399 transaction failed 29189/-22, size 3812-24 line 2916

29189=0x7205代表的是BR_DEAD_REPLY = _IO(‘r’, 5), 則代表return_error=BR_DEAD_REPLY,發(fā)生錯誤行是2916,什么場景下代碼會走到2916行呢, 來看Binder Driver的代碼:

根據(jù)return_error=BR_DEAD_REPLY,從2916往回看則推測代碼應(yīng)該是走到2908行代碼; 往上推說明target_node = context→binder_context_mgr_node,這個target_node是指service_manager進程的binder_node。 那么binder_context_mgr_node為空的場景,只有觸發(fā)servicemanger進程死亡,或者至少重啟過;但通過查看servicemanger進程并沒有死亡和重啟; 本身走到2900行, tr->target.handle等于空,在這個上下文里面就難以解釋了,現(xiàn)在這個來看更是矛盾。

到此,不得不懷疑推理存在紕漏,甚至懷疑日志輸出機制。經(jīng)過反復驗證,才發(fā)現(xiàn)原來忽略了2893行的binder_get_node_refs_for_txn(),代碼如下:

一切就豁然開朗,由于對端進程被殺,那么note→proc==null, 從而有了return_error=BR_DEAD_REPLY。

3.4 binder_write_read結(jié)構(gòu)體

看完被阻塞的binder線程和事務(wù)結(jié)構(gòu)體,接著需要看一下數(shù)據(jù)情況,調(diào)用棧上的binder_ioctl_write_read()方法的第三個參數(shù)便指向binder_write_read結(jié)構(gòu)體, 用crash工具解析后,得到如下信息:

解讀:

  • write_size=0, 看起來有些特別,本次通信過程不需要往Binder Driver寫數(shù)據(jù),常規(guī)transaction都有命令需寫入Binder Driver;
  • read_size=256,本次通信過程需要讀取數(shù)據(jù);

那么什么場景下,會出現(xiàn)write_size等于0,而read_size不等于0呢? 需要查看用戶空間跟內(nèi)核空間的Binder Driver交互的核心方法talkWithDriver(),代碼如下:

從上述代碼可知:read_size不等于0,則doReceive=true, needRead=true,從而mIn等于空; 再加上write_size=0則mOut為空。 也就是說該blocked線程最后一次跟Binder驅(qū)動交互時的mIn和mOut都為空。

而目前的線程是卡在attachApplicationLocked()過程,在執(zhí)行該方法的過程一定是會向mOut里面寫入數(shù)據(jù)的。但從案發(fā)后的最后一次現(xiàn)場來看mOut里面的數(shù)據(jù)卻為空, 這是違反常規(guī)的操作,第一直覺可能會懷疑是不是出現(xiàn)了內(nèi)存踩踏之類的,但每次都這么湊巧地能只踩踏這個數(shù)據(jù),是不太可能的事。為了進一步驗證,再把mOut和mIn這兩個buffer的數(shù)據(jù)拿出來。

3.5 mOut && mIn

IPCThreadState結(jié)構(gòu)體在初始化的時候,分別設(shè)置mOut和mIn的size為256。Binder IPC過程便是利用mOut和mIn 分別承擔向Binder驅(qū)動寫數(shù)據(jù)以及從Binder驅(qū)動讀數(shù)據(jù)的功能。雖然在反復使用的過程中會出現(xiàn)老的命令被覆蓋的情況, 但還是可能有一些有用信息。

mOut和mIn是用戶空間的數(shù)據(jù),并且是IPCThreadState對象的成員變量。程序在用戶空間停在IPCThreadState的waitForResponse()過程, 采用GDB打印出當前線程用戶空間的this指針的所有成員,即可找到mOut和mIn

解讀: mIn緩存區(qū),mDataSize = 16, mDataPos = 16, 說明最后的talkWithDriver產(chǎn)生了兩個BR命令,并且已處理;mOut緩存區(qū),mDataSize = 0, mDataPos = 0,說明BC_XXX都已被消耗

再來進一步看看這兩個緩存區(qū)中的數(shù)據(jù),從上圖可知mIn和mOut的mData地址分別為0x7747500300、0x7747500400,緩存區(qū)大小都等于256字節(jié); mIn緩存區(qū)中存放都是BR_XXX命令(0x72);mOut緩存區(qū)中存放都是BC_XXX命令(0x63)。 再來分別看看兩個緩存區(qū)中的數(shù)據(jù):

mIn緩存區(qū)數(shù)據(jù):

解讀:BR_NOOP = 0x720c, BR_CLEAR_DEATH_NOTIFICATION_DONE = 0x7210,可知mIn數(shù)據(jù)區(qū)中最后一次talkWithDriver的過程產(chǎn)生了兩個BR命令依次是: BR_NOOP, BR_CLEAR_DEATH_NOTIFICATION_DONE

mOut緩存區(qū)數(shù)據(jù):

解讀:BC_FREE_BUFFER = 0x6303, BC_DEAD_BINDER_DONE = 0x6310,可知mOut數(shù)據(jù)區(qū)最后一次talkWithDriver的過程,所消耗掉的BC命令依次是:BC_FREE_BUFFER, BC_DEAD_BINDER_DONE

分析兩份ramdump里面的mOut和mIn數(shù)據(jù)區(qū)內(nèi)容內(nèi)容基本完全一致,緩存區(qū)中的BC和BR信息完全一致。整個過程,通過ramdump推導發(fā)現(xiàn)被阻塞線程的todo隊列居然為空,最后一次處理過的transaction是BC_FREE_BUFFER、BC_DEAD_BINDER_DONE和BR_NOOP、BR_CLEAR_DEATH_NOTIFICATION_DONE,能解讀出來對本案例有所關(guān)聯(lián)線索也就只有這么多。

3.6 疑難懸案

解決系統(tǒng)疑難問題可能不亞于去案件偵破,而本案就好比是密室殺人案。案發(fā)后第一時間去勘察現(xiàn)場(抓取ramdump),從房門和窗口都是由內(nèi)部緊鎖的(mIn緩存區(qū)的write_size等于0),兇手作案后是如何逃離現(xiàn)場的(todo隊列為空)?從被害人(blocked線程)身體留下的劍傷并不會致命(異步線程不會被阻塞),那到底死因是什么呢?從現(xiàn)場種種跡象來看(ramdump推導)很有可能是這并非第一案發(fā)現(xiàn)場(BUG不是發(fā)現(xiàn)在當前binder transaction過程),極有可能是兇手在它處作案(其他transaction)后,再移尸到當前案發(fā)現(xiàn)場(binder嵌套結(jié)束后回到上一級調(diào)用處),那么真正的第一案發(fā)現(xiàn)場又在哪里呢?這些都匪夷所思。

Trace、Log、Ramdump推導、Crash工具、GDB工具等十八般武藝都用過一輪了,已經(jīng)沒有更多的信息可以挖掘了,快沒有頭緒了,這個問題幾乎要成為無頭公案。

四、真相大白

4.1 案件偵破

此案一日不破,有如鯁在噎,寢食難安。腦中反復回放案發(fā)現(xiàn)場的周邊布置,有一個非常重大的疑點進入腦海,其中有一個物件(BC_DEAD_BINDER_DONE協(xié)議)正常應(yīng)該在其他房間(binder死亡訃告相關(guān)),可為何會出現(xiàn)在案發(fā)現(xiàn)場(bindApplication的waitForResponse過程)呢?

基于最后的現(xiàn)場,順著這個線索通過逆向推理分析,去試圖推演兇手的整個作案過程。但對于如此錯終復雜的案情(binder通信系統(tǒng)每時每刻都有大量的事transaction發(fā)生著,協(xié)議之間的轉(zhuǎn)換也比較復雜),僅憑一兩個協(xié)議來逆向回推案發(fā)現(xiàn)場是如何一步步演化幾乎是不太可能的事。跟同事一起討論,通過不斷逆向與正向結(jié)合分析,每一層逆向回推,都會有N種可能性,通過不斷排除其他的可能性,盡可能多地排除完全不可能的分支,保留可能的分支再繼續(xù)回推,最終奇跡般地找到了第一案發(fā)現(xiàn)場,也找到了復現(xiàn)方法。

這個逆向推理過程非常復雜,首先需要深入掌握Binder原理,在整個推演過程最為燒腦與費時。為了節(jié)省篇幅,此處省略一萬字。

直接拿出結(jié)論,真正的第一案發(fā)現(xiàn)場如下:在進程剛啟動不久,執(zhí)行到linkToDeath()方法前的瞬間將其殺掉則能復現(xiàn)定屏:

4.2 案卷解讀

這個問題的復雜在于,即便找到了第一個案發(fā)現(xiàn)場以及復現(xiàn)路徑,要完全理解中間的每一次協(xié)議轉(zhuǎn)換過程,也是比較復雜的。 通過如下命令打開binder driver的ftrace信息,用于輸出每次binder通信協(xié)議與數(shù)據(jù)。

整個binder通信會不斷地在用戶空間與內(nèi)核空間之間進行切換, Binder IPC通信過程的數(shù)據(jù)流向說明:( BINDER_WORK_XXX簡稱為BW_XXX)

  • mOut:記錄用戶空間向Binder Driver寫入的命令
    • 通過binder_thread_write()和binder_transaction()方法消費BC命令,并產(chǎn)生相應(yīng)的BW_XXX命令,也可能不產(chǎn)生BW命令
    • 當thread->return_error.cmd != BR_OK,則不會執(zhí)行binder_thread_write()過程
  • thread→todo: 記錄等待當前binder線程需要處理的BINDER_WORK
    • 通過binder_thread_read()方法消費BW命令,并生產(chǎn)相應(yīng)的BR_XX命令,也可能不產(chǎn)生BR命令
    • 一般情況,沒有BC_TRANSACION或者BC_REPLY,則不讀取; BW_DEAD_BINDER例外;
  • mIn: 記錄Binder Driver傳到用戶空間的命令
    • 通過waitForResponse()和executeCommand()方法消費BR命令

另外,關(guān)于talkWithDriver, 當mIn有數(shù)據(jù),意味著先不需要從binder driver讀數(shù)據(jù)。原因:needRead=0,則read_buffer size設(shè)置為0,當doReceive=true,則write_buffer size也設(shè)置為0。從而此次不會跟driver交互。

以下是一次定屏復現(xiàn)過程吐出的ftrace信息:

Binder:1885_5-2351 [002] ...1 242.804499: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce6928 Binder:1885_5-2351 [002] ...1 242.804503: binder_command: cmd=0x40046304 BC_INCREFS Binder:1885_5-2351 [002] ...1 242.804515: binder_command: cmd=0x40046305 BC_ACQUIRE Binder:1885_5-2351 [002] ...1 242.804517: binder_command: cmd=0x400c630e BC_REQUEST_DEATH_NOTIFICATION Binder:1885_5-2351 [002] ...1 242.804524: binder_write_done: ret=0 Binder:1885_5-2351 [002] ...1 242.804526: binder_ioctl_done: ret=0Binder:1885_5-2351 [003] ...1 242.854847: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce4f18 Binder:1885_5-2351 [003] ...1 242.854852: binder_command: cmd=0x40406300 BC_TRANSACTION // bindApplication(), Binder:1885_5-2351 [003] ...1 242.854900: binder_write_done: ret=0 Binder:1885_5-2351 [003] ...1 242.854902: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=1 //binder_thread_read()處理BINDER_WORK_DEAD_BINDER,生成BR_DEAD_BINDER Binder:1885_5-2351 [003] ...1 242.854905: binder_return: cmd=0x8008720f BR_DEAD_BINDER Binder:1885_5-2351 [003] ...1 242.854906: binder_read_done: ret=0 Binder:1885_5-2351 [003] ...1 242.854908: binder_ioctl_done: ret=0Binder:1885_5-2351 [003] ...1 242.854920: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce4d58 //既有可能是thread->return_error.cmd != BR_OK Binder:1885_5-2351 [003] ...1 242.854922: binder_write_done: ret=0 Binder:1885_5-2351 [003] ...1 242.854923: binder_ioctl_done: ret=0Binder:1885_5-2351 [003] ...1 242.863203: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce1c08 Binder:1885_5-2351 [003] ...1 242.863258: binder_write_done: ret=0 Binder:1885_5-2351 [003] ...1 242.863263: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=1 //取出BINDER_WORK_RETURN_ERROR, BR_DEAD_REPLY, 此次炸死。BR_TRANSACTION_COMPLETE僅僅是打印錯誤 Binder:1885_5-2351 [003] ...1 242.863272: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE Binder:1885_5-2351 [003] ...1 242.863276: binder_read_done: ret=0 Binder:1885_5-2351 [003] ...1 242.863279: binder_ioctl_done: ret=0// sendObituary() Binder:1885_5-2351 [003] ...1 242.868356: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce31a8 Binder:1885_5-2351 [003] ...1 242.868392: binder_command: cmd=0x400c630f BC_CLEAR_DEATH_NOTIFICATION //雷被拿了,return_error=BR_Ok才可以寫; 將death->work.type由BINDER_WORK_DEAD_BINDER改為 BINDER_WORK_DEAD_BINDER_AND_CLEAR。 Binder:1885_5-2351 [003] ...1 242.868403: binder_command: cmd=0x40406300 BC_TRANSACTION //(同步) Binder:1885_5-2351 [003] ...1 242.868707: binder_transaction: transaction=187839 dest_node=14103 dest_proc=2198 dest_thread=0 reply=0 flags=0x11 code=0x1f Binder:1885_5-2351 [003] ...1 242.868734: binder_transaction_alloc_buf: transaction=187839 data_size=96 offsets_size=0 Binder:1885_5-2351 [003] ...1 242.868786: binder_command: cmd=0x40406300 BC_TRANSACTION //(異步) Binder:1885_5-2351 [003] ...1 242.868802: binder_transaction: transaction=187840 dest_node=563 dest_proc=746 dest_thread=0 reply=0 flags=0x10 code=0x8 Binder:1885_5-2351 [003] ...1 242.868807: binder_transaction_alloc_buf: transaction=187840 data_size=1952 offsets_size=112 Binder:1885_5-2351 [003] ...2 242.868822: binder_transaction_ref_to_node: transaction=187840 node=37276 src_ref=37277 src_desc=940 ==> dest_ptr=0x00000079ba160780 Binder:1885_5-2351 [003] ...2 242.868829: binder_transaction_ref_to_node: transaction=187840 node=158140 src_ref=158141 src_desc=116 ==> dest_ptr=0x00000079ba03f6c0 Binder:1885_5-2351 [003] ...2 242.868833: binder_transaction_ref_to_node: transaction=187840 node=8192 src_ref=8193 src_desc=110 ==> dest_ptr=0x00000079bc81b220 Binder:1885_5-2351 [003] ...2 242.868837: binder_transaction_ref_to_node: transaction=187840 node=18544 src_ref=18545 src_desc=416 ==> dest_ptr=0x00000079ba1dbd20 Binder:1885_5-2351 [003] ...2 242.868839: binder_transaction_ref_to_node: transaction=187840 node=8192 src_ref=8193 src_desc=110 ==> dest_ptr=0x00000079bc81b220 Binder:1885_5-2351 [003] ...2 242.868842: binder_transaction_ref_to_node: transaction=187840 node=18659 src_ref=18660 src_desc=420 ==> dest_ptr=0x00000079bd0b3720 Binder:1885_5-2351 [003] ...2 242.868844: binder_transaction_ref_to_node: transaction=187840 node=8192 src_ref=8193 src_desc=110 ==> dest_ptr=0x00000079bc81b220 Binder:1885_5-2351 [003] ...2 242.868847: binder_transaction_ref_to_node: transaction=187840 node=18719 src_ref=18720 src_desc=423 ==> dest_ptr=0x00000079bd0b4120 Binder:1885_5-2351 [003] ...2 242.868849: binder_transaction_ref_to_node: transaction=187840 node=8192 src_ref=8193 src_desc=110 ==> dest_ptr=0x00000079bc81b220 Binder:1885_5-2351 [003] ...2 242.868852: binder_transaction_ref_to_node: transaction=187840 node=18919 src_ref=18920 src_desc=431 ==> dest_ptr=0x00000079ba1ba320 Binder:1885_5-2351 [003] ...2 242.868854: binder_transaction_ref_to_node: transaction=187840 node=8192 src_ref=8193 src_desc=110 ==> dest_ptr=0x00000079bc81b220 Binder:1885_5-2351 [003] ...2 242.868857: binder_transaction_ref_to_node: transaction=187840 node=18785 src_ref=18786 src_desc=425 ==> dest_ptr=0x00000079bd0b4a20 Binder:1885_5-2351 [003] ...2 242.868863: binder_transaction_ref_to_node: transaction=187840 node=130076 src_ref=130077 src_desc=1405 ==> dest_ptr=0x00000079ba03f060 Binder:1885_5-2351 [003] ...2 242.868867: binder_transaction_ref_to_node: transaction=187840 node=159857 src_ref=159858 src_desc=154 ==> dest_ptr=0x00000079ba160c40 Binder:1885_5-2351 [000] ...1 242.869114: binder_write_done: ret=0 Binder:1885_5-2351 [000] ...1 242.869117: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=1 Binder:1885_5-2351 [000] ...1 242.869120: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE Binder:1885_5-2351 [000] ...1 242.869122: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE Binder:1885_5-2351 [000] ...1 242.869124: binder_read_done: ret=0 Binder:1885_5-2351 [000] ...1 242.869126: binder_ioctl_done: ret=0Binder:1885_5-2351 [000] ...1 242.869137: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce31a8 Binder:1885_5-2351 [000] ...1 242.869140: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=0 Binder:1885_5-2351 [000] ...1 242.869195: binder_transaction_received: transaction=187841 Binder:1885_5-2351 [000] ...1 242.869198: binder_return: cmd=0x80407203 BR_REPLY Binder:1885_5-2351 [000] ...1 242.869202: binder_read_done: ret=0 Binder:1885_5-2351 [000] ...1 242.869203: binder_ioctl_done: ret=0Binder:1885_5-2351 [000] ...1 242.873656: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce1e98 Binder:1885_5-2351 [000] ...1 242.873664: binder_command: cmd=0x40086303 BC_FREE_BUFFER Binder:1885_5-2351 [000] ...1 242.873668: binder_transaction_buffer_release: transaction=187841 data_size=0 offsets_size=0 Binder:1885_5-2351 [000] ...1 242.873671: binder_command: cmd=0x40406300 BC_TRANSACTION Binder:1885_5-2351 [000] ...1 242.873784: binder_transaction: transaction=187849 dest_node=127265 dest_proc=5730 dest_thread=0 reply=0 flags=0x11 code=0x31 Binder:1885_5-2351 [000] ...1 242.873787: binder_transaction_alloc_buf: transaction=187849 data_size=76 offsets_size=0 Binder:1885_5-2351 [000] ...1 242.873814: binder_write_done: ret=0 Binder:1885_5-2351 [000] ...1 242.873816: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=1 Binder:1885_5-2351 [000] ...1 242.873820: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE Binder:1885_5-2351 [000] ...1 242.873821: binder_read_done: ret=0 Binder:1885_5-2351 [000] ...1 242.873823: binder_ioctl_done: ret=0Binder:1885_5-2351 [000] ...1 242.876271: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce1e98 Binder:1885_5-2351 [000] ...1 242.876302: binder_command: cmd=0x40406300 BC_TRANSACTION Binder:1885_5-2351 [000] ...1 242.876417: binder_transaction: transaction=187850 dest_node=23725 dest_proc=3051 dest_thread=0 reply=0 flags=0x11 code=0x31 Binder:1885_5-2351 [000] ...1 242.876423: binder_transaction_alloc_buf: transaction=187850 data_size=76 offsets_size=0 Binder:1885_5-2351 [000] ...1 242.876456: binder_write_done: ret=0 Binder:1885_5-2351 [000] ...1 242.876459: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=1 Binder:1885_5-2351 [000] ...1 242.876461: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE Binder:1885_5-2351 [000] ...1 242.876463: binder_read_done: ret=0 Binder:1885_5-2351 [000] ...1 242.876464: binder_ioctl_done: ret=0 // sendObituary()結(jié)束Binder:1885_5-2351 [000] ...1 242.886935: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce4f18 Binder:1885_5-2351 [000] ...1 242.886975: binder_command: cmd=0x40086310 BC_DEAD_BINDER_DONE Binder:1885_5-2351 [000] ...1 242.886980: binder_write_done: ret=0 Binder:1885_5-2351 [000] ...1 242.886984: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=1 Binder:1885_5-2351 [000] ...1 242.886993: binder_return: cmd=0x80087210 BR_CLEAR_DEATH_NOTIFICATION_DONE Binder:1885_5-2351 [000] ...1 242.886996: binder_read_done: ret=0 Binder:1885_5-2351 [000] ...1 242.886999: binder_ioctl_done: ret=0Binder:1885_5-2351 [000] ...1 242.887012: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce4f18 Binder:1885_5-2351 [000] ...1 242.887013: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=0 Binder:1885_5-2351 [000] ...1 260.021887: binder_read_done: ret=-512 Binder:1885_5-2351 [000] ...1 260.021893: binder_ioctl_done: ret=-512 Binder:1885_5-2351 [000] ...1 260.023938: binder_ioctl: cmd=0xc0306201 arg=0x71f6ce4f18 Binder:1885_5-2351 [000] ...1 260.023972: binder_wait_for_work: proc_work=0 transaction_stack=1 thread_todo=0

將以上信息轉(zhuǎn)換為表格形式來展示案發(fā)過程:

以流程圖的方式來展示案發(fā)過程:

過程解讀:

  • 該線程執(zhí)行l(wèi)inkToDeath(),采用flush只寫不讀的方式,向Binder Driver的thread todo隊列寫入BW_DEAD_BINDER;
  • 執(zhí)行bindApplication(), 由于目標進程已死,則寫入BW_RETURN_ERROR到todo隊列,此時return_error.cmd = BR_DEAD_REPLY; 內(nèi)核空間,將BW_DEAD_BINDER轉(zhuǎn)換為BR_DEAD_BINDER,同步將BW_DEAD_BINDER 放入proc->delivered_death; 回到用戶空間,執(zhí)行sendObituary(), 此時還處于bindApplication()的waitForResponse()。
  • 向mOut添加BC_CLEAR_DEATH_NOTIFICATION,采用flush方式,加上return_error.cmd = BR_DEAD_REPLY,此次不寫不讀。
  • 執(zhí)行第一個reportOneDeath(),此時return_error.cmd = BR_DEAD_REPLY則不寫入,取出BW_RETURN_ERROR,同時設(shè)置return_error.cmd=BR_OK; 回到用戶空間,終結(jié)第一個reportOneDeath(),錯誤地消耗了bindApplication()所產(chǎn)生的BR_DEAD_REPLY。
  • 執(zhí)行第二個reportOneDeath(),同時消耗了第一個和第二個reportOneDeath所產(chǎn)生的BR_TRANSACTION_COMPLETE協(xié)議,由于第二個reportOneDeath是同步binder call, 還需繼續(xù)等待BR_REPLY協(xié)議。
  • 此時mOut和mIn都為空,進入內(nèi)核binder_wait_for_work(),等待目標進程發(fā)起B(yǎng)C_REPLY命令,向當前線程todo隊列放入BW_TRANSACTION;收到BW_TRANSACTION協(xié)議后轉(zhuǎn)換為BR_REPLY,完成第二個reportOneDeath()。
  • 執(zhí)行第三個reportOneDeath(),收到BR_TRANSACTION_COMPLETE后,完成第二個reportOneDeath()。
  • 到此徹底執(zhí)行完sendObituary(),則需向mOut添加BC_DEAD_BINDER_DONE協(xié)議,收到該協(xié)議后,驅(qū)動將proc→delivered_death的BW_DEAD_BINDER_AND_CLEAR調(diào)整為BW_CLEAR_DEATH_NOTIFICATION,并放入thread->todo隊列;然后生成BR_CLEAR_DEATH_NOTIFICATION_DONE,完成本次通信;
  • 回到bindApplication()的waitForResponse,此時mOut和mIn都為空,進入內(nèi)核binder_wait_for_work(), 該線程不再接收其他事務(wù),也無法產(chǎn)生事務(wù),則永遠地被卡住。
  • 總結(jié):整個過程發(fā)生了10次 talkWithDriver()

    • 第一個異步reportOneDeath()消費掉bindApplication()所產(chǎn)生的BW_RETURN_ERROR;
    • 第二個同步reportOneDeath()所消耗掉 第一個異步reportOneDeath()自身殘留的BR_TRANSACTION_COMPLETE;
    • bindApplication()所產(chǎn)生的BW_RETURN_ERROR由于被別人所消費,導致陷入無盡地等待。

    4.3 總結(jié)

    真正分析遠比這復雜,鑒于篇幅,文章只講解其中一個場景,不同的Binder Driver以及不同的Framework代碼組合有幾種不同的表現(xiàn)與處理流程。不過最本質(zhì)的問題都是在于在嵌套的binder通信過程,BR_DEAD_REPLY錯誤地被其他通信所消耗從而導致的異常。我的解決方案是一旦發(fā)生錯誤,則當BW_RETURN_ERROR事務(wù)放入到當前線程todo隊列頭部,則保證自己產(chǎn)生的BW_RETURN_ERROR事務(wù)一定會被自己所正確地消耗,解決異步binder通信在嵌套場景下的無限阻塞的問題,優(yōu)化后的處理流程圖:

    當然還有第二個解決方案就是盡可能避免一切binder嵌套,Google在最新的binder driver驅(qū)動里面采用將BW_DEAD_BINDER放入proc的todo隊列來避免嵌套問題,這個方案本身也OK,但我認為在執(zhí)行過程出現(xiàn)了BW_RETURN_ERROR還是應(yīng)該放到隊列頭部,第一時間處理error,從而也能避免被錯誤消耗的BUG,另外后續(xù)如果binder新增其他邏輯,也有可能會導致嵌套的出現(xiàn),那么仍然會有類似的問題。最近跟Google工程師來回多次溝通過這個問題,他們?nèi)匀幌M3置看沃煌鵷hread todo隊列尾部添加事務(wù)的邏輯,對于嵌套問題希望通過將其放入proc todo隊列的方式來解決。對此,我擔心后續(xù)擴展性方面會忽略或者遺忘,又引發(fā)binder嵌套問題,Google工程師表示未來添加新功能,也會杜絕出現(xiàn)嵌套邏輯,保持邏輯與代碼的簡潔。

    最后,這個密室殺人案的確是在它處作案(reportOneDeath消費掉bindApplication所產(chǎn)生的BW_RETURN_ERROR)后,再移尸到當前案發(fā)現(xiàn)場(執(zhí)行完BR_DEAD_BINDER后回到bindApplication的waitForRespone方法),從而導致異步Binder調(diào)用也能被阻塞。


    http://gityuan.com/2018/05/12/binder-driver-bug/

    總結(jié)

    以上是生活随笔為你收集整理的Android Binder Driver缺陷导致定屏问题分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产一级视频在线免费观看 | 国产色视频网站 | 粉嫩av一区二区三区四区在线观看 | 亚洲精品免费在线视频 | 久久99久久久久久 | 国产一区二区三区在线免费观看 | 色视频在线看 | 久久天天躁狠狠躁亚洲综合公司 | 91精品播放 | 日韩高清免费在线观看 | 97热在线观看 | 色多多污污在线观看 | 狠狠干激情 | 亚洲精品国产精品久久99 | 亚洲日韩精品欧美一区二区 | 中国一级片免费看 | 国产区免费在线 | 久久99国产精品自在自在app | 天天色官网 | 日韩美女av在线 | 99视 | 91在线视频观看免费 | 久草免费福利在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产在线色 | 天天看天天干天天操 | 麻豆视频在线免费观看 | av色图天堂网 | 亚洲免费视频观看 | 久久人人爽爽人人爽人人片av | 久草视频在线资源 | 黄色免费网| 日韩av中文 | 99精品在线免费视频 | 在线看岛国av | 中文字幕在线观看不卡 | 久久综合九色九九 | 九九久久电影 | 黄色a一级片 | 欧美在线观看禁18 | 久久久免费电影 | 日韩伦理片一区二区三区 | 五月婷婷综合在线观看 | 综合激情 | 黄视频色网站 | 三级av中文字幕 | 天堂成人在线 | 久久综合电影 | 午夜精品久久久久久久99热影院 | 国产麻豆精品免费视频 | 久久96国产精品久久99漫画 | 波多野结依在线观看 | 中文字幕一区二区三区在线播放 | 成人精品在线 | 久久久久国产精品www | 美女视频黄是免费的 | 久久久久看片 | 狠狠色丁香婷婷综合久小说久 | 亚洲a网 | 精品视频在线看 | 色av男人的天堂免费在线 | 天天综合日日夜夜 | 91看片淫黄大片在线播放 | 欧美一二三区播放 | 国语精品免费视频 | 99爱爱| 久久久官网| 国产精品久久久久久久久久三级 | 96久久精品| 欧美精品在线一区二区 | 成人在线免费小视频 | 美女国产网站 | 国产精品久久免费看 | 五月天中文在线 | 国产专区一 | 91豆花在线观看 | 日日爱视频 | av电影免费在线播放 | 久久在线免费观看视频 | 在线视频 国产 日韩 | 亚洲自拍自偷 | 五月婷婷综合激情网 | 日韩电影在线视频 | 女人魂免费观看 | 黄p网站在线观看 | 欧美精品在线观看免费 | 天天操伊人 | 一级性视频 | 在线观看片 | 97香蕉超级碰碰久久免费软件 | 西西人体4444www高清视频 | 午夜丰满寂寞少妇精品 | 婷婷网在线 | www在线观看视频 | 中文有码在线视频 | av网站手机在线观看 | 午夜精品一区二区三区免费 | 久久免费看毛片 | 91麻豆网 | 久久国产精品影片 | 国产日韩精品一区二区三区 | 欧美成人xxx | 国产视频一二区 | 六月丁香综合网 | 日韩a在线看 | free. 性欧美.com| 黄色毛片视频免费 | 国产视频999 | 7799av| 男女激情麻豆 | 中文字幕欧美日韩va免费视频 | 一区二区三区福利 | 亚洲精品www久久久久久 | 国产成人久久 | 91av原创 | 精品产品国产在线不卡 | 久久亚洲影院 | 亚洲黄电影 | 成人91视频| 免费视频网 | 国产第一页在线播放 | 久久久99精品免费观看乱色 | 久草在线资源网 | 国产在线观看一区 | 日韩久久精品一区二区 | 久久超碰在线 | 中文字幕2021 | 国产一级免费观看 | 97av视频| 国产精品美女久久久久久网站 | 国产精品网在线观看 | 日韩欧美一区二区三区在线观看 | 国产成人三级在线 | 亚洲女人天堂成人av在线 | 狠狠插狠狠干 | 超碰九九 | 免费观看黄色12片一级视频 | 国产精品美女久久久 | 精品国产人成亚洲区 | 激情综合中文娱乐网 | 免费99精品国产自在在线 | 69视频在线播放 | 免费在线观看av网址 | 精品国产综合区久久久久久 | 在线视频免费观看 | 久久国产免费视频 | 热久久免费国产视频 | 久久免费视频3 | 欧美精品第一 | 一区二区三区精品在线视频 | 天天综合天天做天天综合 | 天天草网站 | 久久精品—区二区三区 | 中文字幕亚洲欧美 | 四虎影视www| 日韩xxxx视频| 精品久久影院 | 国产流白浆高潮在线观看 | av电影免费在线播放 | 蜜臀av一区二区 | 免费网址你懂的 | 美女很黄免费网站 | 在线观看免费观看在线91 | 伊人五月在线 | 在线免费观看羞羞视频 | 91亚洲精品久久久中文字幕 | 国产精品专区一 | 国产精品日韩欧美一区二区 | 欧美性生活小视频 | 久草久热| 国产在线播放一区 | 国产亚洲精品成人av久久影院 | 亚洲人成影院在线 | 亚洲人视频在线 | 亚洲精品免费在线播放 | 99精品在线免费 | 国产a级精品| 青青草在久久免费久久免费 | 97在线看片 | 丁香五婷 | 色在线视频网 | 国产免费国产 | 在线观看黄色 | 天天干天天干天天射 | 91精品伦理 | 日本99热 | 91mv.cool在线观看 | 狠狠色丁香婷婷综合最新地址 | 久草五月| 91完整版观看 | 久久综合影视 | 久久精品一区二区三区国产主播 | 色就是色综合 | 国产拍在线 | 午夜国产福利在线 | 久久麻豆精品 | 久久久精品亚洲 | 911亚洲精品第一 | 一本一本久久a久久精品综合小说 | 在线视频精品播放 | 国产精品久久久久久久久久免费 | 99视频精品全部免费 在线 | 丝袜一区在线 | 国产九九九精品视频 | 黄色av三级在线 | 一本一道久久a久久综合蜜桃 | 精品国产免费一区二区三区五区 | 国产乱码精品一区二区蜜臀 | 亚洲aⅴ在线观看 | 久久久99国产精品免费 | 日韩欧美在线综合网 | 亚洲国产精品500在线观看 | 久草在线费播放视频 | 欧美日韩性视频在线 | 天天视频亚洲 | 国产无套精品久久久久久 | 亚洲欧美日韩国产一区二区三区 | 国产精品美女久久久 | 1024手机在线看 | 91精品一 | 黄色av电影在线 | 日韩理论在线播放 | 国产成人免费av电影 | 亚洲综合欧美日韩狠狠色 | 在线精品在线 | 欧美成人免费在线 | 久艹视频在线免费观看 | 久99久精品 | 亚洲第一区在线观看 | 色综合五月天 | 日韩激情一二三区 | 91精品色| 国产精品大片免费观看 | 国产手机在线精品 | 欧美黑人xxxx猛性大交 | 国产一区不卡在线 | 99精品视频在线观看视频 | 九九热免费在线观看 | 啪啪精品 | 中文久草| 日本高清免费中文字幕 | 丁香九月婷婷 | 国产成人av电影在线 | 免费色网站 | 97视频在线观看视频免费视频 | 成人午夜在线电影 | 97香蕉久久超级碰碰高清版 | 精品在线一区二区 | 国产一区久久久 | 美女久久久 | 日韩视频1 | 成人av电影免费在线观看 | 日韩视频免费在线 | 最新国产精品久久精品 | 免费在线黄色av | 六月色婷婷 | 四虎国产免费 | 五月天婷亚洲天综合网鲁鲁鲁 | 国产黄色片免费观看 | 国产午夜麻豆影院在线观看 | 色吊丝在线永久观看最新版本 | 欧美成人按摩 | 免费黄色看片 | 91看毛片| 国产va在线| 欧美日韩视频在线一区 | 久久久伊人网 | 欧洲亚洲精品 | 色94色欧美 | 欧美日韩性生活 | 国产精品嫩草在线 | 91在线免费观看网站 | 在线观看涩涩 | 久久任你操| 精品国产伦一区二区三区观看方式 | 国产裸体无遮挡 | 国产色爽 | 色午夜 | 国产亚洲视频在线免费观看 | 欧美一级性生活片 | 久久久久久久久久久网站 | 成人免费精品 | 日韩精品在线看 | 国产成人精品一区二区三区福利 | 久久免费影院 | 人人爽人人爽人人爽学生一级 | 国产福利专区 | 黄色h在线观看 | 欧美日韩国产三级 | 国产精品一区二区三区久久 | 天天拍天天色 | 日韩高清精品一区二区 | 欧美va在线观看 | 久久精品区 | 国产一区二区免费在线观看 | 四虎免费av| 九九久久婷婷 | 黄色国产区 | 中文免费观看 | 国产黄色播放 | 成人免费视频网址 | 一区二区三区在线观看免费 | 国产精品女主播一区二区三区 | 免费进去里的视频 | 免费黄在线观看 | 亚洲精品国产精品国自产 | 色婷婷a | 免费欧美高清视频 | 欧美一级片在线免费观看 | 欧美日韩精品在线一区二区 | 久久精品一| 国产999精品视频 | 成人午夜片av在线看 | 中文字幕 国产精品 | 亚洲欧美日韩国产 | 欧美午夜精品久久久久久孕妇 | 婷婷在线色 | 国产白浆视频 | 日韩免费一区二区在线观看 | 亚洲午夜久久久久久久久久久 | 久久国语 | 在线观看中文字幕dvd播放 | 国产综合婷婷 | 久久综合成人网 | 国内精品国产三级国产aⅴ久 | 日韩在线无 | 中文字幕在线播放日韩 | 18性欧美xxxⅹ性满足 | 精品国产免费一区二区三区五区 | 中文字幕在线视频网站 | av片中文字幕| 午夜视频黄 | 欧美成人久久 | 成人在线播放av | 色网av | 99久久网站 | 国产视频1 | 日韩精品一区二区在线观看视频 | 国产高清免费在线观看 | 狠狠干天天操 | 欧美日韩高清一区二区 | 亚洲更新最快 | 天天色天天草天天射 | 午夜国产在线 | 麻豆视频免费入口 | 国产中文字幕在线观看 | 日本特黄一级 | 亚洲午夜不卡 | 国内精品久久久久影院一蜜桃 | 91人人揉日日捏人人看 | 麻豆久久 | 69视频在线播放 | 一级淫片在线观看 | 九色porny真实丨国产18 | 五月婷婷激情网 | 6080yy精品一区二区三区 | 欧美男同网站 | 高清av网| 久草在线免费新视频 | 91成品视频 | 久久免费精彩视频 | 国产呻吟在线 | 亚洲精品白浆高清久久久久久 | 91视频在线观看免费 | 久久久久女人精品毛片九一 | 337p日本大胆噜噜噜噜 | 亚洲成人资源 | 91中文视频 | 国产精品久久久久婷婷 | 日本中文字幕在线免费观看 | 久久人人精品 | 国产成人久久久久 | 欧美激情综合五月色丁香 | 日本中文字幕在线免费观看 | 91激情视频在线观看 | av片中文| 黄色大片网 | 99r在线播放 | 9999国产| 欧美色图狠狠干 | 美女国产免费 | 欧美韩国日本在线观看 | 香蕉色综合 | 国产一级免费播放 | 伊人成人久久 | 五月激情五月激情 | 美女网站视频一区 | 日日夜夜添 | 日韩av一区二区三区四区 | 精品人人爽 | 少妇精品久久久一区二区免费 | 男女啪啪网站 | 国色综合 | 久草精品在线观看 | 亚洲全部视频 | 福利视频 | 国产精品ⅴa有声小说 | 国产一级电影 | 经典三级一区 | 免费污片 | 日韩在线视频二区 | 日韩电影在线观看一区 | av在线之家电影网站 | 午夜视频在线观看一区二区三区 | 最近高清中文在线字幕在线观看 | 全黄色一级片 | 亚洲激情p | 成人在线免费小视频 | 国产高清视频在线观看 | 在线免费视频你懂的 | 久久中文字幕导航 | 久久成人午夜视频 | 丁香在线观看完整电影视频 | 亚洲夜夜网 | 亚洲精品国内 | 精品视频123区在线观看 | 麻豆视频免费网站 | 日韩在线在线 | 亚洲伊人成综合网 | 久久久香蕉视频 | 国产中文字幕视频在线观看 | 久久综合九色九九 | 黄色av高清 | 2019精品手机国产品在线 | 人人干人人添 | 国产乱码精品一区二区蜜臀 | 久操视频在线 | 一区二区三区在线观看免费视频 | 日韩黄色大片在线观看 | www99久久 | 一区在线免费观看 | 国产精品免费观看国产网曝瓜 | 99久久婷婷国产综合亚洲 | 最近高清中文字幕 | 亚洲精品资源在线观看 | 久久精品老司机 | 九七视频在线 | 波多野结衣电影一区二区三区 | 欧美一二三视频 | 我爱av激情网 | 精品视频免费久久久看 | 国产成人精品在线播放 | 日韩视频一区二区在线 | 成人精品视频久久久久 | 尤物九九久久国产精品的分类 | 国产97碰免费视频 | 久久久久夜色 | 国产在线看一区 | 日本精品久久 | 在线观看日韩专区 | 亚洲资源在线网 | 久草视频在| 伊人中文在线 | 99色免费视频 | 日韩av中文| 97日日碰人人模人人澡分享吧 | 在线黄网站 | 国产日韩欧美在线一区 | 日韩在线免费不卡 | 欧女人精69xxxxxx | 成人久久18免费网站麻豆 | 成人va天堂 | 黄色成人91| 久草在线视频免赞 | 日韩精品免费在线观看视频 | 日韩在线观看视频在线 | 黄色av网站在线免费观看 | 国产精品久久av | 亚洲精品国偷拍自产在线观看 | 日本黄色免费在线 | 久久综合色综合88 | 在线视频成人 | 久热超碰 | 日韩在线字幕 | av天天草 | 91一区啪爱嗯打偷拍欧美 | 免费三级黄色片 | 888av| 国产精品久久久久毛片大屁完整版 | 亚洲另类视频在线观看 | 日韩av不卡播放 | 天天草天天爽 | 韩国精品视频在线观看 | 一区二区在线不卡 | 欧美日韩中文在线 | 久久www免费视频 | 欧美精品在线视频 | 99视频在线免费观看 | 97视频久久久 | 中文字幕 二区 | 精品亚洲欧美一区 | 日韩久久精品一区二区 | 国产小视频免费在线网址 | 国产免费观看av | 精品一区av| 国产精品入口传媒 | 久久免费毛片视频 | 五月婷婷另类国产 | 国产最新视频在线观看 | 久久视了 | www.久热| av看片在线 | 成人毛片一区二区三区 | 亚洲va韩国va欧美va精四季 | 亚洲天堂网在线播放 | 国产精品精品国产色婷婷 | 丁香激情综合国产 | 久久激情五月激情 | 欧美日韩三区二区 | 91在线视频免费91 | 久久精品播放 | 亚洲精选在线观看 | 天堂av免费看 | 免费在线观看成人 | 天天插狠狠干 | 中文字幕电影高清在线观看 | 黄色三级免费 | 欧美日韩xxxxx | 伊人资源视频在线 | 日韩精品一区二区三区水蜜桃 | 午夜三级大片 | 99热这里只有精品8 久久综合毛片 | 96av在线视频 | 色.www | 日韩91在线| 国产福利专区 | 综合网伊人| 亚洲视频999 | 国产成人精品在线 | 日韩av网址在线 | 黄色三级网站在线观看 | 天天操天天干天天干 | 婷婷视频导航 | 日本三级香港三级人妇99 | 国产色综合 | 久久精品国产一区二区三 | 免费在线观看午夜视频 | 久久久久久国产精品亚洲78 | 99久久日韩精品视频免费在线观看 | 欧美日韩免费在线观看视频 | 99久高清在线观看视频99精品热在线观看视频 | 蜜臀一区二区三区精品免费视频 | av888.com | 在线免费观看国产 | 成人在线网站观看 | 亚洲精品午夜久久久 | 国产最新视频在线观看 | 日日插日日干 | 少妇av片 | 高清av在线| 国产最新福利 | 日日操日日插 | 永久免费观看视频 | 久久久久久久久久久久久影院 | 免费高清在线观看电视网站 | 国产高清免费视频 | 亚洲国产精品99久久久久久久久 | 蜜臀久久99精品久久久无需会员 | 91在线播放综合 | 日本h视频在线观看 | 久久国语露脸国产精品电影 | 亚洲视屏| 国产精品综合久久久 | 久色网 | 久久久久久福利 | 欧美成人亚洲 | 国产玖玖视频 | 日本久久免费视频 | 国产精选视频 | 国产精品久久久久高潮 | 欧美日韩高清免费 | 久久神马影院 | 午夜久久久久久久久久影院 | 在线免费中文字幕 | 欧美日韩在线视频观看 | 国产黄免费在线观看 | 热久久这里只有精品 | 91丨九色丨国产丨porny精品 | 91九色网站 | 深夜免费小视频 | 免费av网址在线观看 | 天天草夜夜 | 日韩激情片在线观看 | 亚洲视频999 | www.狠狠操.com | 欧美日韩在线免费视频 | 亚洲精品美女在线观看播放 | 精品婷婷| 国产精品成人自产拍在线观看 | 国产原创中文在线 | 欧洲视频一区 | 久久久视屏 | 免费男女羞羞的视频网站中文字幕 | 亚洲h视频在线 | 1000部国产精品成人观看 | 国产精品久久久久久久久久久久 | 久99精品 | 国产成人精品一区二区在线 | 国产精品亚州 | 久久人人爽人人片 | 91日韩免费 | 超碰97中文 | 国产伦理久久精品久久久久_ | 欧美 激情在线 | 最新av免费在线 | 欧美做受69| 日批网站免费观看 | 国产精品igao视频网入口 | 亚洲精品资源在线 | 亚州欧美视频 | 人人澡超碰碰97碰碰碰软件 | 天天综合人人 | 亚洲成人免费在线 | 欧美黄色特级片 | 日韩欧美在线免费 | 超碰在线观看av | 亚洲精品女 | 91精品伦理 | 国产精品毛片一区二区 | 久久精品综合 | 成年人在线免费视频观看 | 一本色道久久综合亚洲二区三区 | 一本一本久久a久久精品综合小说 | 免费在线观看视频a | 国产999| 国产私拍在线 | 丝袜+亚洲+另类+欧美+变态 | 亚洲1级片| 色综合天天视频在线观看 | 97国产视频 | 中文字幕中文字幕在线中文字幕三区 | 在线观看va | 99精彩视频| 特级西西444www高清大视频 | 天天亚洲| a色视频| 狠狠色丁香九九婷婷综合五月 | 亚洲国产美女精品久久久久∴ | 在线观看日本高清mv视频 | 在线岛国av| av资源在线看 | 国产精品 久久 | 一区二区观看 | 午夜 久久 tv | 麻豆视频在线观看 | 亚洲国产中文字幕 | 亚洲精品1区2区3区 超碰成人网 | 国产精品嫩草55av | 免费看一级黄色大全 | 国产视频二区三区 | 深爱激情五月婷婷 | 97国产大学生情侣酒店的特点 | 日韩在线免费电影 | 99视频+国产日韩欧美 | 99久久9 | 久久精品婷婷 | 国产精品av免费在线观看 | 成人免费一区二区三区在线观看 | 久艹视频在线免费观看 | 一级性生活片 | 国产久草在线观看 | 中文av在线免费观看 | 黄色一级在线观看 | 国产一级免费观看 | 国产视频久久 | 一区二区三区四区精品视频 | 国产日产精品久久久久快鸭 | 五月花丁香婷婷 | 欧美一区二区三区激情视频 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 日韩精品一二三 | 久久激情影院 | 婷婷五月在线视频 | 国产成人精品一区二区在线观看 | 在线观看视频色 | 五月婷在线 | 欧美日韩国产一区二区三区 | 欧美性生活免费看 | 天天操欧美 | 日韩毛片久久久 | 欧美激情第八页 | 日韩超碰 | 黄色av三级在线 | 欧美一级黄色网 | 日韩中文字幕a | 麻豆传媒在线视频 | 中文在线字幕免费观看 | av在线8 | 日韩在线视频线视频免费网站 | 欧美极品xxxx | 精品一区二区日韩 | 日韩一级电影在线观看 | 日本三级全黄少妇三2023 | 国产999精品视频 | 成人免费看片网址 | av动态图片 | 婷婷丁香色综合狠狠色 | freejavvideo日本免费 | 狠狠的操狠狠的干 | 欧美视屏一区二区 | 成人黄色大片在线观看 | 国产精品第二十页 | 天天操比| 亚洲免费在线播放视频 | 国产精品久久久久aaaa | 中文字幕在线观看国产 | 国产只有精品 | 日韩av黄| 欧美精品视 | 国产精品久久久久三级 | 久久久毛片 | 精品久久一二三区 | 亚洲精品国产精品国自产在线 | 亚洲精品字幕在线 | 国产xvideos免费视频播放 | 午夜av免费观看 | 免费精品在线视频 | 黄色亚洲 | 亚洲欧美偷拍另类 | 亚洲va欧美va国产va黑人 | 亚洲精品在线观看免费 | 一二三四精品 | 美女黄濒 | 亚洲无毛专区 | 国产亚洲视频在线免费观看 | 久久国产精品久久久 | 99精品欧美一区二区蜜桃免费 | 天堂在线一区二区 | av解说在线 | 亚洲高清在线观看视频 | 夜夜骑首页| 精品久久精品久久 | 亚洲激情在线观看 | 特级毛片在线免费观看 | 91色影院 | 伊人午夜 | 久久精品一区二区国产 | 波多野结衣在线观看一区二区三区 | 欧美专区日韩专区 | 二区三区精品 | 精品少妇一区二区三区在线 | 久久久久久久久免费 | 看片黄网站 | 久久激情视频免费观看 | 日本女人逼 | 国产手机视频在线播放 | 一区二区三区电影 | 久 久久影院 | 日日干av| 91大神一区二区三区 | 少妇高潮流白浆在线观看 | 成人午夜网 | 九九日九九操 | 日韩免费视频一区二区 | 91中文在线| 中文字幕亚洲精品在线观看 | 在线欧美国产 | 成年人视频在线观看免费 | 美女黄频视频大全 | 在线免费观看视频一区二区三区 | 国产成人精品av在线观 | 美女黄色网在线播放 | 欧美日韩免费一区二区三区 | 精品视频免费 | 亚洲天堂精品视频 | 成人久久精品 | 99久久精品免费看 | 久久综合免费视频影院 | 日韩综合精品 | 丁香六月伊人 | 国产在线视频一区二区三区 | 免费亚洲精品视频 | 国产免费亚洲高清 | 国产aa精品 | 青青草久草在线 | 91午夜精品 | 在线不卡视频 | 粉嫩av一区二区三区四区在线观看 | 国产精品99久久久 | 91毛片视频| 在线观看av中文字幕 | 黄色成人av | 欧洲亚洲女同hd | 亚洲精品理论 | 黄色a一级视频 | 亚洲影院天堂 | 久久久www成人免费毛片麻豆 | 久久tv视频 | 欧美精品日韩 | 九九九九九九精品任你躁 | 91网免费看| 四虎影视久久久 | 一区 二区电影免费在线观看 | 久久草| 黄av免费在线观看 | 久久久久久久久久福利 | 91看毛片 | 亚洲精品乱码久久久一二三 | 亚洲精品乱码久久久久久久久久 | 亚洲国产欧美一区二区三区丁香婷 | 国产精品一区二区久久久久 | 久草精品视频在线观看 | 久草在线综合 | 久久tv| av在线播放不卡 | 五月天久久狠狠 | 国产精品国产三级国产不产一地 | 国产九九热视频 | 亚洲精品网站在线 | 国产亚洲视频在线 | 国产女v资源在线观看 | 亚洲成人欧美 | 国产一区二区三区免费在线 | 亚洲一级黄色av | 色网站国产精品 | 91九色精品女同系列 | av丝袜天堂 | 蜜臀久久99精品久久久久久网站 | 亚洲 欧美日韩 国产 中文 | 中文字幕传媒 | aaa日本高清在线播放免费观看 | 在线日韩中文字幕 | 日日干视频| 亚洲精品97 | 国产精品麻豆99久久久久久 | 日韩成人精品在线观看 | 懂色av一区二区三区蜜臀 | 国产美女网站在线观看 | 日日夜夜精品免费 | 久草网免费 | 亚洲黄污| 午夜国产一区二区三区四区 | 免费视频久久 | 日韩理论片在线观看 | 欧美精彩视频在线观看 | 国产在线观看国语版免费 | 久久黄网站 | 黄色软件在线观看 | 91九色最新 | 顶级bbw搡bbbb搡bbbb | 日韩精品aaa| 亚洲欧美视频一区二区三区 | 美女精品国产 | 中文字幕第一 | 久久人人97超碰国产公开结果 | 日韩网站在线播放 | 久久久高清视频 | 日本一区二区三区免费看 | 国产最新视频在线观看 | 国产精品99久久久久久人免费 | 色综合天天狠狠 | 精品在线视频观看 | 日精品 | 日韩欧美国产精品 | 丰满少妇在线观看网站 | av网址在线播放 | 91视频-88av| 国产一级电影免费观看 | 久久免费福利视频 | 91爱爱视频 | 天天干中文字幕 | 亚洲视频axxx | 色婷婷综合视频在线观看 | 91视频亚洲 | 激情综合五月婷婷 | 激情视频国产 | 午夜少妇一区二区三区 | 国产色视频网站2 | av成人免费在线观看 | 天堂av影院 | 国产精品21区 | 日韩精品视频在线观看网址 | 99热精品视 | 在线国产不卡 | 欧美黑人性爽 | 国产精品黄 | 日韩高清不卡在线 | 久热免费在线观看 | 中文字幕亚洲精品日韩 | 夜夜干天天操 | 视频福利在线观看 | 日日碰狠狠躁久久躁综合网 | 91福利国产在线观看 | 日韩最新中文字幕 | 国产中文字幕一区 | 最近中文字幕大全 | 在线国产视频 | 久久人人爽人人爽人人片av免费 | 国产成人99av超碰超爽 | 欧美成亚洲| 在线视频 91 | 久久久久久不卡 | 精品99在线观看 | 色婷婷综合在线 | 欧美精品中文 | 国产成人久久av977小说 | 成人国产精品免费 | 国产精品福利在线观看 | 免费一区在线 | 成人高清在线 | 一本一道久久a久久精品 | 欧美巨大荫蒂茸毛毛人妖 | 天天干夜夜擦 | 天天草综合| 国产黄色成人 | 黄色精品在线看 | 一性一交视频 | 青春草视频在线播放 | 亚洲国产中文字幕在线 | 一区二区激情 | 久草视频精品 | 一区二区三区日韩在线观看 | 福利一区在线 | 天天激情天天干 | 中文字幕在线免费看线人 | 日韩免费成人av | 精品一区av | 国产精品99久久久精品 | 成人黄色在线视频 | 国产精品入口麻豆www | 欧美视频在线观看免费网址 | 亚洲精品国久久99热 | 射射色| 97视频久久久 | 免费大片av | 99色网站 | av 在线观看 | 色人久久 | 亚洲天堂网站 | 国产美女在线观看 | 久久久精品免费观看 | 国产一级二级视频 | 国产黄色理论片 | 成人av网站在线观看 | 国内成人综合 | 五月婷婷色综合 | 亚洲欧美成人综合 | 亚洲毛片久久 | 日韩久久影院 | 特级毛片爽www免费版 | 日本中文字幕观看 | 国产麻豆精品免费视频 | 在线播放 一区 | 国产精品久久久久久吹潮天美传媒 | 久久精品视频在线免费观看 | 一区二区三区免费网站 | 久久国产a | 久草色在线观看 | 狠狠躁18三区二区一区ai明星 | 亚洲区视频在线 | 17婷婷久久www | 日精品在线观看 | 国产高清在线免费观看 | 国产视频在| 天天激情天天干 | 国产精品在线看 | 国产福利在线 | 国产在线观看中文字幕 | 欧美亚洲成人免费 | 色偷偷88欧美精品久久久 | 欧美小视频在线 | 亚洲精品久久久久久国 | 999久久久久久久久 69av视频在线观看 | 欧美一级电影免费观看 | 亚洲黄色小说网址 | 亚洲另类人人澡 | 成人黄色在线视频 | 99国产精品久久久久久久久久 | 国产精品久久久久久久午夜片 | 亚洲九九爱 | 国产一级91 | 天天操天天干天天玩 | 人人爽人人爽人人片 | 国产精品va在线 | 久久免费视频在线 | 热久久免费国产视频 | 夜夜操天天摸 | 欧美性春潮 | 亚洲精品久久久蜜臀下载官网 | 中文字幕 在线 一 二 | 日日干影院 | 国产一级免费在线观看 | 国产精品美女久久久久久免费 | 亚州激情视频 | 国产日韩精品一区二区在线观看播放 | 日韩av高清在线观看 | 国产无套一区二区三区久久 | 99久久成人| 日韩精品一区二区三区三炮视频 | 中文字幕电影一区 | 日韩欧美精品在线 | 三级在线国产 | 精品美女在线观看 | 九色琪琪久久综合网天天 | 国产香蕉av | 99婷婷 | 久久免费国产 | 香蕉视频在线网站 |