久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

品茗论道说广播(Broadcast内部机制讲解)

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 品茗论道说广播(Broadcast内部机制讲解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 概述

??????? 我們在編寫Android程序時,常常會用到廣播(Broadcast)機制。從易用性的角度來說,使用廣播是非常簡單的。不過,這個不是本文關心的重點,我們希望探索得再深入一點兒。我想,許多人也不想僅僅停留在使用廣播的階段,而是希望了解一些廣播機制的內部機理。如果是這樣的話,請容我斟一杯紅茶,慢慢道來。

??????? 簡單地說,Android廣播機制的主要工作是為了實現一處發生事情,多處得到通知的效果。這種通知工作常常要牽涉跨進程通訊,所以需要由AMS(Activity Manager Service)集中管理。

?

??????? 在Android系統中,接收廣播的組件叫作receiver,而且receiver還分為動態和靜態的。動態receiver是在運行期通過調用registerReceiver()注冊的,而靜態receiver則是在AndroidManifest.xml中聲明的。動態receiver比較簡單,靜態的就麻煩一些了,因為在廣播遞送之時,靜態receiver所從屬的進程可能還沒有啟動呢,這就需要先啟動新的進程,費時費力。另一方面,有些時候用戶希望廣播能夠按照一定順序遞送,為此,Android又搞出了ordered broadcast的概念。

??????? 細節如此繁雜,非一言可以說清。我們先從receiver這一側入手吧。

?

2 兩種receiver

??????? Android中的receiver,分為“動態receiver”和“靜態receiver”。

2.1 動態receiver

??????? 動態receiver必須在運行期動態注冊,其實際的注冊動作由ContextImpl對象完成:

@Override public?Intent?registerReceiver(BroadcastReceiver?receiver,?IntentFilter?filter)? {????return?registerReceiver(receiver,?filter,?null,?null); } @Override public?Intent?registerReceiver(BroadcastReceiver?receiver,?IntentFilter?filter,String?broadcastPermission,?Handler?scheduler)? {???return?registerReceiverInternal(receiver,?filter,?broadcastPermission,scheduler,?getOuterContext()); }

注冊之時,用戶會把一個自定義的receiver對象作為第一個參數傳入。當然,用戶的receiver都是繼承于BroadcastReceiver的。使用過廣播機制的程序員,對這個BroadcastReceiver應該都不陌生,這里就不多說了。我們需要關心的是,這個registerReceiverInternal()內部還包含了什么重要的細節。

??????? registerReceiverInternal()代碼的截選如下:

private?Intent?registerReceiverInternal(BroadcastReceiver?receiver,IntentFilter?filter,?String?broadcastPermission,Handler?scheduler,?Context?context)? {IIntentReceiver?rd?=?null;????if?(receiver?!=?null)?{????????if?(mPackageInfo?!=?null?&&?context?!=?null)?{????????????if?(scheduler?==?null)?{scheduler?=?mMainThread.getHandler();}????????????//?查找和context對應的“子哈希表”里的ReceiverDispatcher,如果找不到,就重新new一個rd?=?mPackageInfo.getReceiverDispatcher(receiver,?context,?scheduler,mMainThread.getInstrumentation(),?true);}?.?.?.?.?.?.}????try?{????????return?ActivityManagerNative.getDefault().registerReceiver(mMainThread.getApplicationThread(),?mBasePackageName,rd,?filter,?broadcastPermission);}?catch?(RemoteException?e)?{????????return?null;} }

請大家注意那個rd對象(IIntentReceiver rd)。我們知道,在Android架構中,廣播動作最終其實都是由AMS遞送出來的。AMS利用binder機制,將語義傳遞給各個應用進程,應用進程再輾轉調用到receiver的onReceive(),完成這次廣播。而此處的rd對象正是承擔“語義傳遞工作“的binder實體。

??????? 為了管理這個重要的binder實體,Android搞出了一個叫做ReceiveDispatcher的類。該類的定義截選如下:

【frameworks/base/core/java/android/app/LoadedApk.java】

static?final?class?ReceiverDispatcher? {final?static?class?InnerReceiver?extends?IIntentReceiver.Stub?{.?.?.?.?.?..?.?.?.?.?.}final?IIntentReceiver.Stub?mIIntentReceiver;???//?請注意這個域!它就是傳到外面的rd。final?BroadcastReceiver?mReceiver;final?Context?mContext;final?Handler?mActivityThread;final?Instrumentation?mInstrumentation;final?boolean?mRegistered;final?IntentReceiverLeaked?mLocation;RuntimeException?mUnregisterLocation;boolean?mForgotten;.?.?.?.?.?.

??????? 這樣看來,“動態注冊的BroadcastReceiver”和“ReceiverDispatcher節點”具有一一對應的關系。示意圖如下:

一個應用里可能會注冊多個動態receiver,所以這種一一對應關系最好整理成表,這個表就位于LoadedApk中。前文mPackageInfo.getReceiverDispatcher()一句中的mPackageInfo就是LoadedApk對象。

??????? 在Android的架構里,應用進程里是用LoadedApk來對應一個apk的,進程里加載了多少個apk,就會有多少LoadedApk。每個LoadedApk里會有一張“關于本apk動態注冊的所有receiver”的哈希表(mReceivers)。當然,在LoadedApk初創之時,這張表只是個空表。

??????? mReceivers表的定義如下:

private?final? HashMap<Context,?HashMap<BroadcastReceiver,?LoadedApk.ReceiverDispatcher>>?mReceivers=?new?HashMap<Context,?HashMap<BroadcastReceiver,?LoadedApk.ReceiverDispatcher>>();

該表的key項是我們比較熟悉的Context,也就是說可以是Activity、Service或Application。而value項則是另一張“子哈希表”。這是個“表中表”的形式。言下之意就是,每個Context(比如一個activity),是可以注冊多個receiver的,這個很好理解。mReceivers里的“子哈希表”的key值為BroadcastReceiver,value項為ReceiverDispatcher,示意圖如下:

圖:客戶進程中的mReceivers表

??????? 接下來我們繼續看registerReceiverInternal(),它最終調用到

ActivityManagerNative.getDefault().registerReceiver(mMainThread.getApplicationThread(),?mBasePackageName,rd,?filter,?broadcastPermission);

registerReceiver()函數的filter參數指明了用戶對哪些intent感興趣。對同一個BroadcastReceiver對象來說,可以注冊多個感興趣的filter,就好像聲明靜態receiver時,也可以為一個receiver編寫多個<intent-filter>一樣。這些IntentFilter信息會匯總到AMS的mRegisteredReceivers表中。在AMS端,我們可以這樣訪問相應的匯總表:

ReceiverList?rl?=?(ReceiverList)mRegisteredReceivers.get(receiver.asBinder());

其中的receiver參數為IIntentReceiver型,正對應著ReceiverDispatcher中那個binder實體。也就是說,每個客戶端的ReceiverDispatcher,會對應AMS端的一個ReceiverList。

??????? ReceiverList的定義截選如下:

class?ReceiverList?extends?ArrayList<BroadcastFilter>implements?IBinder.DeathRecipient? {final?ActivityManagerService?owner;?public?final?IIntentReceiver?receiver;????public?final?ProcessRecord?app;????public?final?int?pid;????public?final?int?uid;BroadcastRecord?curBroadcast?=?null;boolean?linkedToDeath?=?false;String?stringName;.?.?.?.?.?.

ReceiverList繼承于ArrayList<BroadcastFilter>,而BroadcastFilter又繼承于IntentFilter,所以ReceiverList可以被理解為一個IntentFilter數組列表。

class?BroadcastFilter?extends?IntentFilter?{final?ReceiverList?receiverList;final?String?packageName;final?String?requiredPermission;.?.?.?.?.?.

??????? 現在,我們可以繪制一張完整一點兒的圖:

這張圖只畫了一個用戶進程,在實際的系統里當然會有很多用戶進程了,不過其關系是大致統一的,所以我們不再重復繪制。關于動態receiver的注冊,我們就先說這么多。至于激發廣播時,又會做什么動作,我們會在后文闡述,現在我們先接著說明和動態receiver相對的靜態receiver。

?

2.2 靜態receiver

??????? 靜態receiver是指那些在AndroidManifest.xml文件中聲明的receiver,它們的信息會在系統啟動時,由Package Manager Service(PKMS)解析并記錄下來。以后,當AMS調用PKMS的接口來查詢“和intent匹配的組件”時,PKMS內部就會去查詢當初記錄下來的數據,并把結果返回AMS。有的同學認為靜態receiver是常駐內存的,這種說法并不準確。因為常駐內存的只是靜態receiver的描述性信息,并不是receiver實體本身。

??????? 在PKMS內部,會有一個針對receiver而設置的Resolver(決策器),其示意圖如下:

??????? 關于PKMS的查詢動作的細節,可參考PKMS的相關文檔。目前我們只需知道,PKMS向外界提供了queryIntentReceivers()函數,該函數可以返回一個List<ResolveInfo>列表。

??????? 我們舉個實際的例子:

Intent?intent?=?new?Intent(Intent.ACTION_PRE_BOOT_COMPLETED); List<ResolveInfo>?ris?=?null;try?{ris?=?AppGlobals.getPackageManager().queryIntentReceivers(intent,?null,?0,?0); }?catch?(RemoteException?e)?{}

這是AMS的systemReady()函數里的一段代碼,意思是查找有多少receiver對ACTION_PRE_BOOT_COMPLETED感興趣。

???????? ResolveInfo的定義截選如下:

public?class?ResolveInfo?implements?Parcelable? {????public?ActivityInfo?activityInfo;????public?ServiceInfo?serviceInfo;????public?IntentFilter?filter;????public?int?priority;????public?int?preferredOrder;????public?int?match;.?.?.?.?.?..?.?.?.?.?.

??????? 總之,當系統希望發出一個廣播時,PKMS必須能夠決策出,有多少靜態receiver對這個廣播感興趣,而且這些receiver的信息分別又是什么。

??????? 關于receiver的注冊動作,我們就先說這么多。下面我們來看看激發廣播時的動作。

?

3 激發廣播

??????? 大家常見的激發廣播的函數有哪些呢?從ContextImpl.java文件中,我們可以看到一系列發送廣播的接口,列舉如下:

  • public void sendBroadcast(Intent intent)

  • public void sendBroadcast(Intent intent, int userId)

  • public void sendBroadcast(Intent intent, String receiverPermission)

  • public void sendOrderedBroadcast(Intent intent, String receiverPermission)

  • public void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

  • public void sendStickyBroadcast(Intent intent)

  • public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

??????? 其中sendBroadcast()是最簡單的發送廣播的動作。而sendOrderedBroadcast(),則是用來向系統發出有序廣播(Ordered broadcast)的。這種有序廣播對應的所有接收器只能按照一定的優先級順序,依次接收intent。這些優先級一般記錄在AndroidManifest.xml文件中,具體位置在<intent-filter>元素的android:priority屬性中,其數值越大表示優先級越高,取值范圍為-1000到1000。另外,有時候我們也可以調用IntentFilter對象的setPriority()方法來設置優先級。

??????? 對于有序廣播而言,前面的接收者可以對接收到的廣播intent進行處理,并將處理結果放置到廣播intent中,然后傳遞給下一個接收者。需要注意的是,前面的接收者有權終止廣播的進一步傳播。也就是說,如果廣播被前面的接收者終止了,那么后面的接收器就再也無法接收到廣播了。

??????? 還有一個怪東西,叫做sticky廣播,它又是什么呢?簡單地說,sticky廣播可以保證“在廣播遞送時尚未注冊的receiver”,一旦日后注冊進系統,就能夠馬上接到“錯過”的sticky廣播。有關它的細節,我們在后文再說。

??????? 在發送方,我們熟悉的調用sendBroadcast()的代碼片段如下:

mContext?=?getApplicationContext();? Intent?intent?=?new?Intent();?? intent.setAction("com.android.xxxxx");?? intent.setFlags(1);?? mContext.sendBroadcast(intent);

上面的mContext的內部其實是在調用一個ContextImpl對象的同名函數,所以我們繼續查看ContextImpl.java文件。

【frameworks/base/core/java/android/app/ContextImpl.java】

@Override public?void?sendBroadcast(Intent?intent)? {String?resolvedType?=?intent.resolveTypeIfNeeded(getContentResolver());????try?{intent.setAllowFds(false);ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),?intent,?resolvedType,?null,Activity.RESULT_OK,?null,?null,?null,?false,?false,Binder.getOrigCallingUser());}?catch?(RemoteException?e)?{} }

簡單地調用broadcastIntent()向AMS發出請求了。

?

3.1 AMS一側的broadcastIntentLocked()

??????? 用戶進程把發送廣播的語義傳遞到AMS之后,最終會由AMS的broadcastIntentLocked()處理。其原型如下:

private?final?int?broadcastIntentLocked(ProcessRecord?callerApp, ????????????????????????????????????????String?callerPackage,? ????????????????????????????????????????Intent?intent,?String?resolvedType, ????????????????????????????????????????IIntentReceiver?resultTo,?int?resultCode,? ????????????????????????????????????????String?resultData, ????????????????????????????????????????Bundle?map,?String?requiredPermission, ????????????????????????????????????????boolean?ordered,?boolean?sticky,? ????????????????????????????????????????int?callingPid,?int?callingUid,??????????????????? ????????????????????????????????????????int?userId)

broadcastIntentLocked()需要考慮以下方面的技術細節。

??????? 首先,有些廣播intent只能由具有特定權限的進程發送,而有些廣播intent在發送之前需要做一些其他動作。當然,如果發送方進程是系統進程、phone進程、shell進程,或者具有root權限的進程,那么必然有權發出廣播。

??????? 另外,有時候用戶希望發送sticky廣播,以便日后注冊的receiver可以收到“錯過”的sticky廣播。要達到這個目的,系統必須在內部維護一張sticky廣播表,在具體的實現中,AMS會把廣播intent加入mStickyBroadcasts映射表中。mStickyBroadcasts是一張哈希映射表,其key值為intent的action字符串,value值為“與這個action對應的intent數組列表”的引用。當我們發送sticky廣播時,新的廣播intent要么替換掉intent數組列表中的某項,要么作為一個新項被添加進數組列表,以備日后使用。

??????? 發送廣播時,還需要考慮所發送的廣播是否需要有序(ordered)遞送。而且,receiver本身又分為動態注冊和靜態聲明的,這讓我們面對的情況更加復雜。從目前的代碼來看,靜態receiver一直是按照有序方式遞送的,而動態receiver則需要根據ordered參數的值,做不同的處理。當我們需要有序遞送時,AMS會把動態receivers和靜態receivers合并到一張表中,這樣才能依照receiver的優先級,做出正確的處理,此時動態receivers和靜態receivers可能呈現一種交錯順序。

??????? 另一方面,有些廣播是需要發給特定目標組件的,這個也要加以考慮。

??????? 現在我們來分析broadcastIntentLocked()函數。說得難聽點兒,這個函數的實現代碼頗有些裹腳布的味道,我們必須耐下性子解讀這部分代碼。經過一番努力,我們可以將其邏輯大致整理成以下幾步:

1) 為intent添加FLAG_EXCLUDE_STOPPED_PACKAGES標記;?
2) 處理和package相關的廣播;?
3) 處理其他一些系統廣播;?
4) 判斷當前是否有權力發出廣播;?
5) 如果要發出sticky廣播,那么要更新一下系統中的sticky廣播列表;?
6) 查詢和intent匹配的靜態receivers;?
7) 查詢和intent匹配的動態receivers;?
8) 嘗試向并行receivers遞送廣播;?
9) 整合(剩下的)并行receivers,以及靜態receivers,形成一個串行receivers表;?
10) 嘗試逐個向串行receivers遞送廣播。

??????? 下面我們來詳細說這幾個部分。

3.1.1 為intent添加FLAG_EXCLUDE_STOPPED_PACKAGES標記

??????? 對應的代碼為:

intent?=?new?Intent(intent);//?By?default?broadcasts?do?not?go?to?stopped?apps.intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);

??????? 為什么intent要添加FLAG_EXCLUDE_STOPPED_PACKAGES標記呢?原因是這樣的,在Android 3.1之后,PKMS加強了對“處于停止狀態的”應用的管理。如果一個應用在安裝后從來沒有啟動過,或者已經被用戶強制停止了,那么這個應用就處于停止狀態(stopped state)。為了達到精細調整的目的,Android增加了2個flag:FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES,以此來表示intent是否要激活“處于停止狀態的”應用。

/***?If?set,?this?intent?will?not?match?any?components?in?packages?that*?are?currently?stopped.??If?this?is?not?set,?then?the?default?behavior*?is?to?include?such?applications?in?the?result.*/ public?static?final?int?FLAG_EXCLUDE_STOPPED_PACKAGES?=?0x00000010; /***?If?set,?this?intent?will?always?match?any?components?in?packages?that*?are?currently?stopped.??This?is?the?default?behavior?when*?{@link?#FLAG_EXCLUDE_STOPPED_PACKAGES}?is?not?set.??If?both?of?these*?flags?are?set,?this?one?wins?(it?allows?overriding?of?exclude?for*?places?where?the?framework?may?automatically?set?the?exclude?flag).*/ public?static?final?int?FLAG_INCLUDE_STOPPED_PACKAGES?=?0x00000020;

??????? 從上面的broadcastIntentLocked()函數可以看到,在默認情況下,AMS是不會把intent廣播發給“處于停止狀態的”應用的。據說Google這樣做是為了防止一些流氓軟件或病毒干壞事。當然,如果廣播的發起者認為自己的確需要廣播到“處于停止狀態的”應用的話,它可以讓intent攜帶FLAG_INCLUDE_STOPPED_PACKAGES標記,從這個標記的注釋可以了解到,如果這兩個標記同時設置的話,那么FLAG_INCLUDE_STOPPED_PACKAGES標記會“取勝”,它會覆蓋掉framework自動添加的FLAG_EXCLUDE_STOPPED_PACKAGES標記。

3.1.2 處理和package相關的廣播

??????? 接下來需要處理一些系統級的“Package廣播”,這些主要從PKMS(Package Manager Service)處發來。比如,當PKMS處理APK的添加、刪除或改動時,一般會發出類似下面的廣播:ACTION_PACKAGE_ADDED、ACTION_PACKAGE_REMOVED、ACTION_PACKAGE_CHANGED、ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE、ACTION_UID_REMOVED。

??????? AMS必須確保發送“包廣播”的發起方具有BROADCAST_PACKAGE_REMOVED權限,如果沒有,那么AMS會拋出異常(SecurityException)。接著,AMS判斷如果是某個用戶id被刪除了的話(Intent.ACTION_UID_REMOVED),那么必須把這件事通知給“電池狀態服務”(Battery Stats Service)。另外,如果是SD卡等外部設備上的應用不可用了,這常常是因為卡被unmount了,此時PKMS會發出Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE,而AMS則需要把SD卡上的所有包都強制停止(forceStopPackageLocked()),并立即發出另一個“Package廣播”——EXTERNAL_STORAGE_UNAVAILABLE。

??????? 如果只是某個外部包被刪除或改動了,則要進一步判斷intent里是否攜帶了EXTRA_DONT_KILL_APP額外數據,如果沒有攜帶,說明需要立即強制結束package,否則,不強制結束package。看來有些應用即使在刪除或改動了包后,還會在系統(內存)中保留下來并繼續運行。另外,如果是刪除包的話,此時要發出PACKAGE_REMOVED廣播。

3.1.3 處理其他一些系統廣播

??????? broadcastIntentLocked()不但要對“Package廣播”進行處理,還要關心其他一些系統廣播。比如ACTION_TIMEZONE_CHANGED、ACTION_CLEAR_DNS_CACHE、PROXY_CHANGE_ACTION等等,感興趣的同學可以自行研究這些廣播的意義。

3.1.4 判斷當前是否有權力發出廣播

??????? 接著,broadcastIntentLocked()會判斷當前是否有權力發出廣播,代碼截選如下:

/**?Prevent?non-system?code?(defined?here?to?be?non-persistent*?processes)?from?sending?protected?broadcasts.*/ if?(callingUid?==?Process.SYSTEM_UID?||?callingUid?==?Process.PHONE_UID||?callingUid?==?Process.SHELL_UID?||?callingUid?==?0)? {//?Always?okay. }? else?if?(callerApp?==?null?||?!callerApp.persistent)? {try?{if?(AppGlobals.getPackageManager().isProtectedBroadcast(intent.getAction()))?{String?msg?=?"Permission?Denial:?not?allowed?to?send?broadcast?"+?intent.getAction()?+?"?from?pid="+?callingPid?+?",?uid="?+?callingUid;Slog.w(TAG,?msg);throw?new?SecurityException(msg);}}?catch?(RemoteException?e)?{Slog.w(TAG,?"Remote?exception",?e);return?ActivityManager.BROADCAST_SUCCESS;} }

??????? 如果發起方的Uid為SYSTEM_UID、PHONE_UID或SHELL_UID,或者發起方具有root權限,那么它一定有權力發送廣播。

??????? 另外,還有一個“保護性廣播”的概念,也要考慮進來。網上有一些人詢問AndroidManifest.xml中的一級標記<protected-broadcast>是什么意思。簡單地說,Google認為有一些廣播是只能由系統發送的,如果某個系統級AndroidManifest.xml中寫了這個標記,那么在PKMS解析該文件時,就會把“保護性廣播”標記中的名字(一般是Action字符串)記錄下來。在系統運作起來之后,如果某個不具有系統權限的應用試圖發送系統中的“保護性廣播”,那么到AMS的broadcastIntentLocked()處就會被攔住,AMS會拋出異常,提示"Permission Denial: not allowed to send broadcast"。

??????? 我們在frameworks/base/core/res/AndroidManifest.xml文件中,可以看到<protected-broadcast>標記的具體寫法,截選如下:

?

3.1.5 必要時更新一下系統中的sticky廣播列表

??????? 接著,broadcastIntentLocked()中會判斷當前是否在發出sticky廣播,如果是的話,必須把廣播intent記錄下來。

??????? 一開始會判斷一下發起方是否具有發出sticky廣播的能力,比如說要擁有android.Manifest.permission.BROADCAST_STICKY權限等等。判斷合格后,broadcastIntentLocked()會更新AMS里的一張表——mStickyBroadcasts,其大致代碼如下:

????ArrayList<Intent>?list?=?mStickyBroadcasts.get(intent.getAction());if?(list?==?null)?{list?=?new?ArrayList<Intent>();mStickyBroadcasts.put(intent.getAction(),?list);}int?N?=?list.size();int?i;for?(i=0;?i<N;?i++)?{if?(intent.filterEquals(list.get(i)))?{//?This?sticky?already?exists,?replace?it.list.set(i,?new?Intent(intent));break;}}if?(i?>=?N)?{list.add(new?Intent(intent));}

mStickyBroadcasts的定義是這樣的:

????final?HashMap<String,?ArrayList<Intent>>?mStickyBroadcasts?=new?HashMap<String,?ArrayList<Intent>>();

上面代碼的filterEquals()函數會比較兩個intent的action、data、type、class以及categories等信息,但不會比較extra數據。如果兩個intent的action是一樣的,但其他信息不同,那么它們在ArrayList<Intent>中會被記成兩個不同的intent。而如果發現新發送的intent在ArrayList中已經有個“相等的”舊intent時,則會用新的替掉舊的。

??????? 以后,每當注冊新的動態receiver時,注冊動作中都會遍歷一下mStickyBroadcast表,看哪些intent可以和新receiver的filter匹配,只有匹配的intent才會遞送給新receiver,示意圖如下:

圖中新receiver的filter只對a1和a3這兩個action感興趣,所以遍歷時就不會考慮mStickyBroadcast表中的a2表項對應的子表,而a1、a3子表所對應的若干intent中又只有一部分可以和filter匹配,比如a1的intent1以及a3的intent2,所以圖中只選擇了這兩個intent遞送給新receiver。

??????? 除了記入mStickyBoradcast表的動作以外,sticky廣播和普通廣播在broadcastIntentLocked()中的代碼是一致的,并沒有其他什么不同了。

?

3.1.6 嘗試向并行receivers遞送廣播

??????? 然后broadcastIntentLocked()會嘗試向并行receivers遞送廣播。此時會調用到queue.scheduleBroadcastsLocked()。相關代碼截選如下:

int?NR?=?registeredReceivers?!=?null???registeredReceivers.size()?:?0; if?(!ordered?&&?NR?>?0)? {//?If?we?are?not?serializing?this?broadcast,?then?send?the//?registered?receivers?separately?so?they?don't?wait?for?the//?components?to?be?launched.final?BroadcastQueue?queue?=?broadcastQueueForIntent(intent);BroadcastRecord?r?=?new?BroadcastRecord(queue,?intent,?callerApp,callerPackage,?callingPid,?callingUid,?requiredPermission,registeredReceivers,?resultTo,?resultCode,?resultData,?map,ordered,?sticky,?false);if?(DEBUG_BROADCAST)?Slog.v(TAG,?"Enqueueing?parallel?broadcast?"?+?r);final?boolean?replaced?=?replacePending?&&?queue.replaceParallelBroadcastLocked(r);if?(!replaced)?{queue.enqueueParallelBroadcastLocked(r);queue.scheduleBroadcastsLocked();????//?注意這句。。。}registeredReceivers?=?null;NR?=?0; }

簡單地說就是,new一個BroadcastRecord節點,并插入BroadcastQueue內的并行處理隊列,最后發起實際的廣播調度(scheduleBroadcastsLocked())。關于上面代碼中的registeredReceivers列表,我們會在后文說明,這里先跳過。

??????? 其實不光并行處理部分需要一個BroadcastRecord節點,串行處理部分也需要BroadcastRecord節點。也就是說,要激發一次廣播,AMS必須構造一個或兩個BroadcastRecord節點,并將之插入合適的廣播隊列(mFgBroadcastQueue或mBgBroadcastQueue)。插入成功后,再執行隊列的scheduleBroadcastsLocked()動作,進行實際的派發調度。示意圖如下:

請注意圖中BroadcastRecord節點所攜帶的節點鏈。在mParallelBroadcasts表中,每個BroadcastRecord只可能攜帶BroadcastFilter,因為平行處理的節點只會對應動態receiver,而所有靜態receiver只能是串行處理的。另一方面,在mOrderedBroadcasts表中,BroadcastRecord中則既可能攜帶BroadcastFilter,也可能攜帶ResolveInfo。這個其實很容易理解,首先,ResolveInfo對應靜態receiver,放到這里自不待言,其次,如果用戶在發送廣播時明確指定要按ordered方式發送的話,那么即使目標方的receiver是動態注冊的,它對應的BroadcastFilter也會被強制放到這里。

??????? 好,現在讓我們再整合一下思路。BroadcastRecord節點內部的receivers列表,記錄著和這個廣播動作相關的目標receiver信息,該列表內部的子節點可能是ResolveInfo類型的,也可能是BroadcastFilter類型的。ResolveInfo是從PKMS處查到的靜態receiver的描述信息,它的源頭是PKMS分析的那些AndroidManifest.xml文件。而BroadcastFilter事實上來自于本文一開始闡述動態receiver時,提到的AMS端的mRegisteredReceivers哈希映射表。現在,我們再畫一張示意圖:

因為BroadcastRecord里的BroadcastFilter,和AMS的mRegisteredReceivers表中(間接)所指的對應BroadcastFilter是同一個對象,所以我是用虛線將它們連起來的。

???????? Ok,我們接著看scheduleBroadcastsLocked()動作。scheduleBroadcastsLocked()的代碼如下:

【frameworks/base/services/java/com/android/server/am/BroadcastQueue.java】

public?void?scheduleBroadcastsLocked()? {.?.?.?.?.?.if?(mBroadcastsScheduled)?{return;}mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG,?this));mBroadcastsScheduled?=?true; }

發出BROADCAST_INTENT_MSG消息。

??????? 上面用到的mHandler是這樣創建的:

final?Handler?mHandler?=?new?Handler()? {public?void?handleMessage(Message?msg)?{switch?(msg.what)?{case?BROADCAST_INTENT_MSG:?{if?(DEBUG_BROADCAST)?Slog.v(TAG,?"Received?BROADCAST_INTENT_MSG");processNextBroadcast(true);}?break;case?BROADCAST_TIMEOUT_MSG:?{synchronized?(mService)?{broadcastTimeoutLocked(true);}}?break;}} };

?????? 也就是說,AMS端會在BroadcastQueue.java中的processNextBroadcast()具體處理廣播。

?

3.1.7 整理兩個receiver列表

??????? 我們前文已經說過,有些廣播是需要有序遞送的。為了合理處理“有序遞送”和“平行遞送”,broadcastIntentLocked()函數內部搞出了兩個list:

List?receivers?=?null; List<BroadcastFilter>?registeredReceivers?=?null;

其中,receivers主要用于記錄“有序遞送”的receiver,而registeredReceivers則用于記錄與intent相匹配的動態注冊的receiver。

??????? 關于這兩個list的大致運作是這樣的,我們先利用包管理器的queryIntentReceivers()接口,查詢出和intent匹配的所有靜態receivers,此時所返回的查詢結果本身已經排好序了,因此,該返回值被直接賦值給了receivers變量,代碼如下:

receivers?=?AppGlobals.getPackageManager().queryIntentReceivers(intent,?resolvedType,?STOCK_PM_FLAGS,?userId);

而對于動態注冊的receiver信息,就不是從包管理器獲取了,這些信息本來就記錄在AMS之中,此時只需調用:

registeredReceivers?=?mReceiverResolver.queryIntent(intent,?resolvedType,?false,?userId);

就可以了。注意,此時返回的registeredReceivers中的子項是沒有經過排序的。而關于PKMS的queryIntentReceivers(),我們可以參考PKMS的專題文檔,此處不再贅述。

??????? 如果我們要“并行遞送”廣播, registeredReceivers中的各個receiver會在隨后的queue.scheduleBroadcastsLocked()動作中被并行處理掉。如果大家折回頭看看向并行receivers遞送廣播的代碼,會發現在調用完queue.scheduleBroadcastsLocked()后,registeredReceivers會被強制賦值成null值。

??????? 如果我們要“串行遞送”廣播,那么必須考慮把registeredReceivers表合并到receivers表中去。我們知道,一開始receivers列表中只記錄了一些靜態receiver,這些receiver將會被“有序遞送”。現在我們只需再遍歷一下registeredReceivers列表,并將其中的每個子項插入到receivers列表的合適地方,就可以合并出一條順序列表了。當然,如果registeredReceivers已經被設為null了,就無所謂合并了。

??????? 為什么靜態聲明的receiver只會“有序遞送”呢?我想也許和這種receiver的復雜性有關系,因為在需要遞送廣播時,receiver所屬的進程可能還沒有啟動呢,所以也許會涉及到啟動進程的流程,這些都是比較復雜的流程。

??????? 當然,上面所說的是沒有明確指定目標組件的情況,如果intent里含有明確的目標信息,那么就不需要調用包管理器的queryIntentReceivers()了,只需new一個ArrayList,并賦值給receivers,然后把目標組件對應的ResolveInfo信息添加進receivers數組列表即可。

?

3.1.8 嘗試逐個向串行receivers遞送廣播

??????? 當receivers列表整理完畢之后,現在要開始嘗試逐個向串行receivers遞送廣播了。正如前文所說,這里要重新new一個新的BroadcastRecord節點:

if?((receivers?!=?null?&&?receivers.size()?>?0)||?resultTo?!=?null)? {BroadcastQueue?queue?=?broadcastQueueForIntent(intent);BroadcastRecord?r?=?new?BroadcastRecord(queue,?intent,?callerApp,callerPackage,?callingPid,?callingUid,?requiredPermission,receivers,?resultTo,?resultCode,?resultData,?map,?ordered,sticky,?false);.?.?.?.?.?.boolean?replaced?=?replacePending?&&?queue.replaceOrderedBroadcastLocked(r);?if?(!replaced)?{queue.enqueueOrderedBroadcastLocked(r);queue.scheduleBroadcastsLocked();} }

而scheduleBroadcastsLocked()最終會間接導致走到 BroadcastQueue.java中的processNextBroadcast()。這一點和前文所說的“向并行receivers遞送廣播”的動作基本一致。

??????? 下面我們來看,遞送廣播動作中最重要的processNextBroadcast()。

?

3.2 最重要的processNextBroadcast()

??????? 從processNextBroadcast()的代碼,我們就可以看清楚前面說的“平行廣播”、“有序廣播”和“動態receiver”、“靜態receiver”之間的關系了。

??????? 我們在前文已經說過,所有的靜態receiver都是串行處理的,而動態receiver則會按照發廣播時指定的方式,進行“并行”或“串行”處理。能夠并行處理的廣播,其對應的若干receiver一定都已經存在了,不會牽扯到啟動新進程的操作,所以可以在一個while循環中,一次性全部deliver。而有序廣播,則需要一個一個地處理,其滾動處理的手段是發送事件,也就是說,在一個receiver處理完畢后,會利用廣播隊列(BroadcastQueue)的mHandler,發送一個BROADCAST_INTENT_MSG事件,從而執行下一次的processNextBroadcast()。

??????? processNextBroadcast()的代碼邏輯大體是這樣的:先嘗試處理BroadcastQueue中的“平行廣播”部分。這需要遍歷并行列表(mParallelBroadcasts)的每一個BroadcastRecord以及其中的receivers列表。對于平行廣播而言,receivers列表中的每個子節點是個BroadcastFilter。我們直接將廣播遞送出去即可:

while?(mParallelBroadcasts.size()?>?0)? {r?=?mParallelBroadcasts.remove(0);r.dispatchTime?=?SystemClock.uptimeMillis();r.dispatchClockTime?=?System.currentTimeMillis();final?int?N?=?r.receivers.size();.?.?.?.?.?.?for?(int?i=0;?i<N;?i++)?{Object?target?=?r.receivers.get(i);.?.?.?.?.?.deliverToRegisteredReceiverLocked(r,?(BroadcastFilter)target,?false);}.?.?.?.?.?. }

?

3.2.1 用deliverToRegisteredReceiverLocked()遞送到平行動態receiver

??????? deliverToRegisteredReceiverLocked()的代碼截選如下:

【frameworks/base/services/java/com/android/server/am/BroadcastQueue.java】

private?final?void?deliverToRegisteredReceiverLocked(BroadcastRecord?r,BroadcastFilter?filter,?boolean?ordered)? {.?.?.?.?.?..?.?.?.?.?.if?(!skip)?{if?(ordered)?{r.receiver?=?filter.receiverList.receiver.asBinder();r.curFilter?=?filter;filter.receiverList.curBroadcast?=?r;r.state?=?BroadcastRecord.CALL_IN_RECEIVE;if?(filter.receiverList.app?!=?null)?{r.curApp?=?filter.receiverList.app;filter.receiverList.app.curReceiver?=?r;mService.updateOomAdjLocked();}}.?.?.?.?.?.performReceiveLocked(filter.receiverList.app,?filter.receiverList.receiver,new?Intent(r.intent),?r.resultCode,r.resultData,?r.resultExtras,?r.ordered,?r.initialSticky);if?(ordered)?{r.state?=?BroadcastRecord.CALL_DONE_RECEIVE;}.?.?.?.?.?. }

?

private?static?void?performReceiveLocked(ProcessRecord?app,?IIntentReceiver?receiver, ????????Intent?intent,?int?resultCode,?String?data,?Bundle?extras, ????????boolean?ordered,?boolean?sticky)?throws?RemoteException? {//?Send?the?intent?to?the?receiver?asynchronously?using?one-way?binder?calls.if?(app?!=?null?&&?app.thread?!=?null)?{//?If?we?have?an?app?thread,?do?the?call?through?that?so?it?is//?correctly?ordered?with?other?one-way?calls.app.thread.scheduleRegisteredReceiver(receiver,?intent,?resultCode,data,?extras,?ordered,?sticky);}?else?{receiver.performReceive(intent,?resultCode,?data,?extras,?ordered,?sticky);} }

終于通過app.thread向用戶進程傳遞語義了。注意scheduleRegisteredReceiver()的receiver參數,它對應的就是前文所說的ReceiverDispatcher的Binder實體——InnerReceiver了。

??????? 總之,當語義傳遞到用戶進程的ApplicationThread以后,走到:

//?This?function?exists?to?make?sure?all?receiver?dispatching?is //?correctly?ordered,?since?these?are?one-way?calls?and?the?binder?driver //?applies?transaction?ordering?per?object?for?such?calls. public?void?scheduleRegisteredReceiver(IIntentReceiver?receiver,?Intent?intent, ????????int?resultCode,?String?dataStr,?Bundle?extras,?boolean?ordered, ????????boolean?sticky)?throws?RemoteException? {receiver.performReceive(intent,?resultCode,?dataStr,?extras,?ordered,?sticky); }

終于走到ReceiverDispatcher的InnerReceiver了:

static?final?class?ReceiverDispatcher? {final?static?class?InnerReceiver?extends?IIntentReceiver.Stub?{.?.?.?.?.?..?.?.?.?.?.public?void?performReceive(Intent?intent,?int?resultCode, ???????????????????????????????????String?data,?Bundle?extras,? ???????????????????????????????????boolean?ordered,?boolean?sticky)?{LoadedApk.ReceiverDispatcher?rd?=?mDispatcher.get();.?.?.?.?.?.if?(rd?!=?null)?{rd.performReceive(intent,?resultCode,?data,?extras,ordered,?sticky);}?.?.?.?.?.?.}}.?.?.?.?.?.public?void?performReceive(Intent?intent,?int?resultCode, ???????????????????????????????String?data,?Bundle?extras,? ???????????????????????????????boolean?ordered,?boolean?sticky)?{.?.?.?.?.?.Args?args?=?new?Args(intent,?resultCode,?data,?extras,?ordered,?sticky);if?(!mActivityThread.post(args))?//?請注意這一句!{if?(mRegistered?&&?ordered)?{IActivityManager?mgr?=?ActivityManagerNative.getDefault();if?(ActivityThread.DEBUG_BROADCAST)?Slog.i(ActivityThread.TAG,"Finishing?sync?broadcast?to?"?+?mReceiver);args.sendFinished(mgr);}}} }

請注意mActivityThread.post(args)一句,這樣,事件泵最終會回調Args參數的run()成員函數:

final?class?Args?extends?BroadcastReceiver.PendingResult?implements?Runnable? {.?.?.?.?.?..?.?.?.?.?.public?void?run()?{final?BroadcastReceiver?receiver?=?mReceiver;.?.?.?.?.?.try?{ClassLoader?cl?=??mReceiver.getClass().getClassLoader();intent.setExtrasClassLoader(cl);setExtrasClassLoader(cl);receiver.setPendingResult(this);receiver.onReceive(mContext,?intent);??//?回調具體receiver的onReceive()}?catch?(Exception?e)?{.?.?.?.?.?.}if?(receiver.getPendingResult()?!=?null)?{finish();}.?.?.?.?.?.} }

其中的那句receiver.onReceive(this),正是回調我們具體receiver的onReceive()成員函數的地方。噢,終于看到應用程序員熟悉的onReceive()了。這部分的示意圖如下:

3.2.2 靜態receiver的遞送

??????? 說完動態遞送,我們再來看靜態遞送。對于靜態receiver,情況會復雜很多,因為靜態receiver所從屬的進程有可能還沒有運行起來呢。此時BroadcastRecord節點中記錄的子列表的節點是ResolveInfo對象。

ResolveInfo?info?=?(ResolveInfo)nextReceiver; .?.?.?.?.?. r.state?=?BroadcastRecord.APP_RECEIVE; String?targetProcess?=?info.activityInfo.processName;

那么我們要先找到receiver所從屬的進程的進程名。

???????? processNextBroadcast()中啟動進程的代碼如下:

ProcessRecord?app?=?mService.getProcessRecordLocked(targetProcess,? info.activityInfo.applicationInfo.uid); .?.?.?.?.?. if?(app?!=?null?&&?app.thread?!=?null)? {.?.?.?.?.?.app.addPackage(info.activityInfo.packageName);processCurBroadcastLocked(r,?app);return;.?.?.?.?.?. } r.curApp?=?mService.startProcessLocked(targetProcess,info.activityInfo.applicationInfo,?true,r.intent.getFlags()?|?Intent.FLAG_FROM_BACKGROUND,"broadcast",?r.curComponent,??????????????(r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE)?!=?0,?false) .?.?.?.?.?. mPendingBroadcast?=?r; mPendingBroadcastRecvIndex?=?recIdx;

??????? 如果目標進程已經存在了,那么app.thread肯定不為null,直接調用processCurBroadcastLocked()即可,否則就需要啟動新進程了。啟動的過程是異步的,可能很耗時,所以要把BroadcastRecord節點記入mPendingBroadcast。

3.2.2.1 processCurBroadcastLocked()

??????? 我們先說processCurBroadcastLocked()。

private?final?void?processCurBroadcastLocked(BroadcastRecord?r, ????????????????????????ProcessRecord?app)?throws?RemoteException? {.?.?.?.?.?.r.receiver?=?app.thread.asBinder();r.curApp?=?app;app.curReceiver?=?r;.?.?.?.?.?..?.?.?.?.?.app.thread.scheduleReceiver(new?Intent(r.intent),?r.curReceiver,mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),r.resultCode,?r.resultData,?r.resultExtras,?r.ordered);.?.?.?.?.?.started?=?true;.?.?.?.?.?. }

其中最重要的是調用app.thread.scheduleReceiver()的那句。在IApplicationThread接口中,是這樣定義scheduleReceiver()函數原型的:

void?scheduleReceiver(Intent?intent,?ActivityInfo?info,? ??????????????????????CompatibilityInfo?compatInfo,?????????????????????? ??????????????????????int?resultCode,?String?data,? ??????????????????????Bundle?extras,?boolean?sync)?throws?RemoteException;

其中ActivityInfo info參數,記錄著目標receiver的信息。可以看到,遞送靜態receiver時,是不會用到RecevierDispatcher的。

??????? 用戶進程里handleMessage()

case?RECEIVER:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,?"broadcastReceiveComp");handleReceiver((ReceiverData)msg.obj);maybeSnapshot();Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);????break;

??????? ActivityThread中,會運用反射機制,創建出BroadcastReceiver對象,而后回調該對象的onReceive()成員函數。

private?void?handleReceiver(ReceiverData?data)? {.?.?.?.?.?.IActivityManager?mgr?=?ActivityManagerNative.getDefault();BroadcastReceiver?receiver;try?{java.lang.ClassLoader?cl?=?packageInfo.getClassLoader();data.intent.setExtrasClassLoader(cl);data.setExtrasClassLoader(cl);receiver?=?(BroadcastReceiver)cl.loadClass(component).newInstance();}?catch?(Exception?e)?{.?.?.?.?.?.}try?{.?.?.?.?.?.receiver.setPendingResult(data);receiver.onReceive(context.getReceiverRestrictedContext(),?data.intent);}?catch?(Exception?e)?{.?.?.?.?.?.}?finally?{sCurrentBroadcastIntent.set(null);}if?(receiver.getPendingResult()?!=?null)?{data.finish();} }

3.2.2.2 必要時啟動新進程

??????? 現在我們回過頭來看,在目標進程尚未啟動的情況下,是如何完成遞送的。剛剛我們已經看到調用startProcessLocked()的句子了,只要不出問題,目標進程成功啟動后就會調用AMS的attachApplication()。

??????? 有關attachApplication()的詳情,請參考其他關于AMS的文檔,此處我們只需知道它里面又會調用attachApplicationLocked()函數。

private?final?boolean?attachApplicationLocked(IApplicationThread?thread,?int?pid)

attachApplicationLocked()內有這么幾句:

//?Check?if?a?next-broadcast?receiver?is?in?this?process... if?(!badApp?&&?isPendingBroadcastProcessLocked(pid))?{try?{didSomething?=?sendPendingBroadcastsLocked(app);}?catch?(Exception?e)?{//?If?the?app?died?trying?to?launch?the?receiver?we?declare?it?'bad'badApp?=?true;} }

它們的意思是,如果新啟動的進程就是剛剛mPendingBroadcast所記錄的進程的話,此時AMS就會執行sendPendingBroadcastsLocked(app)一句。

?

//?The?app?just?attached;?send?any?pending?broadcasts?that?it?should?receive boolean?sendPendingBroadcastsLocked(ProcessRecord?app)?{boolean?didSomething?=?false;for?(BroadcastQueue?queue?:?mBroadcastQueues)?{didSomething?|=?queue.sendPendingBroadcastsLocked(app);}return?didSomething; }

BroadcastQueue的sendPendingBroadcastsLocked()函數如下:

public?boolean?sendPendingBroadcastsLocked(ProcessRecord?app)?{boolean?didSomething?=?false;final?BroadcastRecord?br?=?mPendingBroadcast;if?(br?!=?null?&&?br.curApp.pid?==?app.pid)?{try?{mPendingBroadcast?=?null;processCurBroadcastLocked(br,?app);didSomething?=?true;}?catch?(Exception?e)?{.?.?.?.?.?.}}return?didSomething; }

可以看到,既然目標進程已經成功啟動了,那么mPendingBroadcast就可以賦值為null了。接著,sendPendingBroadcastsLocked()會調用前文剛剛闡述的processCurBroadcastLocked(),其內再通過app.thread.scheduleReceiver(),將語義發送到用戶進程,完成真正的廣播遞送。這部分在上一小節已有闡述,這里就不多說了。

?

3.2.3 說說有序廣播是如何循環起來的?

??????? 我們知道,平行廣播的循環很簡單,只是在一個while循環里對每個動態receiver執行deliverToRegisteredReceiverLocked()即可。而對有序廣播來說,原則上每次processNextBroadcast()只會處理一個BroadcastRecord的一個receiver而已。當然,此時摘下的receiver既有可能是動態注冊的,也有可能是靜態的。

??????? 對于動態注冊的receiver,目標進程處理完廣播之后,會間接調用am.finishReceiver()向AMS發出反饋,關于這一步,其實在前面羅列ReceiverDispatcher的performReceive()時已經出現過了,我們再列一下:

public?void?performReceive(Intent?intent,?int?resultCode, ???????????????????????????String?data,?Bundle?extras,? ???????????????????????????boolean?ordered,?boolean?sticky)? {.?.?.?.?.?.Args?args?=?new?Args(intent,?resultCode,?data,?extras,?ordered,?sticky);if?(!mActivityThread.post(args))?{if?(mRegistered?&&?ordered)?{IActivityManager?mgr?=?ActivityManagerNative.getDefault();.?.?.?.?.?.args.sendFinished(mgr);??//?請注意這一句!}} }

Args繼承于BroadcastReceiver.PendingResult,它調用的sendFinished()就是PendingResult的sendFinished():

public?void?sendFinished(IActivityManager?am)? {synchronized?(this)?{if?(mFinished)?{throw?new?IllegalStateException("Broadcast?already?finished");}mFinished?=?true;try?{if?(mResultExtras?!=?null)?{mResultExtras.setAllowFds(false);}if?(mOrderedHint)?{am.finishReceiver(mToken,?mResultCode,?mResultData,?mResultExtras,mAbortBroadcast);}?else?{//?This?broadcast?was?sent?to?a?component;?it?is?not?ordered,//?but?we?still?need?to?tell?the?activity?manager?we?are?done.am.finishReceiver(mToken,?0,?null,?null,?false);}}?catch?(RemoteException?ex)?{}} }

代碼中的am.finishReceiver()會通知AMS,表示用戶側receiver已經處理好了,或者至少告一段落了,請AMS進行下一步動作。

??????? 而對于動態注冊的receiver,情況是類似的,最終也是調用am.finishReceiver()向AMS發出回饋的,只不過發起的動作是在ActivityThread的handleReceiver()動作中。前文已經列過這個函數了,大家注意下面的句子即可:

private?void?handleReceiver(ReceiverData?data)? {.?.?.?.?.?.receiver.setPendingResult(data);receiver.onReceive(context.getReceiverRestrictedContext(),data.intent);.?.?.?.?.?.if?(receiver.getPendingResult()?!=?null)?{data.finish();} }

ReceiverData也是繼承于BroadcastReceiver.PendingResult的,它調用的finish()是PendingResult的finish():

public?final?void?finish()? {if?(mType?==?TYPE_COMPONENT)?{.?.?.?.?.?.}?else?if?(mOrderedHint?&&?mType?!=?TYPE_UNREGISTERED)?{if?(ActivityThread.DEBUG_BROADCAST)?Slog.i(ActivityThread.TAG,"Finishing?broadcast?to?"?+?mToken);final?IActivityManager?mgr?=?ActivityManagerNative.getDefault();sendFinished(mgr);} }

此處的sendFinished()內部最終也會調用到am.finishReceiver(),向AMS通告receiver已經處理好了。

???????? AMS側在收到finishReceiver語義后,執行:

public?void?finishReceiver(IBinder?who,?int?resultCode,?String?resultData, ????????Bundle?resultExtras,?boolean?resultAbort)? {.?.?.?.?.?.try?{boolean?doNext?=?false;BroadcastRecord?r?=?null;synchronized(this)?{r?=?broadcastRecordForReceiverLocked(who);if?(r?!=?null)?{doNext?=?r.queue.finishReceiverLocked(r,?resultCode,resultData,?resultExtras,?resultAbort,?true);}}if?(doNext)?{r.queue.processNextBroadcast(false);}trimApplications();}?finally?{Binder.restoreCallingIdentity(origId);} }

可以看到,如有必要,會繼續調用processNextBroadcast(),從而完成有序廣播的循環處理。

?

3.2.4 說說有序廣播的timeout處理

??????? 因為AMS很難知道一次廣播究竟能不能完全成功遞送出去,所以它必須實現一種“時限機制”。前文在闡述broadcastIntentLocked()時,提到過new一個BroadcastRecord節點,并插入一個BroadcastQueue里的“平行列表”或者“有序列表”。不過當時我們沒有太細說那個BroadcastQueue,現在我們多加一點兒說明。

??????? 實際上系統中有兩個BroadcastQueue,一個叫做“前臺廣播隊列”,另一個叫“后臺廣播隊列”,在AMS里是這樣定義的:

BroadcastQueue?mFgBroadcastQueue; BroadcastQueue?mBgBroadcastQueue;

為什么要搞出兩個隊列呢?我認為這是因為系統對“廣播時限”的要求不同導致的。對于前臺廣播隊列而言,它里面的每個廣播必須在10秒之內把廣播遞送給receiver,而后臺廣播隊列的時限比較寬,只需60秒之內遞送到就可以了。具體時限值請看BroadcastQueue的mTimeoutPeriod域。注意,這個10秒或60秒限制是針對一個receiver而言的。比方說“前臺廣播隊列”的某個BroadcastRecord節點對應了3個receiver,那么在處理這個廣播節點時,只要能在30秒(3 x 10)之內搞定就可以了。事實上,AMS系統考慮了更多東西,所以它給一個BroadcastRecord的總時限是其所有receiver時限之和的2倍,在此例中就是60秒(2 x 3 x 10)。

??????? 對于平行receiver而言,時限的作用小一點兒,因為動態receiver是直接遞送到目標進程的,它不考慮目標端是什么時候處理完這個廣播的。

??????? 然而對于有序receiver來說,時限就比較重要了。因為receiver之間必須是串行處理的,也就是說上一個receiver在沒處理完時,系統是不會讓下一個receiver進行處理的。從processNextBroadcast()的代碼來看,在處理有序receiver時,BroadcastRecord里的nextReceiver域會記錄“下一個應該處理的receiver”的標號。只有在BroadcastRecord的所有receiver都處理完后,或者BroadcastRecord的處理時間超過了總時限的情況下,系統才會把這個BroadcastRecord節點從隊列里刪除。因此我們在processNextBroadcast()里看到的獲取當前BroadcastRecord的句子是寫死為r = mOrderedBroadcasts.get(0)的。

??????? 在拿到當前BroadcastRecord之后,利用nextReceiver值拿到當前該處理的receiver信息:

int?recIdx?=?r.nextReceiver++; .?.?.?.?.?. Object?nextReceiver?=?r.receivers.get(recIdx);

當然,一開始,nextReceiver的值只會是0,表示第一個receiver有待處理,此時會給BroadcastRecord的dispatchTime域賦值。

int?recIdx?=?r.nextReceiver++; r.receiverTime?=?SystemClock.uptimeMillis();if?(recIdx?==?0)?{r.dispatchTime?=?r.receiverTime;r.dispatchClockTime?=?System.currentTimeMillis();.?.?.?.?.?. }

也就是說,dispatchTime的意義是標記實際處理BroadcastRecord的起始時間,那么這個BroadcastRecord所能允許的最大時限值就是:

dispatchTime + 2 * mTimeoutPeriod * 其receiver總數

一旦超過這個時限,而BroadcastRecord又沒有處理完,那么就強制結束這個BroadcastRecord節點:

if?((numReceivers?>?0)?&&(now?>?r.dispatchTime?+?(2*mTimeoutPeriod*numReceivers)))? {.?.?.?.?.?.broadcastTimeoutLocked(false);?//?forcibly?finish?this?broadcastforceReceive?=?true;r.state?=?BroadcastRecord.IDLE; }

此處調用的broadcastTimeoutLocked()的參數是boolean fromMsg,表示這個函數是否是在處理“時限消息”的地方調用的,因為當前是在processNextBroadcast()函數里調用broadcastTimeoutLocked()的,所以這個參數為false。從這個參數也可以看出,另一處判斷“處理已經超時”的地方是在消息處理機制里,在那個地方,fromMsg參數應該設為true。

??????? 大體上說,每當processNextBroadcast()準備遞送receiver時,會調用setBroadcastTimeoutLocked()設置一個延遲消息:

long?timeoutTime?=?r.receiverTime?+?mTimeoutPeriod; .?.?.?.?.?. setBroadcastTimeoutLocked(timeoutTime);

setBroadcastTimeoutLocked()的代碼如下:

final?void?setBroadcastTimeoutLocked(long?timeoutTime)? {????if?(!?mPendingBroadcastTimeoutMessage)?{Message?msg?=?mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG,?this);mHandler.sendMessageAtTime(msg,?timeoutTime);mPendingBroadcastTimeoutMessage?=?true;} }

只要我們的receiver能及時處理廣播,系統就會cancel上面的延遲消息。這也就是說,但凡事件泵的handleMessage()開始處理這個消息,就說明receiver處理超時了。此時,系統會放棄處理這個receiver,并接著嘗試處理下一個receiver。

final?Handler?mHandler?=?new?Handler()? {public?void?handleMessage(Message?msg)?{switch?(msg.what)?{.?.?.?.?.?.case?BROADCAST_TIMEOUT_MSG:?{synchronized?(mService)?{broadcastTimeoutLocked(true);}}?break;}} };

broadcastTimeoutLocked()的代碼截選如下:

final?void?broadcastTimeoutLocked(boolean?fromMsg)? {if?(fromMsg)?{mPendingBroadcastTimeoutMessage?=?false;}if?(mOrderedBroadcasts.size()?==?0)?{return;}long?now?=?SystemClock.uptimeMillis();BroadcastRecord?r?=?mOrderedBroadcasts.get(0);.?.?.?.?.?..?.?.?.?.?.finishReceiverLocked(r,?r.resultCode,?r.resultData,r.resultExtras,?r.resultAbort,?true);scheduleBroadcastsLocked();.?.?.?.?.?. }

可以看到,當一個receiver超時后,系統會放棄繼續處理它,并再次調用scheduleBroadcastsLocked(),嘗試處理下一個receiver。

?

4 尾聲

??????? 有關Android的廣播機制,我們就先說這么多吧。品一杯紅茶,說一段代碼,管他云山霧罩,任那瑣碎冗長,我自冷眼看安卓,瞧他修短隨化。


http://my.oschina.net/youranhongcha

總結

以上是生活随笔為你收集整理的品茗论道说广播(Broadcast内部机制讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

波多野结衣av一区二区全免费观看 | 无码一区二区三区在线观看 | 中文精品久久久久人妻不卡 | 久久精品一区二区三区四区 | 午夜精品一区二区三区在线观看 | 亚洲男人av香蕉爽爽爽爽 | a在线亚洲男人的天堂 | 国产精品久久久久9999小说 | 中文亚洲成a人片在线观看 | 成人一在线视频日韩国产 | 久久久www成人免费毛片 | 丰满肥臀大屁股熟妇激情视频 | 久久久精品成人免费观看 | 在教室伦流澡到高潮hnp视频 | 老头边吃奶边弄进去呻吟 | 欧美精品无码一区二区三区 | 色妞www精品免费视频 | 亚洲中文字幕无码一久久区 | 久久 国产 尿 小便 嘘嘘 | 色婷婷综合中文久久一本 | 2019午夜福利不卡片在线 | 国产亚洲精品久久久久久久久动漫 | 成熟人妻av无码专区 | 精品午夜福利在线观看 | 久激情内射婷内射蜜桃人妖 | 亚洲人亚洲人成电影网站色 | 7777奇米四色成人眼影 | 人妻少妇精品久久 | 久久综合久久自在自线精品自 | 国产精品久久久久久久9999 | 天天综合网天天综合色 | 狠狠色欧美亚洲狠狠色www | 国产精品久久久久无码av色戒 | 国内精品久久久久久中文字幕 | 欧美xxxxx精品 | 久久伊人色av天堂九九小黄鸭 | √8天堂资源地址中文在线 | 色婷婷综合激情综在线播放 | 四虎国产精品免费久久 | 丝袜美腿亚洲一区二区 | 玩弄中年熟妇正在播放 | 国产另类ts人妖一区二区 | 成人一在线视频日韩国产 | 高潮毛片无遮挡高清免费视频 | 兔费看少妇性l交大片免费 | 久久视频在线观看精品 | 亚洲中文字幕av在天堂 | 中文精品久久久久人妻不卡 | 免费看少妇作爱视频 | 久久综合九色综合欧美狠狠 | 三级4级全黄60分钟 | 午夜无码区在线观看 | a片在线免费观看 | 99久久久国产精品无码免费 | 国产精品无码成人午夜电影 | 午夜嘿嘿嘿影院 | 婷婷五月综合激情中文字幕 | 日韩人妻少妇一区二区三区 | 成人试看120秒体验区 | 一本色道久久综合狠狠躁 | 日日摸日日碰夜夜爽av | 四虎影视成人永久免费观看视频 | 国产成人一区二区三区在线观看 | 在线精品国产一区二区三区 | 99麻豆久久久国产精品免费 | 日本大乳高潮视频在线观看 | 国产成人精品久久亚洲高清不卡 | a在线观看免费网站大全 | 爽爽影院免费观看 | 男女作爱免费网站 | 高清无码午夜福利视频 | 人妻aⅴ无码一区二区三区 | 国产av剧情md精品麻豆 | 极品尤物被啪到呻吟喷水 | 无码吃奶揉捏奶头高潮视频 | 人人爽人人爽人人片av亚洲 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲国产欧美国产综合一区 | 成人亚洲精品久久久久软件 | 中文精品无码中文字幕无码专区 | 亚洲欧美国产精品专区久久 | 欧美刺激性大交 | 纯爱无遮挡h肉动漫在线播放 | 日韩精品无码一本二本三本色 | 国产成人亚洲综合无码 | 欧美精品免费观看二区 | 一本久道高清无码视频 | 亚洲日本va午夜在线电影 | 日本va欧美va欧美va精品 | 国内精品久久毛片一区二区 | 色欲综合久久中文字幕网 | 久久综合九色综合97网 | 99久久精品国产一区二区蜜芽 | 亚洲欧美日韩成人高清在线一区 | 亚洲综合精品香蕉久久网 | 欧美成人午夜精品久久久 | 中文字幕乱码人妻二区三区 | 国产成人无码av在线影院 | 曰本女人与公拘交酡免费视频 | 欧美性猛交内射兽交老熟妇 | 久久久久久a亚洲欧洲av冫 | 亚洲欧美日韩综合久久久 | av在线亚洲欧洲日产一区二区 | 亚洲日本在线电影 | 国产精品-区区久久久狼 | 99久久精品无码一区二区毛片 | 欧美激情综合亚洲一二区 | 欧美成人家庭影院 | 欧美黑人巨大xxxxx | 国产做国产爱免费视频 | 女人色极品影院 | 久久综合狠狠综合久久综合88 | 少妇久久久久久人妻无码 | 岛国片人妻三上悠亚 | 欧美丰满熟妇xxxx | 国产精品18久久久久久麻辣 | 国产精品理论片在线观看 | 狠狠亚洲超碰狼人久久 | 成 人 网 站国产免费观看 | 99麻豆久久久国产精品免费 | 国产热a欧美热a在线视频 | 精品国产麻豆免费人成网站 | 18精品久久久无码午夜福利 | 亚洲色无码一区二区三区 | 色诱久久久久综合网ywww | 国产成人无码一二三区视频 | 精品人人妻人人澡人人爽人人 | 亚洲精品一区二区三区大桥未久 | 色妞www精品免费视频 | 精品偷拍一区二区三区在线看 | 天堂а√在线地址中文在线 | 沈阳熟女露脸对白视频 | 爽爽影院免费观看 | 在线观看国产午夜福利片 | 2019nv天堂香蕉在线观看 | 国产精品.xx视频.xxtv | 伊在人天堂亚洲香蕉精品区 | 日本一本二本三区免费 | 东京热一精品无码av | 国产乱人伦偷精品视频 | 扒开双腿疯狂进出爽爽爽视频 | 18黄暴禁片在线观看 | 人人妻人人澡人人爽精品欧美 | 国产麻豆精品一区二区三区v视界 | 国产精品香蕉在线观看 | 日韩少妇内射免费播放 | ass日本丰满熟妇pics | 丰满人妻被黑人猛烈进入 | 国产午夜亚洲精品不卡下载 | 99久久婷婷国产综合精品青草免费 | 日本一卡二卡不卡视频查询 | 国产精品多人p群无码 | 18精品久久久无码午夜福利 | 成人av无码一区二区三区 | 午夜福利试看120秒体验区 | 久久久久久国产精品无码下载 | 18黄暴禁片在线观看 | 日日碰狠狠丁香久燥 | 天堂在线观看www | 青青久在线视频免费观看 | 色婷婷av一区二区三区之红樱桃 | 久久99国产综合精品 | 永久黄网站色视频免费直播 | 国产三级精品三级男人的天堂 | 成人无码影片精品久久久 | 精品成人av一区二区三区 | 国产成人无码午夜视频在线观看 | 日本成熟视频免费视频 | 亚洲国产欧美国产综合一区 | 国产国语老龄妇女a片 | 精品无码国产一区二区三区av | 亚洲人成影院在线观看 | 伊人久久婷婷五月综合97色 | 正在播放东北夫妻内射 | 精品国产麻豆免费人成网站 | 久久久久av无码免费网 | 国产精品二区一区二区aⅴ污介绍 | 天天燥日日燥 | yw尤物av无码国产在线观看 | 男女下面进入的视频免费午夜 | 人人爽人人爽人人片av亚洲 | 国产一区二区三区日韩精品 | 国产国产精品人在线视 | 国产亚洲美女精品久久久2020 | 无码av免费一区二区三区试看 | 全球成人中文在线 | 国产成人精品三级麻豆 | 国产精品美女久久久久av爽李琼 | 久久99国产综合精品 | 国产人妻精品一区二区三区不卡 | 国产小呦泬泬99精品 | 欧美自拍另类欧美综合图片区 | 免费无码的av片在线观看 | 亚洲成a人片在线观看日本 | 最近免费中文字幕中文高清百度 | 中文无码成人免费视频在线观看 | 久久精品人妻少妇一区二区三区 | 日韩成人一区二区三区在线观看 | 日韩精品无码免费一区二区三区 | 国产真实乱对白精彩久久 | 成人片黄网站色大片免费观看 | 日本熟妇人妻xxxxx人hd | 97久久国产亚洲精品超碰热 | 少妇人妻av毛片在线看 | 亚洲s色大片在线观看 | 欧美老妇交乱视频在线观看 | 精品偷自拍另类在线观看 | 国产成人精品三级麻豆 | 日韩精品无码一区二区中文字幕 | 强辱丰满人妻hd中文字幕 | 又粗又大又硬毛片免费看 | 亚洲欧美国产精品久久 | 久久综合狠狠综合久久综合88 | 亚洲国产精品久久人人爱 | 国产精品理论片在线观看 | 麻豆成人精品国产免费 | 麻豆国产人妻欲求不满 | 欧美阿v高清资源不卡在线播放 | 性欧美videos高清精品 | 中文精品久久久久人妻不卡 | 亚洲精品鲁一鲁一区二区三区 | 伊人久久大香线蕉av一区二区 | 精品国产成人一区二区三区 | 亚洲人成网站免费播放 | 中文字幕日韩精品一区二区三区 | 无遮挡国产高潮视频免费观看 | 久激情内射婷内射蜜桃人妖 | 亚洲中文字幕成人无码 | 亚洲精品久久久久久久久久久 | 欧美日韩精品 | 久久亚洲日韩精品一区二区三区 | 六十路熟妇乱子伦 | 激情人妻另类人妻伦 | 国产在线一区二区三区四区五区 | 免费无码av一区二区 | 国产成人亚洲综合无码 | 国产成人无码av片在线观看不卡 | 婷婷色婷婷开心五月四房播播 | 国产超级va在线观看视频 | 波多野结衣乳巨码无在线观看 | 久久久国产精品无码免费专区 | 精品夜夜澡人妻无码av蜜桃 | 精品一区二区三区波多野结衣 | 免费播放一区二区三区 | 免费无码av一区二区 | 成人一区二区免费视频 | 18黄暴禁片在线观看 | 人妻夜夜爽天天爽三区 | 久久精品国产精品国产精品污 | 国产亚洲精品久久久久久 | 无码免费一区二区三区 | 亚洲国产精品无码久久久久高潮 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产麻豆精品一区二区三区v视界 | 成年美女黄网站色大免费全看 | 国产精品视频免费播放 | 人人妻人人澡人人爽欧美一区九九 | 性色欲网站人妻丰满中文久久不卡 | 无码午夜成人1000部免费视频 | 色综合久久网 | 黑森林福利视频导航 | 未满小14洗澡无码视频网站 | 亚洲春色在线视频 | 中文字幕精品av一区二区五区 | 人人爽人人爽人人片av亚洲 | 一本久久a久久精品亚洲 | 精品国偷自产在线视频 | 国产成人精品三级麻豆 | 国内老熟妇对白xxxxhd | 国产9 9在线 | 中文 | 综合人妻久久一区二区精品 | 精品人妻人人做人人爽 | 99riav国产精品视频 | 久久久久久九九精品久 | 久久精品中文闷骚内射 | 国产精品资源一区二区 | 国产午夜亚洲精品不卡 | 国产香蕉尹人视频在线 | 国产av人人夜夜澡人人爽麻豆 | 99久久久国产精品无码免费 | 国产莉萝无码av在线播放 | 日本一区二区更新不卡 | 亚洲毛片av日韩av无码 | 久久精品丝袜高跟鞋 | 久久精品国产精品国产精品污 | 精品无码国产一区二区三区av | 欧美午夜特黄aaaaaa片 | 久久久精品成人免费观看 | 在线播放亚洲第一字幕 | 男女作爱免费网站 | 97精品人妻一区二区三区香蕉 | 人妻人人添人妻人人爱 | 久久久久亚洲精品男人的天堂 | 少妇愉情理伦片bd | 日本一区二区三区免费播放 | 国产精品亚洲а∨无码播放麻豆 | 亚洲中文字幕在线无码一区二区 | 亚洲欧美色中文字幕在线 | 欧美阿v高清资源不卡在线播放 | 天天躁日日躁狠狠躁免费麻豆 | 蜜臀aⅴ国产精品久久久国产老师 | 日韩精品无码一区二区中文字幕 | 欧美黑人巨大xxxxx | 国产激情精品一区二区三区 | 久久久久久a亚洲欧洲av冫 | 日日夜夜撸啊撸 | 国产成人综合在线女婷五月99播放 | 久久99精品久久久久久 | 亚洲中文字幕乱码av波多ji | 亚洲gv猛男gv无码男同 | 亚洲精品一区三区三区在线观看 | 无码人妻久久一区二区三区不卡 | 狠狠色丁香久久婷婷综合五月 | 大肉大捧一进一出好爽视频 | 少妇人妻偷人精品无码视频 | 久久精品国产精品国产精品污 | 男人的天堂2018无码 | 国内老熟妇对白xxxxhd | 成年女人永久免费看片 | 中文字幕av无码一区二区三区电影 | 国产精品久久久午夜夜伦鲁鲁 | 天天拍夜夜添久久精品大 | 亚洲国产精品久久人人爱 | 色 综合 欧美 亚洲 国产 | 色综合视频一区二区三区 | www国产亚洲精品久久久日本 | 亚洲爆乳精品无码一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 色婷婷av一区二区三区之红樱桃 | 99久久精品无码一区二区毛片 | 亚洲精品国偷拍自产在线观看蜜桃 | 无码福利日韩神码福利片 | 九九在线中文字幕无码 | 天堂无码人妻精品一区二区三区 | 大乳丰满人妻中文字幕日本 | 国产精品.xx视频.xxtv | 成人毛片一区二区 | 亚洲成av人在线观看网址 | 四虎4hu永久免费 | 精品国产精品久久一区免费式 | 亚洲a无码综合a国产av中文 | 欧美性黑人极品hd | 丰满护士巨好爽好大乳 | 亚洲乱码日产精品bd | 国产精品久久久久久久影院 | 激情综合激情五月俺也去 | 精品久久久无码人妻字幂 | 麻豆成人精品国产免费 | 无码国产色欲xxxxx视频 | 亚洲色无码一区二区三区 | 一本色道久久综合亚洲精品不卡 | 国产在热线精品视频 | 青青草原综合久久大伊人精品 | 国产办公室秘书无码精品99 | 精品国产一区二区三区四区 | 在线a亚洲视频播放在线观看 | 日日摸天天摸爽爽狠狠97 | 欧美日本免费一区二区三区 | 国产麻豆精品一区二区三区v视界 | 红桃av一区二区三区在线无码av | 亚洲伊人久久精品影院 | 成人免费视频在线观看 | 欧美阿v高清资源不卡在线播放 | 国产精品久久精品三级 | 国产又粗又硬又大爽黄老大爷视 | 人妻互换免费中文字幕 | 无码中文字幕色专区 | 国产成人综合美国十次 | 国产凸凹视频一区二区 | 国产在线精品一区二区三区直播 | 国产av无码专区亚洲a∨毛片 | 在线成人www免费观看视频 | 国产高清不卡无码视频 | 国产一区二区不卡老阿姨 | 一区二区三区高清视频一 | 亚洲午夜无码久久 | 波多野结衣av一区二区全免费观看 | 色婷婷久久一区二区三区麻豆 | 亚洲国产精品久久久久久 | 精品一二三区久久aaa片 | 亚洲爆乳精品无码一区二区三区 | 国产精品无码一区二区三区不卡 | 人妻插b视频一区二区三区 | 爽爽影院免费观看 | 国产无遮挡又黄又爽又色 | 国产综合久久久久鬼色 | 少妇性俱乐部纵欲狂欢电影 | 男女猛烈xx00免费视频试看 | 成人无码精品一区二区三区 | 国产午夜亚洲精品不卡 | 青春草在线视频免费观看 | 久久五月精品中文字幕 | 午夜福利不卡在线视频 | 性色欲情网站iwww九文堂 | 亚洲精品国产a久久久久久 | 大胆欧美熟妇xx | 亚洲熟妇色xxxxx欧美老妇y | 久久精品女人天堂av免费观看 | 国产亚洲精品久久久久久久久动漫 | 成人精品天堂一区二区三区 | 樱花草在线社区www | 国产精品怡红院永久免费 | 国产香蕉97碰碰久久人人 | 国产av剧情md精品麻豆 | 亚洲人亚洲人成电影网站色 | 日韩精品乱码av一区二区 | 免费播放一区二区三区 | 国产sm调教视频在线观看 | 婷婷丁香五月天综合东京热 | 99久久婷婷国产综合精品青草免费 | 东京无码熟妇人妻av在线网址 | 色欲综合久久中文字幕网 | 国产午夜无码精品免费看 | 久久精品中文字幕大胸 | 激情爆乳一区二区三区 | 无码人中文字幕 | 曰韩少妇内射免费播放 | 国产亚洲人成a在线v网站 | 欧美日韩综合一区二区三区 | 女人被男人爽到呻吟的视频 | 国产人成高清在线视频99最全资源 | 色综合视频一区二区三区 | 日日橹狠狠爱欧美视频 | 国产成人精品视频ⅴa片软件竹菊 | 日本一区二区三区免费播放 | 色五月丁香五月综合五月 | 国产一区二区三区四区五区加勒比 | 成 人影片 免费观看 | 亚洲一区二区三区在线观看网站 | aⅴ在线视频男人的天堂 | 综合人妻久久一区二区精品 | 一本色道久久综合狠狠躁 | 欧美日韩色另类综合 | 黑人巨大精品欧美黑寡妇 | 国语精品一区二区三区 | 熟妇激情内射com | 国产激情无码一区二区 | 精品一二三区久久aaa片 | 小鲜肉自慰网站xnxx | 国产综合色产在线精品 | 中文字幕+乱码+中文字幕一区 | 色欲综合久久中文字幕网 | 亚洲精品国产品国语在线观看 | 欧美性生交xxxxx久久久 | 扒开双腿疯狂进出爽爽爽视频 | 黑人巨大精品欧美一区二区 | 俺去俺来也在线www色官网 | 日本成熟视频免费视频 | 久久久www成人免费毛片 | 亚洲伊人久久精品影院 | 国产熟女一区二区三区四区五区 | 无码国内精品人妻少妇 | 国产成人精品一区二区在线小狼 | 国产又粗又硬又大爽黄老大爷视 | 亚洲精品一区二区三区大桥未久 | 欧美人与禽猛交狂配 | 精品人妻人人做人人爽 | 真人与拘做受免费视频 | 国产黄在线观看免费观看不卡 | 99精品国产综合久久久久五月天 | 精品无码一区二区三区爱欲 | 欧美日韩在线亚洲综合国产人 | 九九热爱视频精品 | 一本久久伊人热热精品中文字幕 | 国产精品久久久久久无码 | 男人扒开女人内裤强吻桶进去 | 国产成人无码av在线影院 | 波多野结衣一区二区三区av免费 | 黑人巨大精品欧美黑寡妇 | 天天做天天爱天天爽综合网 | 欧美人妻一区二区三区 | 成在人线av无码免费 | 国产农村妇女高潮大叫 | 亚洲国产日韩a在线播放 | 福利一区二区三区视频在线观看 | 少妇性荡欲午夜性开放视频剧场 | 亚洲一区二区三区在线观看网站 | 国产精品对白交换视频 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日产精品99久久久久久 | 300部国产真实乱 | 精品无码国产自产拍在线观看蜜 | а√天堂www在线天堂小说 | 一本无码人妻在中文字幕免费 | 国产人妻人伦精品1国产丝袜 | 人人妻人人澡人人爽精品欧美 | 国产精品久久久久影院嫩草 | 精品无人区无码乱码毛片国产 | 偷窥日本少妇撒尿chinese | 亲嘴扒胸摸屁股激烈网站 | 精品无码国产自产拍在线观看蜜 | 无码国产乱人伦偷精品视频 | 亚洲精品国偷拍自产在线麻豆 | 成人精品一区二区三区中文字幕 | 强开小婷嫩苞又嫩又紧视频 | 国产一精品一av一免费 | 亚洲成色在线综合网站 | 久久久国产一区二区三区 | 亚洲中文字幕无码中文字在线 | 国产一区二区三区日韩精品 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲人成影院在线无码按摩店 | 一本精品99久久精品77 | 99久久精品日本一区二区免费 | 天堂亚洲2017在线观看 | 无码人妻出轨黑人中文字幕 | 无码人妻丰满熟妇区五十路百度 | 久精品国产欧美亚洲色aⅴ大片 | 黑森林福利视频导航 | 网友自拍区视频精品 | www成人国产高清内射 | 夜精品a片一区二区三区无码白浆 | 亚洲乱码中文字幕在线 | 久久综合九色综合欧美狠狠 | 一本久道高清无码视频 | 超碰97人人做人人爱少妇 | 男人扒开女人内裤强吻桶进去 | 国产av无码专区亚洲awww | 任你躁国产自任一区二区三区 | 精品国产一区av天美传媒 | 精品一区二区不卡无码av | 欧美人与动性行为视频 | 国产成人精品优优av | 激情国产av做激情国产爱 | 国产日产欧产精品精品app | 一二三四社区在线中文视频 | 亚洲区小说区激情区图片区 | 日本又色又爽又黄的a片18禁 | 东京热男人av天堂 | 天天做天天爱天天爽综合网 | 亚洲无人区午夜福利码高清完整版 | 国产热a欧美热a在线视频 | 无遮挡啪啪摇乳动态图 | 国产精品人人爽人人做我的可爱 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久综合九色综合欧美狠狠 | 天海翼激烈高潮到腰振不止 | 国产在线无码精品电影网 | 久久精品人人做人人综合试看 | 玩弄中年熟妇正在播放 | 久精品国产欧美亚洲色aⅴ大片 | 自拍偷自拍亚洲精品被多人伦好爽 | 日韩人妻无码一区二区三区久久99 | 久久久久久久女国产乱让韩 | 99视频精品全部免费免费观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产精品手机免费 | 高清无码午夜福利视频 | 蜜臀aⅴ国产精品久久久国产老师 | 少妇久久久久久人妻无码 | 强辱丰满人妻hd中文字幕 | 国产农村乱对白刺激视频 | 欧美性生交活xxxxxdddd | 99精品国产综合久久久久五月天 | 天海翼激烈高潮到腰振不止 | 无码人妻出轨黑人中文字幕 | 日产国产精品亚洲系列 | 久久久久人妻一区精品色欧美 | 国产成人综合美国十次 | 一个人看的视频www在线 | 日本又色又爽又黄的a片18禁 | 少妇的肉体aa片免费 | 国产熟女一区二区三区四区五区 | 内射白嫩少妇超碰 | 国产精品久久久久久亚洲毛片 | 久久综合九色综合欧美狠狠 | 亚欧洲精品在线视频免费观看 | 7777奇米四色成人眼影 | 一本色道久久综合狠狠躁 | 午夜精品久久久久久久 | 亚洲国产精品美女久久久久 | 精品无码国产自产拍在线观看蜜 | 性生交大片免费看l | 少女韩国电视剧在线观看完整 | 中文字幕中文有码在线 | 亚洲一区二区三区在线观看网站 | 日本饥渴人妻欲求不满 | 青青草原综合久久大伊人精品 | 日本熟妇人妻xxxxx人hd | 97人妻精品一区二区三区 | 无码一区二区三区在线 | 国产成人精品视频ⅴa片软件竹菊 | 国内揄拍国内精品人妻 | 国产激情综合五月久久 | 日本乱人伦片中文三区 | 久久伊人色av天堂九九小黄鸭 | 偷窥村妇洗澡毛毛多 | 久久99精品国产麻豆蜜芽 | 成人影院yy111111在线观看 | 少女韩国电视剧在线观看完整 | 久久精品国产一区二区三区 | 久久综合九色综合欧美狠狠 | 秋霞特色aa大片 | 国产精品久久久久9999小说 | 国产精品18久久久久久麻辣 | av香港经典三级级 在线 | 白嫩日本少妇做爰 | 国产精品人人妻人人爽 | 黑人巨大精品欧美黑寡妇 | 爱做久久久久久 | 午夜精品一区二区三区在线观看 | 88国产精品欧美一区二区三区 | av无码久久久久不卡免费网站 | 国产亚洲人成在线播放 | 98国产精品综合一区二区三区 | 国产午夜视频在线观看 | 亚洲色欲色欲欲www在线 | 秋霞特色aa大片 | v一区无码内射国产 | 亚洲 激情 小说 另类 欧美 | 麻豆人妻少妇精品无码专区 | 18精品久久久无码午夜福利 | 亚洲伊人久久精品影院 | 亚洲熟妇色xxxxx欧美老妇 | 又色又爽又黄的美女裸体网站 | 熟女少妇人妻中文字幕 | 成人精品视频一区二区三区尤物 | 一本久道高清无码视频 | 99在线 | 亚洲 | 97精品国产97久久久久久免费 | 日本一卡二卡不卡视频查询 | 国产精品办公室沙发 | 国模大胆一区二区三区 | 又大又硬又黄的免费视频 | 久久99精品国产麻豆 | 国产亲子乱弄免费视频 | 内射欧美老妇wbb | 久久综合久久自在自线精品自 | 中文精品久久久久人妻不卡 | 国产人成高清在线视频99最全资源 | 久久视频在线观看精品 | 丝袜美腿亚洲一区二区 | 国产精品国产三级国产专播 | 国产偷国产偷精品高清尤物 | 东京热无码av男人的天堂 | 少妇性荡欲午夜性开放视频剧场 | 久久人人爽人人爽人人片av高清 | 亚洲成av人片天堂网无码】 | 无码一区二区三区在线观看 | 中文字幕人妻丝袜二区 | 国产热a欧美热a在线视频 | 国产 浪潮av性色四虎 | 国内丰满熟女出轨videos | 中文字幕乱码人妻二区三区 | 人妻少妇被猛烈进入中文字幕 | 小鲜肉自慰网站xnxx | 牲欲强的熟妇农村老妇女 | 在线观看欧美一区二区三区 | 欧美 日韩 人妻 高清 中文 | 欧美三级a做爰在线观看 | 国产免费久久久久久无码 | 福利一区二区三区视频在线观看 | 日韩精品无码免费一区二区三区 | 亚洲国产综合无码一区 | 欧美日韩一区二区免费视频 | 黑森林福利视频导航 | 亚洲精品成人av在线 | 午夜免费福利小电影 | 久久久婷婷五月亚洲97号色 | 四虎永久在线精品免费网址 | 国产香蕉97碰碰久久人人 | 成人无码精品一区二区三区 | 亚洲色大成网站www | 国产尤物精品视频 | 麻豆国产人妻欲求不满谁演的 | www国产亚洲精品久久久日本 | 日日摸日日碰夜夜爽av | 亚洲色偷偷偷综合网 | 久久精品成人欧美大片 | 国产高清av在线播放 | 奇米影视888欧美在线观看 | 精品人妻人人做人人爽 | 久久精品国产99久久6动漫 | 日韩少妇白浆无码系列 | 色婷婷综合激情综在线播放 | 国产人妻精品午夜福利免费 | 粗大的内捧猛烈进出视频 | 亚洲国产精品一区二区第一页 | 久久精品视频在线看15 | 免费男性肉肉影院 | 国产精华av午夜在线观看 | 无人区乱码一区二区三区 | 东京热男人av天堂 | 波多野结衣av一区二区全免费观看 | 国产av人人夜夜澡人人爽麻豆 | 东京热一精品无码av | 老熟妇乱子伦牲交视频 | 色一情一乱一伦 | 亚洲区小说区激情区图片区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 偷窥村妇洗澡毛毛多 | 久久久久久久久蜜桃 | 国产熟女一区二区三区四区五区 | 久久久久国色av免费观看性色 | 国产av剧情md精品麻豆 | 国产一区二区三区日韩精品 | 鲁一鲁av2019在线 | 国产特级毛片aaaaaaa高清 | 99er热精品视频 | 亚洲综合无码一区二区三区 | 麻豆精产国品 | 成人免费视频在线观看 | 蜜桃av抽搐高潮一区二区 | 久久aⅴ免费观看 | 欧美熟妇另类久久久久久不卡 | www成人国产高清内射 | 一本加勒比波多野结衣 | 国产精品嫩草久久久久 | 色老头在线一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 天天爽夜夜爽夜夜爽 | 超碰97人人射妻 | 在线а√天堂中文官网 | 国产精品igao视频网 | 亚洲中文字幕无码中文字在线 | 精品日本一区二区三区在线观看 | 无码人妻黑人中文字幕 | 精品无码一区二区三区爱欲 | 双乳奶水饱满少妇呻吟 | 无码帝国www无码专区色综合 | 天海翼激烈高潮到腰振不止 | 永久免费观看国产裸体美女 | 男女下面进入的视频免费午夜 | 2020久久香蕉国产线看观看 | 中国女人内谢69xxxx | 国产成人午夜福利在线播放 | 亚洲精品久久久久久一区二区 | 日本乱人伦片中文三区 | 国产两女互慰高潮视频在线观看 | 久久五月精品中文字幕 | 香港三级日本三级妇三级 | 精品aⅴ一区二区三区 | 国产午夜亚洲精品不卡下载 | 国产欧美熟妇另类久久久 | 国产后入清纯学生妹 | 高清国产亚洲精品自在久久 | 免费人成网站视频在线观看 | 亚无码乱人伦一区二区 | 男人和女人高潮免费网站 | 亚洲精品成人av在线 | 国产精品久久久 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲国产成人av在线观看 | 欧美一区二区三区 | 99久久人妻精品免费二区 | 熟妇人妻激情偷爽文 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美色就是色 | 久久久久成人精品免费播放动漫 | 日本精品高清一区二区 | 日韩 欧美 动漫 国产 制服 | 精品无码成人片一区二区98 | 亚洲狠狠婷婷综合久久 | 亚洲阿v天堂在线 | 国产精品高潮呻吟av久久 | 高潮毛片无遮挡高清免费 | 国产做国产爱免费视频 | 国产精品亚洲lv粉色 | 中文字幕日产无线码一区 | 无码人妻黑人中文字幕 | 国产三级精品三级男人的天堂 | 午夜时刻免费入口 | 免费人成网站视频在线观看 | 欧美 丝袜 自拍 制服 另类 | 在线亚洲高清揄拍自拍一品区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲精品欧美二区三区中文字幕 | 精品人妻av区 | 亚洲 欧美 激情 小说 另类 | 亚洲精品国产第一综合99久久 | 国产办公室秘书无码精品99 | 中文字幕人妻无码一夲道 | 国产真实夫妇视频 | 玩弄人妻少妇500系列视频 | 男女猛烈xx00免费视频试看 | 亚洲一区av无码专区在线观看 | 国产福利视频一区二区 | 一个人免费观看的www视频 | 在线а√天堂中文官网 | 台湾无码一区二区 | 久久久久亚洲精品男人的天堂 | 亚洲娇小与黑人巨大交 | av人摸人人人澡人人超碰下载 | 国产精品99久久精品爆乳 | 日本精品久久久久中文字幕 | 蜜桃无码一区二区三区 | 精品无码一区二区三区爱欲 | 无码精品国产va在线观看dvd | 亚洲国产精品久久人人爱 | 天天做天天爱天天爽综合网 | 国产一区二区三区影院 | 亚洲欧美综合区丁香五月小说 | 无码精品国产va在线观看dvd | 日韩欧美群交p片內射中文 | 国产成人无码a区在线观看视频app | 色欲综合久久中文字幕网 | 人人超人人超碰超国产 | 2020久久香蕉国产线看观看 | 老熟女重囗味hdxx69 | 黑森林福利视频导航 | 免费国产黄网站在线观看 | 国产精品久久精品三级 | 日韩少妇白浆无码系列 | 国产亚洲精品精品国产亚洲综合 | 九九在线中文字幕无码 | 亚洲最大成人网站 | 2020久久超碰国产精品最新 | 好爽又高潮了毛片免费下载 | 狠狠色噜噜狠狠狠7777奇米 | 熟女少妇人妻中文字幕 | 97久久精品无码一区二区 | 国产人妻大战黑人第1集 | 无码国模国产在线观看 | 熟妇人妻激情偷爽文 | 丰腴饱满的极品熟妇 | 日韩av无码一区二区三区不卡 | 女人色极品影院 | 99久久久国产精品无码免费 | 色婷婷久久一区二区三区麻豆 | 国产午夜无码精品免费看 | 曰本女人与公拘交酡免费视频 | 精品亚洲韩国一区二区三区 | 国产农村妇女高潮大叫 | 日本一卡2卡3卡四卡精品网站 | 亚洲国产欧美在线成人 | 麻豆md0077饥渴少妇 | 亚洲精品国偷拍自产在线麻豆 | 国产在线精品一区二区三区直播 | 一本大道伊人av久久综合 | aⅴ亚洲 日韩 色 图网站 播放 | 国产情侣作爱视频免费观看 | 免费网站看v片在线18禁无码 | 国产亚洲美女精品久久久2020 | 亚洲熟妇色xxxxx亚洲 | 久久99精品久久久久婷婷 | 精品久久久无码人妻字幂 | 亚洲色无码一区二区三区 | 国产色xx群视频射精 | 国产亲子乱弄免费视频 | 中文字幕无码免费久久9一区9 | 国产人妖乱国产精品人妖 | 亚洲无人区一区二区三区 | 亚洲成a人片在线观看日本 | 丰满护士巨好爽好大乳 | 六十路熟妇乱子伦 | 波多野42部无码喷潮在线 | 日本熟妇浓毛 | 欧美日韩色另类综合 | 97se亚洲精品一区 | 国产精品久久久一区二区三区 | 国产精品国产自线拍免费软件 | 久久久久久久女国产乱让韩 | 又黄又爽又色的视频 | 欧美成人高清在线播放 | av在线亚洲欧洲日产一区二区 | 两性色午夜视频免费播放 | 亚洲s色大片在线观看 | 色欲人妻aaaaaaa无码 | 久久精品女人天堂av免费观看 | 日本一本二本三区免费 | 日本欧美一区二区三区乱码 | 久久精品中文闷骚内射 | 天堂а√在线中文在线 | 激情爆乳一区二区三区 | 亚洲а∨天堂久久精品2021 | 国内老熟妇对白xxxxhd | 宝宝好涨水快流出来免费视频 | 欧美黑人巨大xxxxx | 国产人妻人伦精品 | 国产精品久久久av久久久 | 国产精品久久久一区二区三区 | 日本大香伊一区二区三区 | 亚洲爆乳大丰满无码专区 | 日本成熟视频免费视频 | 色欲久久久天天天综合网精品 | 久久精品国产一区二区三区 | 色五月五月丁香亚洲综合网 | 国产精品.xx视频.xxtv | av小次郎收藏 | 人妻少妇精品无码专区动漫 | 亚洲精品鲁一鲁一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 内射后入在线观看一区 | 丰满护士巨好爽好大乳 | 成在人线av无码免观看麻豆 | 狠狠综合久久久久综合网 | 精品欧美一区二区三区久久久 | 久久午夜无码鲁丝片秋霞 | 欧美午夜特黄aaaaaa片 | 久久综合狠狠综合久久综合88 | 中文字幕亚洲情99在线 | 99久久久国产精品无码免费 | 午夜精品一区二区三区的区别 | 永久免费精品精品永久-夜色 | 九月婷婷人人澡人人添人人爽 | 久久亚洲精品中文字幕无男同 | 18黄暴禁片在线观看 | 日韩少妇内射免费播放 | 欧美激情一区二区三区成人 | 午夜熟女插插xx免费视频 | 亚洲啪av永久无码精品放毛片 | 小泽玛莉亚一区二区视频在线 | 色婷婷综合中文久久一本 | 亚洲s码欧洲m码国产av | 亚洲成a人片在线观看无码3d | 奇米影视888欧美在线观看 | 国产成人综合美国十次 | 鲁大师影院在线观看 | 永久黄网站色视频免费直播 | 亚洲 日韩 欧美 成人 在线观看 | 内射后入在线观看一区 | 亚洲熟妇色xxxxx欧美老妇y | 又粗又大又硬又长又爽 | 欧美丰满少妇xxxx性 | 樱花草在线播放免费中文 | 亚洲成av人综合在线观看 | 无码精品人妻一区二区三区av | 亚洲成a人一区二区三区 | 国产精品久久久久无码av色戒 | 亚洲欧美日韩国产精品一区二区 | 亚洲精品一区二区三区婷婷月 | 国产成人亚洲综合无码 | 亚洲成熟女人毛毛耸耸多 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 黑人巨大精品欧美黑寡妇 | 亚洲精品一区国产 | 伊人久久大香线蕉av一区二区 | 熟女俱乐部五十路六十路av | 成人无码视频在线观看网站 | 国内少妇偷人精品视频 | 午夜福利不卡在线视频 | 国产明星裸体无码xxxx视频 | 亚洲国产精品无码一区二区三区 | 亲嘴扒胸摸屁股激烈网站 | 欧美激情一区二区三区成人 | 久久精品无码一区二区三区 | 国产精品沙发午睡系列 | 兔费看少妇性l交大片免费 | 亚洲熟妇色xxxxx欧美老妇y | 一本久久a久久精品vr综合 | 国产午夜福利亚洲第一 | 天堂久久天堂av色综合 | 中文字幕av日韩精品一区二区 | 欧美日韩色另类综合 | 好屌草这里只有精品 | 极品尤物被啪到呻吟喷水 | 中文无码成人免费视频在线观看 | 亚洲男女内射在线播放 | 国产欧美熟妇另类久久久 | 国产精品-区区久久久狼 | 女人被爽到呻吟gif动态图视看 | 国产极品视觉盛宴 | aa片在线观看视频在线播放 | 亚洲七七久久桃花影院 | 内射后入在线观看一区 | 亚洲精品国偷拍自产在线麻豆 | 国产无av码在线观看 | 自拍偷自拍亚洲精品10p | 久久zyz资源站无码中文动漫 | 国产精品沙发午睡系列 | 色婷婷香蕉在线一区二区 | 波多野结衣av一区二区全免费观看 | 国产精品高潮呻吟av久久 | 亚洲国产综合无码一区 | 日日摸天天摸爽爽狠狠97 | 九九在线中文字幕无码 | 免费无码午夜福利片69 | 狠狠cao日日穞夜夜穞av | 大乳丰满人妻中文字幕日本 | av无码电影一区二区三区 | 精品国产福利一区二区 | 久久久久se色偷偷亚洲精品av | 综合激情五月综合激情五月激情1 | 免费男性肉肉影院 | 久久伊人色av天堂九九小黄鸭 | 色欲人妻aaaaaaa无码 | 国产精品久久久久久亚洲影视内衣 | 精品少妇爆乳无码av无码专区 | 色窝窝无码一区二区三区色欲 | 台湾无码一区二区 | 成人女人看片免费视频放人 | 人妻无码αv中文字幕久久琪琪布 | 99国产精品白浆在线观看免费 | 无码人中文字幕 | 水蜜桃亚洲一二三四在线 | 少妇人妻av毛片在线看 | 伊人久久大香线蕉亚洲 | 精品 日韩 国产 欧美 视频 | 久久综合激激的五月天 | 亚洲色无码一区二区三区 | 国产精华av午夜在线观看 | 人人澡人人妻人人爽人人蜜桃 | 我要看www免费看插插视频 | 亚洲中文字幕av在天堂 | 中文无码精品a∨在线观看不卡 | 偷窥日本少妇撒尿chinese | 久久人人爽人人人人片 | 日韩人妻系列无码专区 | 国产一精品一av一免费 | 任你躁国产自任一区二区三区 | 午夜成人1000部免费视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产人妻精品一区二区三区不卡 | 久久精品中文字幕一区 | 日本一卡二卡不卡视频查询 | 天干天干啦夜天干天2017 | 亚洲综合在线一区二区三区 | 99麻豆久久久国产精品免费 | 荫蒂被男人添的好舒服爽免费视频 | 国产精品永久免费视频 | 国产午夜手机精彩视频 | 久久精品人人做人人综合试看 | 久久五月精品中文字幕 | 亚洲熟女一区二区三区 | 最新国产麻豆aⅴ精品无码 | 亚洲人成影院在线观看 | 亚洲午夜久久久影院 | 无码福利日韩神码福利片 | 亚洲成av人片天堂网无码】 | 成人性做爰aaa片免费看不忠 | 老司机亚洲精品影院无码 | 国产人妖乱国产精品人妖 | 男女下面进入的视频免费午夜 | 久久国产劲爆∧v内射 | a片免费视频在线观看 | 无码国产色欲xxxxx视频 | 啦啦啦www在线观看免费视频 | 国产成人综合在线女婷五月99播放 | 麻豆md0077饥渴少妇 | 99精品无人区乱码1区2区3区 | 亚洲高清偷拍一区二区三区 | 精品国产aⅴ无码一区二区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日产国产精品亚洲系列 | 窝窝午夜理论片影院 | 18禁黄网站男男禁片免费观看 | 午夜嘿嘿嘿影院 | 精品乱子伦一区二区三区 | v一区无码内射国产 | 亚洲精品中文字幕久久久久 | 亚洲国产成人av在线观看 | 亚洲区小说区激情区图片区 | 男人扒开女人内裤强吻桶进去 | 国产成人综合色在线观看网站 | 精品人人妻人人澡人人爽人人 | 久久久久久久久蜜桃 | 亚洲一区二区三区在线观看网站 | 国产精品内射视频免费 | 成熟女人特级毛片www免费 | 欧美性生交活xxxxxdddd | 伊在人天堂亚洲香蕉精品区 | 亚洲另类伦春色综合小说 | 亚洲 激情 小说 另类 欧美 | 老熟女重囗味hdxx69 | 双乳奶水饱满少妇呻吟 | 久久97精品久久久久久久不卡 | 中文无码伦av中文字幕 | 日欧一片内射va在线影院 | 国产成人综合色在线观看网站 | 精品人妻中文字幕有码在线 | 少妇性俱乐部纵欲狂欢电影 | 天堂亚洲免费视频 | 欧美猛少妇色xxxxx | 小sao货水好多真紧h无码视频 | 蜜臀aⅴ国产精品久久久国产老师 | 性欧美videos高清精品 | 亚洲精品成a人在线观看 | 国产在线aaa片一区二区99 | 无套内谢的新婚少妇国语播放 | 性欧美疯狂xxxxbbbb | 亚洲欧美中文字幕5发布 | 18禁止看的免费污网站 | 大乳丰满人妻中文字幕日本 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲va欧美va天堂v国产综合 | 久久天天躁狠狠躁夜夜免费观看 | 国产性生大片免费观看性 | 国产午夜精品一区二区三区嫩草 | 精品国产一区二区三区四区在线看 | 女人色极品影院 | 成人性做爰aaa片免费看 | 内射欧美老妇wbb | 无码av中文字幕免费放 | 国色天香社区在线视频 | 亚洲精品国产精品乱码不卡 | 麻豆国产97在线 | 欧洲 | 少妇的肉体aa片免费 | 少妇性俱乐部纵欲狂欢电影 | 在线 国产 欧美 亚洲 天堂 | 性生交片免费无码看人 | 日本大香伊一区二区三区 | 色一情一乱一伦一区二区三欧美 | 人妻少妇精品久久 | 人人妻在人人 | 人妻与老人中文字幕 | 草草网站影院白丝内射 | 国产av一区二区三区最新精品 | 亚洲一区av无码专区在线观看 | 娇妻被黑人粗大高潮白浆 | 国精产品一品二品国精品69xx | 亚洲人成无码网www | 久久久国产一区二区三区 | 婷婷丁香六月激情综合啪 | 国产两女互慰高潮视频在线观看 | 中国大陆精品视频xxxx | 国产午夜精品一区二区三区嫩草 | 亚洲 另类 在线 欧美 制服 | 欧美性生交活xxxxxdddd | 天堂а√在线地址中文在线 | 无遮挡啪啪摇乳动态图 | 欧美 日韩 亚洲 在线 | 狠狠色噜噜狠狠狠狠7777米奇 | 波多野结衣 黑人 | 日本va欧美va欧美va精品 | 无码av最新清无码专区吞精 | 欧美人与禽猛交狂配 | 丝袜足控一区二区三区 | 性欧美熟妇videofreesex | 亚洲码国产精品高潮在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 日本熟妇浓毛 | 1000部啪啪未满十八勿入下载 | 欧美日韩一区二区三区自拍 | 在线成人www免费观看视频 | 欧美国产日韩久久mv | a在线亚洲男人的天堂 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产一区二区不卡老阿姨 | 久久久久久久人妻无码中文字幕爆 | 久久人人97超碰a片精品 | 九月婷婷人人澡人人添人人爽 | 国产成人无码av一区二区 | 久久伊人色av天堂九九小黄鸭 | 精品无码国产自产拍在线观看蜜 | 玩弄少妇高潮ⅹxxxyw | 亚洲乱亚洲乱妇50p | 国产精品无码一区二区三区不卡 | 扒开双腿疯狂进出爽爽爽视频 | 日本高清一区免费中文视频 | 欧美猛少妇色xxxxx | 自拍偷自拍亚洲精品被多人伦好爽 | а√天堂www在线天堂小说 | 无码人妻久久一区二区三区不卡 | 天天做天天爱天天爽综合网 | 欧美亚洲国产一区二区三区 | 特级做a爰片毛片免费69 | 人人妻人人澡人人爽人人精品 | 老熟妇仑乱视频一区二区 | 国产精品久久久久久亚洲毛片 | 亚洲一区二区三区 | 国产无套粉嫩白浆在线 | 久久午夜夜伦鲁鲁片无码免费 | 国产成人精品视频ⅴa片软件竹菊 | 久久97精品久久久久久久不卡 | 高潮毛片无遮挡高清免费视频 | 亚洲中文字幕无码中字 | 亚洲色大成网站www | 亚洲一区二区三区播放 | 中文字幕人成乱码熟女app | 欧美丰满熟妇xxxx性ppx人交 | 国产偷抇久久精品a片69 | 中文无码伦av中文字幕 | 在线 国产 欧美 亚洲 天堂 | 亚洲国精产品一二二线 | 亚洲国产av精品一区二区蜜芽 | 亚洲一区二区观看播放 | 国产超碰人人爽人人做人人添 | 欧美freesex黑人又粗又大 | 亚洲娇小与黑人巨大交 | 国产乱人无码伦av在线a | 美女黄网站人色视频免费国产 | 久青草影院在线观看国产 | 性欧美大战久久久久久久 | 在线播放无码字幕亚洲 | 国产成人无码av在线影院 | 国产成人一区二区三区在线观看 | 亚洲小说春色综合另类 | 国产精品无码永久免费888 | 国产成人无码a区在线观看视频app | 在线播放免费人成毛片乱码 | 99久久久国产精品无码免费 | 300部国产真实乱 | 九九在线中文字幕无码 | 久青草影院在线观看国产 | 丝袜美腿亚洲一区二区 | 国产sm调教视频在线观看 | 蜜臀av无码人妻精品 | 久久成人a毛片免费观看网站 | 装睡被陌生人摸出水好爽 | 丰满少妇弄高潮了www | 人妻少妇被猛烈进入中文字幕 | 久久综合网欧美色妞网 | 激情亚洲一区国产精品 | 少妇一晚三次一区二区三区 | 欧美三级a做爰在线观看 | 国产成人无码区免费内射一片色欲 | 99精品视频在线观看免费 | 午夜熟女插插xx免费视频 | 精品成在人线av无码免费看 | 在线观看国产午夜福利片 | 日本护士xxxxhd少妇 | 亚洲中文字幕无码中字 | 精品一二三区久久aaa片 | 18禁止看的免费污网站 | 熟妇激情内射com | 国产欧美精品一区二区三区 | 亚洲一区av无码专区在线观看 | 精品一区二区三区波多野结衣 | 精品久久久无码中文字幕 | 日本精品久久久久中文字幕 | 无码任你躁久久久久久久 | 国产乱子伦视频在线播放 | 无码人妻黑人中文字幕 | 日韩人妻无码一区二区三区久久99 | 亚洲精品久久久久中文第一幕 | 人人澡人人妻人人爽人人蜜桃 | 蜜桃视频韩日免费播放 | 中文字幕无线码 | 色妞www精品免费视频 | 天堂一区人妻无码 | 无码精品国产va在线观看dvd | 荡女精品导航 | 天天摸天天透天天添 | 国产两女互慰高潮视频在线观看 | 亚洲日韩av片在线观看 | 久久久久久a亚洲欧洲av冫 | 欧美丰满少妇xxxx性 | 国产乱人偷精品人妻a片 | 久久99精品国产麻豆 | 蜜臀av无码人妻精品 | 欧洲精品码一区二区三区免费看 | 亚洲一区二区三区国产精华液 | 55夜色66夜色国产精品视频 | 婷婷六月久久综合丁香 | 国产精品人人爽人人做我的可爱 | 日产精品高潮呻吟av久久 | 亚洲经典千人经典日产 | 麻豆av传媒蜜桃天美传媒 | 黑森林福利视频导航 | www成人国产高清内射 | 窝窝午夜理论片影院 | 久久午夜无码鲁丝片午夜精品 | 精品成人av一区二区三区 | 国内精品一区二区三区不卡 | 熟女少妇人妻中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 久久久精品456亚洲影院 | 亚洲综合在线一区二区三区 | 亚洲熟妇色xxxxx欧美老妇 | 欧洲熟妇色 欧美 | 国产激情一区二区三区 | 精品国产成人一区二区三区 | 日本肉体xxxx裸交 | 日本一卡2卡3卡四卡精品网站 | 无码国产乱人伦偷精品视频 | 成人片黄网站色大片免费观看 | 一个人免费观看的www视频 | 中文字幕无码乱人伦 | 日本精品人妻无码77777 天堂一区人妻无码 | 午夜福利电影 | 久久人人97超碰a片精品 | 国产精品18久久久久久麻辣 | 午夜时刻免费入口 | 娇妻被黑人粗大高潮白浆 | 久久人妻内射无码一区三区 | 鲁一鲁av2019在线 | 亚拍精品一区二区三区探花 | 亚洲精品一区二区三区大桥未久 | 日韩精品成人一区二区三区 | 久久久久久国产精品无码下载 | 久久精品国产精品国产精品污 | 亚洲成熟女人毛毛耸耸多 | 无遮挡国产高潮视频免费观看 | 夫妻免费无码v看片 | 人妻尝试又大又粗久久 | 亚洲天堂2017无码中文 | 亚洲熟妇色xxxxx欧美老妇 | 在线观看国产午夜福利片 | 少妇高潮一区二区三区99 | www一区二区www免费 | 九一九色国产 | 老司机亚洲精品影院 | 波多野结衣av在线观看 | 成 人 网 站国产免费观看 | 天天躁日日躁狠狠躁免费麻豆 | 久久综合狠狠综合久久综合88 | 老头边吃奶边弄进去呻吟 | 色五月丁香五月综合五月 | 日本肉体xxxx裸交 | 99久久精品日本一区二区免费 | 激情人妻另类人妻伦 | 久久99久久99精品中文字幕 | 人妻少妇精品无码专区动漫 | 中文精品无码中文字幕无码专区 | 亚洲国产精品美女久久久久 | 亚洲国产精品美女久久久久 | 精品欧美一区二区三区久久久 | 亚洲人成人无码网www国产 | 国内老熟妇对白xxxxhd | 久久99精品国产麻豆 | а天堂中文在线官网 | 性色欲网站人妻丰满中文久久不卡 | 国产人成高清在线视频99最全资源 | 无遮无挡爽爽免费视频 | 国内精品人妻无码久久久影院蜜桃 | 精品久久8x国产免费观看 | 99久久亚洲精品无码毛片 | 色综合久久久无码中文字幕 | 九九在线中文字幕无码 | 欧美性黑人极品hd | 奇米影视7777久久精品人人爽 | 亚洲中文字幕在线无码一区二区 | 欧美性黑人极品hd | 日本乱人伦片中文三区 | 成人aaa片一区国产精品 | 日本高清一区免费中文视频 | 精品亚洲韩国一区二区三区 | 国产亚洲视频中文字幕97精品 | 欧美第一黄网免费网站 | 欧美丰满老熟妇xxxxx性 | 中国大陆精品视频xxxx | 伊人久久大香线蕉av一区二区 | 国产免费久久精品国产传媒 | 免费人成在线视频无码 | 美女黄网站人色视频免费国产 | 一个人看的视频www在线 | 300部国产真实乱 | 少妇被黑人到高潮喷出白浆 | 激情五月综合色婷婷一区二区 | 亚洲狠狠色丁香婷婷综合 | 国产精品怡红院永久免费 | 色偷偷人人澡人人爽人人模 | 国产成人无码av片在线观看不卡 | 国产区女主播在线观看 | 日韩无套无码精品 | 国产色精品久久人妻 | 日韩av激情在线观看 | 综合激情五月综合激情五月激情1 | 麻豆精品国产精华精华液好用吗 | 国产精品无码久久av | 国产成人无码区免费内射一片色欲 | 成人一区二区免费视频 | 国产精品久久久久久无码 | 亚洲国产精品成人久久蜜臀 | 成人欧美一区二区三区黑人免费 | 亚洲狠狠婷婷综合久久 | 精品亚洲韩国一区二区三区 | 亚洲一区二区三区香蕉 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲无人区一区二区三区 | 四虎永久在线精品免费网址 | 强伦人妻一区二区三区视频18 | 久久精品人人做人人综合 | 国产午夜精品一区二区三区嫩草 | 欧美35页视频在线观看 | 国精品人妻无码一区二区三区蜜柚 | 波多野42部无码喷潮在线 | 日本肉体xxxx裸交 | 久久综合网欧美色妞网 | 国产在热线精品视频 | 又大又黄又粗又爽的免费视频 | 亚洲一区二区三区国产精华液 | 久久精品国产一区二区三区肥胖 | 亚洲综合色区中文字幕 | 久久视频在线观看精品 | 久久综合狠狠综合久久综合88 | 亚洲自偷自拍另类第1页 | 国产精品毛片一区二区 | 女人被爽到呻吟gif动态图视看 | 亚洲精品一区二区三区四区五区 | 无码人妻出轨黑人中文字幕 | 亚洲欧美中文字幕5发布 | 领导边摸边吃奶边做爽在线观看 | 色噜噜亚洲男人的天堂 | 久久亚洲精品中文字幕无男同 | 亚洲天堂2017无码中文 | 国产精品无码永久免费888 | 天下第一社区视频www日本 | 成在人线av无码免观看麻豆 | a在线观看免费网站大全 | 无码吃奶揉捏奶头高潮视频 | 无码精品人妻一区二区三区av | 熟女少妇在线视频播放 | 亚洲国精产品一二二线 | 内射白嫩少妇超碰 | 精品人妻av区 | 国产色xx群视频射精 | 国产精品a成v人在线播放 | 四虎国产精品免费久久 | 久久五月精品中文字幕 | 一本久道高清无码视频 | 欧美老妇交乱视频在线观看 | 久久久久久a亚洲欧洲av冫 | 久久久久成人片免费观看蜜芽 | 一个人看的www免费视频在线观看 | 国产人妻久久精品二区三区老狼 | 久久人人97超碰a片精品 | 亚洲国产成人a精品不卡在线 | 国内少妇偷人精品视频 | 波多野结衣高清一区二区三区 | 熟妇人妻激情偷爽文 | 在线看片无码永久免费视频 | 丰满肥臀大屁股熟妇激情视频 | 亚洲综合久久一区二区 | 人妻插b视频一区二区三区 | 国产xxx69麻豆国语对白 | 精品久久久无码中文字幕 | 亚洲精品国偷拍自产在线麻豆 | 在线欧美精品一区二区三区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 婷婷丁香五月天综合东京热 | 一区二区传媒有限公司 | 三级4级全黄60分钟 | 国产成人无码专区 | 日韩av无码一区二区三区不卡 | 无码成人精品区在线观看 | 日韩精品乱码av一区二区 | 精品无码一区二区三区的天堂 | 亚洲日韩av一区二区三区四区 | 亚洲精品无码人妻无码 | 午夜精品一区二区三区在线观看 | 国产莉萝无码av在线播放 | 午夜精品一区二区三区的区别 | 欧美真人作爱免费视频 | 亚洲国产精品无码久久久久高潮 | 亚洲va欧美va天堂v国产综合 | 亚洲国产午夜精品理论片 | 亚洲综合无码久久精品综合 | 思思久久99热只有频精品66 | 牲欲强的熟妇农村老妇女 | 久久人人爽人人爽人人片av高清 | 99久久久无码国产精品免费 | 久久这里只有精品视频9 | 夜精品a片一区二区三区无码白浆 | 亚洲一区二区三区含羞草 | 人妻体内射精一区二区三四 | 久久婷婷五月综合色国产香蕉 | 男人和女人高潮免费网站 | 综合激情五月综合激情五月激情1 | 国内精品久久久久久中文字幕 | √天堂资源地址中文在线 | 中文精品无码中文字幕无码专区 | 无码毛片视频一区二区本码 | 狠狠色色综合网站 | 无码乱肉视频免费大全合集 | 日本xxxx色视频在线观看免费 | 亚洲日韩一区二区三区 | 免费看少妇作爱视频 | 18禁止看的免费污网站 | 在线成人www免费观看视频 | 图片区 小说区 区 亚洲五月 | 一本一道久久综合久久 | 国产无av码在线观看 | 正在播放老肥熟妇露脸 | 国产特级毛片aaaaaaa高清 | 欧美熟妇另类久久久久久不卡 | 国内少妇偷人精品视频免费 | 在线亚洲高清揄拍自拍一品区 | 无码人妻黑人中文字幕 | 欧洲熟妇色 欧美 | 在线精品国产一区二区三区 | 久久精品99久久香蕉国产色戒 | 午夜精品久久久久久久久 | 国产亚洲视频中文字幕97精品 | 国产精品人人妻人人爽 | 亚洲一区二区三区在线观看网站 | 久久久久久久女国产乱让韩 | 亚洲国精产品一二二线 | 久久熟妇人妻午夜寂寞影院 | 亚洲乱码中文字幕在线 | 好男人社区资源 | 国产农村乱对白刺激视频 | 纯爱无遮挡h肉动漫在线播放 | 又大又硬又爽免费视频 | 久青草影院在线观看国产 | 图片区 小说区 区 亚洲五月 | 粉嫩少妇内射浓精videos | 久久国产自偷自偷免费一区调 | 成人av无码一区二区三区 | 精品国产一区av天美传媒 | 综合网日日天干夜夜久久 | 熟女少妇人妻中文字幕 | 亚洲男女内射在线播放 | 精品国产精品久久一区免费式 | 国产精品无码一区二区桃花视频 | 国产一区二区三区日韩精品 | 激情五月综合色婷婷一区二区 | 无码人妻精品一区二区三区下载 | 天天拍夜夜添久久精品大 | 日本乱偷人妻中文字幕 | √8天堂资源地址中文在线 | 亚洲综合无码一区二区三区 | 日本乱人伦片中文三区 | 久久国产精品二国产精品 | 亚洲成色在线综合网站 | а√天堂www在线天堂小说 | 亚洲a无码综合a国产av中文 | 中文字幕av日韩精品一区二区 | 日本一区二区三区免费播放 | 色情久久久av熟女人妻网站 | 亚洲日本va中文字幕 | 亚洲中文字幕无码一久久区 | 黑人粗大猛烈进出高潮视频 | 日韩欧美中文字幕公布 | 欧美35页视频在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | www国产精品内射老师 | 成人亚洲精品久久久久 | 国产成人精品久久亚洲高清不卡 | 人人爽人人澡人人人妻 | 亚洲精品久久久久久久久久久 | 国产农村乱对白刺激视频 | 伊人色综合久久天天小片 | 扒开双腿疯狂进出爽爽爽视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产激情无码一区二区app | 麻豆成人精品国产免费 | 精品欧洲av无码一区二区三区 | 免费人成在线视频无码 | 国产免费观看黄av片 | 亚洲国产精品无码一区二区三区 | www国产亚洲精品久久久日本 | 丰满人妻翻云覆雨呻吟视频 | 风流少妇按摩来高潮 | 天天做天天爱天天爽综合网 | 国产免费久久久久久无码 | 国产亚洲tv在线观看 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲中文字幕无码一久久区 | 麻豆国产丝袜白领秘书在线观看 | 久久综合给合久久狠狠狠97色 | 亚洲欧美综合区丁香五月小说 | 精品无码av一区二区三区 | 老熟妇乱子伦牲交视频 | 天堂亚洲2017在线观看 | 成人无码精品一区二区三区 | 亚洲 欧美 激情 小说 另类 | 久久久精品欧美一区二区免费 | 国产手机在线αⅴ片无码观看 | 国产卡一卡二卡三 | 亚洲精品中文字幕乱码 | 久久午夜无码鲁丝片午夜精品 | 一区二区传媒有限公司 | 国产区女主播在线观看 | 日韩欧美群交p片內射中文 | 欧美xxxx黑人又粗又长 | 中文毛片无遮挡高清免费 | 亚洲中文字幕无码中文字在线 | 亚洲热妇无码av在线播放 | 青青青爽视频在线观看 | 国产热a欧美热a在线视频 | 熟妇人妻激情偷爽文 | 欧美日韩久久久精品a片 | 国产精品久久久一区二区三区 | 国产av一区二区三区最新精品 | 美女毛片一区二区三区四区 | 97夜夜澡人人双人人人喊 | 女高中生第一次破苞av | 天天摸天天碰天天添 | 亚洲熟悉妇女xxx妇女av | 四虎国产精品免费久久 | 人人爽人人澡人人高潮 | 久久视频在线观看精品 | 男女猛烈xx00免费视频试看 | 国产亲子乱弄免费视频 | 国产午夜视频在线观看 | 亚洲精品一区二区三区四区五区 | 国产亚洲精品久久久久久久久动漫 | 精品国产一区二区三区av 性色 | 久久久国产精品无码免费专区 | 亚洲欧美日韩成人高清在线一区 | 九九久久精品国产免费看小说 | 波多野结衣高清一区二区三区 | 成人aaa片一区国产精品 | 女人被爽到呻吟gif动态图视看 | 色婷婷av一区二区三区之红樱桃 | 激情人妻另类人妻伦 | 成人精品一区二区三区中文字幕 | 国产国语老龄妇女a片 | 亚洲国产欧美日韩精品一区二区三区 | 欧美日韩在线亚洲综合国产人 | 樱花草在线社区www | 欧美一区二区三区视频在线观看 | 亚洲第一网站男人都懂 | 麻豆av传媒蜜桃天美传媒 | 性生交大片免费看女人按摩摩 | 国产莉萝无码av在线播放 | 精品国产av色一区二区深夜久久 | 国产午夜无码视频在线观看 | 男女作爱免费网站 | 中文字幕久久久久人妻 | 国产精品亚洲а∨无码播放麻豆 | 国产亚洲视频中文字幕97精品 | 无码国产激情在线观看 | 日韩少妇白浆无码系列 | 国产精品久久久久9999小说 | 亚洲aⅴ无码成人网站国产app | 精品人妻av区 | 国产口爆吞精在线视频 | 国产精品无码永久免费888 | 伊人久久大香线焦av综合影院 | 在线精品国产一区二区三区 | 成人免费视频视频在线观看 免费 | 国产亚洲精品久久久久久国模美 | 亚洲七七久久桃花影院 | 国产精品第一国产精品 | 一二三四社区在线中文视频 | 国产办公室秘书无码精品99 | 在线播放免费人成毛片乱码 | 亚洲 a v无 码免 费 成 人 a v | 精品夜夜澡人妻无码av蜜桃 | 97精品国产97久久久久久免费 | 欧美激情一区二区三区成人 | 少妇的肉体aa片免费 | 国产精品久久国产三级国 | 久久精品99久久香蕉国产色戒 | 奇米影视888欧美在线观看 | 大胆欧美熟妇xx | 四虎影视成人永久免费观看视频 | 亚洲呦女专区 | 十八禁真人啪啪免费网站 | 无码纯肉视频在线观看 | 久久久久久亚洲精品a片成人 | 夜夜躁日日躁狠狠久久av | 亚洲中文字幕va福利 | 久久综合久久自在自线精品自 | 婷婷丁香五月天综合东京热 | 熟女少妇在线视频播放 | 人妻少妇精品视频专区 | 性做久久久久久久免费看 | 欧洲精品码一区二区三区免费看 | 久久综合香蕉国产蜜臀av | 99国产欧美久久久精品 | 国精产品一品二品国精品69xx | 少妇高潮喷潮久久久影院 | 中文字幕无码热在线视频 | 亚洲国产精品一区二区美利坚 | 久久亚洲中文字幕无码 | 亚洲乱码日产精品bd | 国产精品多人p群无码 | 未满成年国产在线观看 | 国产黄在线观看免费观看不卡 | 巨爆乳无码视频在线观看 | 国产人妻人伦精品1国产丝袜 | 久久综合给合久久狠狠狠97色 | 色老头在线一区二区三区 | 久久久久人妻一区精品色欧美 | 日日摸天天摸爽爽狠狠97 | 色欲综合久久中文字幕网 | 97精品人妻一区二区三区香蕉 | 捆绑白丝粉色jk震动捧喷白浆 | 精品无人国产偷自产在线 | 欧美日韩综合一区二区三区 | 久久人人爽人人人人片 | 亚洲精品成人av在线 | 国产偷抇久久精品a片69 | 成人av无码一区二区三区 | 婷婷丁香六月激情综合啪 | 国产真实伦对白全集 | 免费视频欧美无人区码 | 性欧美牲交xxxxx视频 | 扒开双腿吃奶呻吟做受视频 | 大乳丰满人妻中文字幕日本 | 少妇厨房愉情理9仑片视频 | 欧美性猛交xxxx富婆 | 丰满人妻翻云覆雨呻吟视频 | 老子影院午夜精品无码 | 老熟女乱子伦 | 精品久久久久香蕉网 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 搡女人真爽免费视频大全 | 婷婷色婷婷开心五月四房播播 | 美女扒开屁股让男人桶 | 青青青手机频在线观看 | 久久精品视频在线看15 | 国产精品人妻一区二区三区四 |