精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android Input子系統:Input進程的創建,監聽線程的啟動

移動開發 Android
從我個人的理解來看,Android的Input系統其實就是系統級的事件處理、分發框架,它需要的功能模塊大致有:事件讀取、事件分類、事件分發。那么我們就從整個Input系統的輸入源入手,了解事件是如何被輸入到Input系統中的。

本文主要從系統源碼的角度帶你一步步了解Android Input子系統。

從我個人的理解來看,Android的Input系統其實就是系統級的事件處理、分發框架,它需要的功能模塊大致有:事件讀取、事件分類、事件分發。那么我們就從整個Input系統的輸入源入手,了解事件是如何被輸入到Input系統中的。

在看代碼前我們先想一想,如果要我們設計一個事件分發框架的輸入讀取模塊,要考慮到哪些子模塊:

  • 事件生成模塊(當用戶對設備進行操作產生InputEvent,硬件產生中斷將事件交給驅動,驅動交給內核,內核交給framework)
  • 事件監聽模塊(這里就很像設計一個服務器,為了及時響應來自客戶端的請求,則需要啟動一個線程監聽)
  • 事件讀取模塊
  • 事件分發模塊

那么現在我們最起碼可以知道整個學習的起點了,就是Input系統中,負責監聽的線程是誰,監聽的過程中它們做了什么。 在開始之前,給大家分享一張我根據本文內容畫的圖:

Android Input子系統:Input進程的創建,監聽線程的啟動

InputManagerService初始化概覽

首先,有幾點共識我們都可以達成:

  • Android Framework層的Service(Java)都是由system_server進程創建的(由于沒有fork,因此都運行在system_server進程中)
  • Service創建后就會交給運行在system_server進程中的ServiceManager管理。

因此對于InputManagerService的創建,我們可以在SystemServer的startOtherServices()方法中找到,該方法做了以下事情:

  • 創建InputManagerService對象
  • 將它交給ServiceManager管理
  • 將WindowManagerService的InputMonitor注冊到InputManagerService中作為窗口響應事件后的回調
  • 完成以上工作后啟動InputManagerService。 
  1. SystemServer.javastartOtherServices(){ 
  2.     …… 
  3.     inputManager = new InputManagerService(context); 
  4.     …… 
  5.     inputManager.setWindowManagerCallbacks(wm.getInputMonitor()); 
  6.     inputManager.start(); 
  7.     …… 

 接下來我們就逐部分學習相應的處理。

InputManagerService對象的創建

創建InputManagerService對象時會完成以下工作:

  • 創建一個負責處理DisplayThread線程中的Message的Handler
  • 調用nativeInit初始化native層的InputManagerService,初始化的時候傳入了DisplayThread的消息隊列
  • 用mPtr保存native層的InputManagerService
  • 初始化完成后將Service添加到LocalServices,通過Map以鍵值對的形式存儲 
  1. InputManagerService.javapublic InputManagerService(Context context) {    this.mContext = context;    this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper()); 
  2.  
  3.     mUseDevInputEventForAudioJack = 
  4.             context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack); 
  5.     Slog.i(TAG, "Initializing input manager, mUseDevInputEventForAudioJack=" 
  6.             + mUseDevInputEventForAudioJack); 
  7.     mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue()); 
  8.  
  9.     LocalServices.addService(InputManagerInternal.class, new LocalService()); 

 這里可能有人就會問了,為什么InputManagerService要和DisplayThread綁定在一起?大家不妨想想,InputEvent無論如何被獲取、歸類、分發,最終還是要被處理,也就意味著最終它的處理結果都要在UI上體現,那么InputManagerService自然要選擇和UI親近一些的線程在一起了。

但是問題又來了,應用都是運行在自己的主線程里的,難道InputManagerService要一個個綁定么,還是一個個輪詢?這些做法都太過低效,那換個辦法,可不可以和某個管理或非常親近所有應用UI的線程綁定在一起呢?

答案是什么,我在這里先不說,大家可以利用自己的知識想想。

初始化native層的InputManagerService

在nativeInit函數中,將Java層的MessageQueue轉換為native層的MessageQueue,然后再取出Looper用于NativeInputManager的初始化。可見這里的重頭戲就是NativeInputManager的創建,這個過程做了以下事情:

  • 將Java層的Context和InputManagerService轉換為native層的Context和InputManagerService存儲在mContextObj和mServiceObj中
  • 初始化變量
  • 創建EventHub
  • 創建InputManager 
  1. com_android_server_input_InputManagerService.cpp 
  2.  
  3. NativeInputManager::NativeInputManager(jobject contextObj, 
  4.         jobject serviceObj, const sp<Looper>& looper) : 
  5.         mLooper(looper), mInteractive(true) { 
  6.     JNIEnv* env = jniEnv(); 
  7.  
  8.     mContextObj = env->NewGlobalRef(contextObj); 
  9.     mServiceObj = env->NewGlobalRef(serviceObj); 
  10.  
  11.     {        AutoMutex _l(mLock); 
  12.         mLocked.systemUiVisibility = ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE; 
  13.         mLocked.pointerSpeed = 0; 
  14.         mLocked.pointerGesturesEnabled = true
  15.         mLocked.showTouches = false
  16.     } 
  17.     mInteractive = true
  18.  
  19.     sp<EventHub> eventHub = new EventHub(); 
  20.     mInputManager = new InputManager(eventHub, this, this); 

 EventHub

看到這里很多人就會想,EventHub是什么?取英語釋義來看,它的意思是事件樞紐。我們在文章開頭的時候也提到過,Input系統的事件來源于驅動/內核,那么我們可以猜測EventHub是處理來自驅動/內核的元事件的樞紐。接下來就在源碼中驗證我們的想法吧。

EventHub的創建過程中做了以下事情:

  • 創建mEpollFd用于監聽是否有數據(有無事件)可讀
  • 創建mINotifyFd將它注冊到DEVICE_PATH(這里路徑就是/dev/input)節點,并將它交給內核用于監聽該設備節點的增刪數據事件。那么只要有數據增刪的事件到來,epoll_wait()就會返回,使得EventHub能收到來自系統的通知,并獲取事件的詳細信息
  • 調用epoll_ctl函數將mEpollFd和mINotifyFd注冊到epoll中
  • 定義int wakeFd[2]作為事件傳輸管道的讀寫兩端,并將讀端注冊到epoll中讓mEpollFd監聽 
  1. EventHub.cpp 
  2.  
  3. EventHub::EventHub(void) : 
  4.         mBuiltInKeyboardId(NO_BUILT_IN_KEYBOARD), mNextDeviceId(1), mControllerNumbers(), 
  5.         mOpeningDevices(0), mClosingDevices(0), 
  6.         mNeedToSendFinishedDeviceScan(false), 
  7.         mNeedToReopenDevices(false), mNeedToScanDevices(true), 
  8.         mPendingEventCount(0), mPendingEventIndex(0), mPendingINotify(false) { 
  9.     acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID); 
  10.  
  11.     mEpollFd = epoll_create(EPOLL_SIZE_HINT); 
  12.     LOG_ALWAYS_FATAL_IF(mEpollFd < 0, "Could not create epoll instance.  errno=%d", errno); 
  13.  
  14.     mINotifyFd = inotify_init(); 
  15.     int result = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE); 
  16.     …… 
  17.     result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mINotifyFd, &eventItem); 
  18.     …… 
  19.     int wakeFds[2]; 
  20.     result = pipe(wakeFds); 
  21.     …… 
  22.     mWakeReadPipeFd = wakeFds[0]; 
  23.     mWakeWritePipeFd = wakeFds[1]; 
  24.  
  25.     result = fcntl(mWakeReadPipeFd, F_SETFL, O_NONBLOCK); 
  26.     …… 
  27.     result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK); 
  28.     …… 
  29.     result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, &eventItem); 
  30.     …… 

  Android Input子系統:Input進程的創建,監聽線程的啟動

那么這里拋出一個問題:為什么要把管道的讀端注冊到epoll中?假如EventHub因為getEvents讀不到事件而阻塞在epoll_wait()里,而我們沒有綁定讀端的話,我們要怎么喚醒EventHub?如果綁定了管道的讀端,我們就可以通過向管道的寫端寫數據從而讓EventHub因為得到管道寫端的數據而被喚醒。

InputManager的創建

接下來繼續說InputManager的創建,它的創建就簡單多了,創建一個InputDispatcher對象用于分發事件,一個InputReader對象用于讀事件并把事件交給InputDispatcher分發,,然后調用initialize()初始化,其實也就是創建了InputReaderThread和InputDispatcherThread。 

  1. InputManager.cpp 
  2.  
  3. InputManager::InputManager(        const sp<EventHubInterface>& eventHub,        const sp<InputReaderPolicyInterface>& readerPolicy,        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) { 
  4.     mDispatcher = new InputDispatcher(dispatcherPolicy); 
  5.     mReader = new InputReader(eventHub, readerPolicy, mDispatcher); 
  6.     initialize(); 
  7. }void InputManager::initialize() { 
  8.     mReaderThread = new InputReaderThread(mReader); 
  9.     mDispatcherThread = new InputDispatcherThread(mDispatcher); 

 InputDispatcher和InputReader的創建都相對簡單。InputDispatcher會創建自己線程的Looper,以及設置根據傳入的dispatchPolicy設置分發規則。InputReader則會將傳入的InputDispatcher封裝為監聽對象存起來,做一些數據初始化就結束了。

至此,InputManagerService對象的初始化就完成了,根據開頭說的,接下來就會調用InputManagerService的start()方法。

監聽線程InputReader和InputDispatcher的啟動

在start()方法中,做了以下事情:

  • 調用nativeStart方法,其實就是調用InputManager的start()方法
  • 將InputManagerService交給WatchDog監控
  • 注冊觸控點速度、顯示觸控的觀察者,并注冊廣播監控它們
  • 主動調用updateXXX方法更新(初始化) 
  1. InputManagerService.javapublic void start() { 
  2.     Slog.i(TAG, "Starting input manager"); 
  3.     nativeStart(mPtr);    // Add ourself to the Watchdog monitors. 
  4.     Watchdog.getInstance().addMonitor(this); 
  5.  
  6.     registerPointerSpeedSettingObserver(); 
  7.     registerShowTouchesSettingObserver(); 
  8.     registerAccessibilityLargePointerSettingObserver(); 
  9.  
  10.     mContext.registerReceiver(new BroadcastReceiver() {        @Override 
  11.         public void onReceive(Context context, Intent intent) { 
  12.             updatePointerSpeedFromSettings(); 
  13.             updateShowTouchesFromSettings(); 
  14.             updateAccessibilityLargePointerFromSettings(); 
  15.         } 
  16.     }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler); 
  17.  
  18.     updatePointerSpeedFromSettings(); 
  19.     updateShowTouchesFromSettings(); 
  20.     updateAccessibilityLargePointerFromSettings(); 

 顯而易見這里最值得關注的就是InputManager的start()方法了,可惜這個方法并不值得我們如此關心,因為它做的事情很簡單,就是啟動InputDispatcherThread和InputReaderThread開始監聽。 

  1. status_t InputManager::start() { 
  2.     status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);    if (result) { 
  3.         ALOGE("Could not start InputDispatcher thread due to error %d.", result);        return result; 
  4.     } 
  5.  
  6.     result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);    if (result) { 
  7.         ALOGE("Could not start InputReader thread due to error %d.", result); 
  8.  
  9.         mDispatcherThread->requestExit();        return result; 
  10.     }    return OK; 

 那么InputReaderThread線程是怎么和EventHub關聯起來的呢?

對于InputReadThread:

  • 啟動后循環執行mReader->loopOnce()
  • loopOnce()中會調用mEventHub->getEvents讀取事件
  • 讀到了事件就會調用processEventsLocked處理事件
  • 處理完成后調用getInputDevicesLocked獲取輸入設備信息
  • 調用mPolicy->notifyInputDevicesChanged函數利用InputManagerService的代理通過Handler發送MSG_DELIVER_INPUT_DEVICES_CHANGED消息,通知輸入設備發生了變化
  • ***調用mQueuedListener->flush(),將事件隊列中的所有事件交給在InputReader中注冊過的InputDispatcher 
  1. bool InputReaderThread::threadLoop() { 
  2.     mReader->loopOnce();    return true
  3. }void InputReader::loopOnce() { 
  4.     …… 
  5.  
  6.     size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE); 
  7.  
  8.     { // acquire lock 
  9.         AutoMutex _l(mLock); 
  10.         mReaderIsAliveCondition.broadcast();        if (count) { 
  11.             processEventsLocked(mEventBuffer, count); 
  12.         } 
  13.  
  14.     ……        if (oldGeneration != mGeneration) { 
  15.             inputDevicesChanged = true
  16.             getInputDevicesLocked(inputDevices); 
  17.         } 
  18.     } // release lock 
  19.  
  20.     // Send out a message that the describes the changed input devices. 
  21.     if (inputDevicesChanged) { 
  22.         mPolicy->notifyInputDevicesChanged(inputDevices); 
  23.     } 
  24.  
  25.     …… 
  26.     mQueuedListener->flush(); 

至此,Input系統有關事件輸入模塊的學習就結束了,在后續的文章中會繼續學習Input系統的事件歸類、分發流程,感興趣的朋友可以留意關注。

 

責任編輯:未麗燕 來源: 知乎專欄
相關推薦

2021-08-31 11:53:38

Linux inputLinux 系統

2017-02-28 18:26:09

Linuxinput子系統編程

2016-10-28 21:30:00

AndroidJava進程

2009-07-08 10:56:04

WebWork

2011-02-14 10:49:40

HTML 5

2014-12-11 16:40:31

Android|進程線程

2020-08-23 08:59:35

number修飾鍵代碼

2022-04-01 15:18:04

HarmonyHDF 驅動鴻蒙

2013-01-06 13:06:02

2011-09-19 18:56:17

啟動磁盤Vista

2012-05-04 09:49:34

進程

2018-07-06 14:00:55

Linux進程線程

2021-07-22 08:03:08

Windows 操作系統Linux

2021-07-05 09:35:36

鴻蒙HarmonyOS應用

2019-02-26 11:15:25

進程多線程多進程

2021-12-13 22:52:37

iphone iOSHTML

2021-06-17 07:55:34

線程進程COW

2021-08-10 11:30:30

Linux代碼中斷控制器

2021-08-03 15:10:26

Linux代碼驅動

2024-06-11 00:00:20

Input自動拼寫開發
點贊
收藏

51CTO技術棧公眾號

久久综合久久八八| 洋洋成人永久网站入口| 欧美一区二区三区图| 久久精品老司机| 97成人资源| 欧美激情一区在线| 91精品国产色综合| 久久久亚洲av波多野结衣| 免费电影日韩网站| 国产精品人成在线观看免费 | 亚洲在线免费看| 免费在线观看黄视频| 国偷自产av一区二区三区| 日韩欧美aaa| 亚洲欧美一区二区原创| www.激情五月| 丝袜美腿亚洲一区二区图片| 色青青草原桃花久久综合| 欧美老女人bb| 日本精品不卡| 亚洲精品乱码久久久久久黑人 | 中文无码av一区二区三区| 五月婷婷亚洲| 精品偷拍各种wc美女嘘嘘| 久久国产激情视频| 97在线超碰| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 懂色av粉嫩av蜜臀av| 日韩一级片免费在线观看| 免费人成在线不卡| 欧美精品久久久久久久免费观看| 中国美女乱淫免费看视频| 亚洲人体在线| 色猫猫国产区一区二在线视频| 亚洲乱码一区二区三区| 国产91免费看| 九九九久久久精品| 日本一区二区三区在线播放| 免费毛片在线播放免费| 日韩大片在线观看| 精品调教chinesegay| 日韩一区二区三区久久| 成人爱爱网址| 亚洲第一狼人社区| 99精品一区二区三区的区别| 99精品老司机免费视频| 91最新地址在线播放| y111111国产精品久久婷婷| 性高潮视频在线观看| 午夜亚洲性色福利视频| 久久久亚洲国产| 亚洲av无一区二区三区| 日本不卡免费一区| 亚洲第一网站免费视频| 日日夜夜精品视频免费观看| 欧美电影在线观看网站| 色婷婷一区二区三区四区| 黄网站色视频免费观看| 毛片在线视频| 国产精品免费aⅴ片在线观看| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 精品福利在线视频| 天堂av在线中文| 免费高清完整在线观看| 中国色在线观看另类| 日韩福利影院| 偷拍25位美女撒尿视频在线观看| 懂色av噜噜一区二区三区av| 5g影院天天爽成人免费下载| 国产精品视频无码| 精品一区二区久久| 91精品美女在线| 亚洲视频中文字幕在线观看| 蜜臀a∨国产成人精品| 国产精品福利小视频| 波多野结衣毛片| 男人的天堂久久精品| 成人久久一区二区| 国产sm主人调教女m视频| 麻豆成人免费电影| 国产精品视频一区国模私拍| 怡红院男人的天堂| 国内精品在线播放| 成人免费在线一区二区三区| 秋霞网一区二区| 成人污视频在线观看| av观看久久| 欧美在线 | 亚洲| 91亚洲精品乱码久久久久久蜜桃| 久久久久久久久久久久久久一区 | 国产精品自在在线| 97超级在线观看免费高清完整版电视剧| 国产av一区二区三区| 岛国精品在线观看| 精品视频在线观看| 国产黄色在线| 国产精品久久毛片a| 久久久久亚洲av无码专区喷水| a级毛片免费观看在线| 亚洲成人av中文| 国产三级三级三级看三级| 日韩成人在线电影| 日韩你懂的在线播放| 国产精品一级无码| 亚洲精品蜜桃乱晃| 色婷婷av一区二区三区在线观看| 亚洲成人生活片| 国产精品腿扒开做爽爽爽挤奶网站| 国产精品18久久久久久麻辣| 一级做a爱片性色毛片| 成人一道本在线| 欧美精品国产精品久久久| 尤物网在线观看| 亚洲国产aⅴ天堂久久| 日韩精品一区中文字幕| 国产精品亚洲综合在线观看 | 成人免费电影网址| 欧美丰满老妇厨房牲生活| 日本精品入口免费视频| 粉嫩欧美一区二区三区高清影视| 欧美成ee人免费视频| 成年视频在线观看| 色综合久久88色综合天天6| 日本免费观看网站| 高清精品视频| www高清在线视频日韩欧美| 日本一区二区免费在线观看| 美女性感视频久久| 亚洲尤物视频网| 高清在线观看av| 午夜在线电影亚洲一区| 特黄视频免费观看| 香蕉一区二区| 色在人av网站天堂精品| 波多野结衣二区三区| 不卡av在线网| 成人在线免费观看网址| 婷婷综合六月| 亚洲精品美女视频| 日韩一卡二卡在线观看| 久久午夜av| 黄色小网站91| 爱草tv视频在线观看992| 制服丝袜亚洲播放| 91社区视频在线观看| 影音先锋中文字幕一区| 亚洲mm色国产网站| 国产黄色在线播放| 日韩欧美国产成人| 老司机午夜免费福利| 91欧美在线| 国产精品视频白浆免费视频| 久久精品国产亚洲a∨麻豆| 香蕉影视欧美成人| 欧美做受高潮中文字幕| 999成人精品视频线3| 国产精品久久久久久久久久ktv| 四虎国产精品永远| 亚洲二区在线视频| 国产欧美视频一区| 综合久久精品| av日韩中文字幕| 肉体视频在线| 欧美不卡123| 99成人在线观看| 国内不卡的二区三区中文字幕| 亚洲欧美日韩综合一区| 网友自拍亚洲| 国产午夜精品美女视频明星a级| 4438国产精品一区二区| 久久免费美女视频| 欧美成人黑人猛交| 欧美色图一区| 成人高清视频观看www| 麻豆传媒在线完整视频| 91精品国产麻豆国产自产在线 | 国产尤物视频在线观看| 中文字幕人成不卡一区| www.cao超碰| 日韩欧美视频| 91系列在线观看| av免费网站在线| 精品噜噜噜噜久久久久久久久试看| 欧美日韩大片在线观看| 成人免费不卡视频| 亚洲午夜无码av毛片久久| 天堂俺去俺来也www久久婷婷| 日韩免费观看视频| 丝袜美腿美女被狂躁在线观看| 欧美视频一区在线| www.99re7| 99在线精品观看| 蜜臀久久99精品久久久酒店新书| 国产欧美日韩精品一区二区三区| 国产精品三级网站| 日韩av激情| 亚洲免费一级电影| 亚洲一级片免费看| 亚洲人成精品久久久久| 亚洲av成人精品一区二区三区 | 国产精品久久国产精麻豆99网站| 特黄特黄一级片| 国产一区二区三区的电影| 性刺激综合网| 亚洲一区网址| 国产精品电影一区| 视频在线观看入口黄最新永久免费国产| 亚洲精品久久久久久下一站 | 欧美日韩专区在线| 亚洲精品卡一卡二| 972aa.com艺术欧美| 999在线观看| 国产婷婷精品| 在线成人性视频| 99a精品视频在线观看| 日韩av电影在线免费播放| 18+激情视频在线| 亚洲午夜国产成人av电影男同| 91av久久久| 欧美日韩美女在线| 黄色录像二级片| 久久精品在线免费观看| 韩国三级视频在线观看| 亚洲欧美不卡| 日韩一区二区高清视频| 日本一区二区高清不卡| 国产高清自拍一区| 亚洲国产综合在线观看| 欧美重口另类videos人妖| av在线免费观看网址| 夜夜嗨av一区二区三区四区| a级片在线视频| 欧美天堂一区二区三区| 日本网站免费观看| 亚洲视频免费看| 亚洲一区 欧美| 久久亚洲精品国产精品紫薇| 最新国产精品自拍| 国产一区二区视频在线| 亚洲成人福利在线观看| 久久激情久久| 国产中文字幕在线免费观看| 欧美成人一品| 一区二区三区四区欧美| 精品国产一区二区三区| 久久香蕉综合色| 乱亲女h秽乱长久久久| 91精品在线观| 日韩一区二区三区四区五区| 日韩美女免费观看| 松下纱荣子在线观看| 久久久久久这里只有精品| 91麻豆免费在线视频| 日韩中文字幕国产精品| av免费在线一区二区三区| 国产丝袜精品视频| 午夜视频1000| 亚洲精品视频网上网址在线观看| 人人妻人人澡人人爽久久av | 国产精品免费无遮挡| 欧美日韩一区二区电影| 岳乳丰满一区二区三区| 欧美图区在线视频| 国产又爽又黄免费软件| 在线成人小视频| 97人妻精品一区二区三区软件| 欧美三级视频在线| 在线观看免费视频a| 欧美视频在线一区| 国产精品综合在线| 制服丝袜国产精品| 国产成人免费看一级大黄| 日韩精品一区二区三区视频在线观看| 国产成人精品毛片| 欧美精品第一页| 11024精品一区二区三区日韩| 欧美丰满高潮xxxx喷水动漫| aaa一区二区三区| 日韩欧美中文字幕精品| 日韩一级中文字幕| 日韩精品在线第一页| 国模精品一区二区| 色偷偷噜噜噜亚洲男人| 在线视频国产区| 国外视频精品毛片| 伊人影院蕉久影院在线播放| 欧美激情乱人伦一区| 亚洲精品国产嫩草在线观看| 91中文字精品一区二区| 国产成人精品三级高清久久91| 天天做天天爱天天高潮| 亚洲精品孕妇| 日本中文字幕二区| 91丨九色porny丨蝌蚪| 婷婷激情四射网| 色婷婷一区二区| 亚洲免费成人网| 最近免费中文字幕视频2019| 高端美女服务在线视频播放| 91亚洲精品在线| 欧美激情在线精品一区二区三区| 伊人再见免费在线观看高清版| 日韩综合一区二区| 日韩无码精品一区二区| 亚洲欧洲精品一区二区三区| 成人免费毛片男人用品| 欧美白人最猛性xxxxx69交| h网站视频在线观看| 78色国产精品| 成功精品影院| 天堂av一区二区| 免费精品视频| 岛国精品一区二区三区| 国产精品久久久久aaaa樱花| 欧美a视频在线观看| 欧美sm美女调教| 国产乱色在线观看| 国产精品亚发布| 一道在线中文一区二区三区| 久艹视频在线免费观看| 国产毛片精品视频| 精品亚洲乱码一区二区| 在线观看日韩高清av| 日韩亚洲视频在线观看| 性欧美暴力猛交69hd| 波多野结衣一区二区三区免费视频| 国产91av视频在线观看| 免费在线欧美视频| 亚洲精品国产一区黑色丝袜| 精品人伦一区二区三区蜜桃网站 | 黄色国产一级视频| 粉嫩av亚洲一区二区图片| 久久久久久视频| 91麻豆精品国产91久久久资源速度| 91九色在线porn| 国产精品爽爽ⅴa在线观看| 成人精品影视| 在线能看的av网站| 成人免费在线播放视频| 在线黄色av网站| 日韩一区二区欧美| 色999久久久精品人人澡69| 欧美一区二区福利| 欧美区亚洲区| jjzz黄色片| 婷婷成人激情在线网| 香蕉视频网站在线| 人妖精品videosex性欧美| 天堂99x99es久久精品免费| 欧美极品欧美精品欧美图片| 91色在线porny| 欧美一区二区三区网站| 国产亚洲精品美女| 男人亚洲天堂| 永久免费网站视频在线观看| 粉嫩高潮美女一区二区三区 | 欧美日韩三区四区| 水蜜桃在线视频| 91国产成人在线| 第三区美女视频在线| 国产精品视频中文字幕91| 婷婷精品进入| 91porn在线| 精品久久香蕉国产线看观看gif| 亚洲欧洲视频在线观看| 日本韩国在线不卡| 成人影院在线| 又黄又爽又色的视频| 一区二区三区四区亚洲| 天堂在线视频网站| 日本成人在线视频网址| 日韩伦理一区| 日韩av成人网| 一本大道久久a久久综合| 日本中文字幕在线2020| 亚洲xxx视频| 国产精品久久久久毛片大屁完整版| 亚洲黄色免费视频| 欧美一区二区三区在线电影| 888av在线视频| 亚洲v国产v| 成人黄色av电影| 亚洲午夜无码久久久久| 色综合男人天堂| 欧美人与牛zoz0性行为| 毛片毛片毛片毛| 天天综合网天天综合色| 日本高清中文字幕在线| 精品国产乱码久久久久久郑州公司 | 成人乱码一区二区三区| 日韩av免费在线播放| 亚洲天天影视网| 国产精品高清无码在线观看| 欧美一区二区视频在线观看2022| 午夜影院一区| 91视频成人免费| 国产欧美一区二区三区鸳鸯浴| 国产aⅴ一区二区三区| 国产经典一区二区| 在线成人亚洲|