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

深入了解Messenger的實現細節

移動開發 Android
Android 上實現 IPC (進程間通訊)的方式有好幾種,其中有一種就是使用 AIDL 方式實現。對于使用 AIDL 方式通訊,其關鍵就在于創建 aidl 文件,系統會自動為 aidl 文件生成相應的 Java 類,其關鍵實現在于生成的 Java 類中。

近一個半月因為工作變動的緣故,忙著交接工作和復習面試。沒有多少時間來寫博客,連一周三次的健身都有幾個星期沒練了,好多同事問我是胖了還是壯了(我迅速就岔開話題了,機智boy)。上周離職,這周主要在處理一些私事、做些入職準備工作、看點書之類的,下周入職YY(上周才知道原來大神羅升陽也在YY)。好啦,說了這么多,要開始進入 Messenger 的正題了。

前言

看這篇文章前,需要對 Android 的進程間通訊方式有所了解,不然可能會云里霧里。

從使用 Messenger 說起

Android 上實現 IPC (進程間通訊)的方式有好幾種,其中有一種就是使用 AIDL 方式實現,對使用 AIDL 不了解的童鞋可以看下方的官方文檔(需要梯子)。

https://developer.android.com...

對于使用 AIDL 方式通訊,其關鍵就在于創建 aidl 文件,系統會自動為 aidl 文件生成相應的 Java 類,其關鍵實現在于生成的 Java 類中。

系統提供了一個更方便我們進行 IPC 的類 —— Messenger,先來看看如何使用 Messenger(熟悉的童鞋完全可以跳過這一部分)。

  • 第一步:客戶端進程創建兩個 Messenger,一個 Sender ,一個 Receiver;
  1. //客戶端進程發消息給服務進程 
  2.    private Messenger mSender; 
  3.    //客戶端進程接收服務進程回調 
  4.    private Messenger mReceiver = new Messenger(new Handler() { 
  5.        @Override 
  6.        public void handleMessage(Message msg) { 
  7.            super.handleMessage(msg); 
  8.            Bundle data = msg.getData(); 
  9.            if (data != null) { 
  10.                String response = data.getString("body"); 
  11.                Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show(); 
  12.            } 
  13.        } 
  14.    });  
  • 第二步:編寫Service類,并需要在 AndroidManifest.xml 配置多進程;
  1. public class IPCService extends Service { 
  2.  
  3.     private Messenger messenger = new Messenger(new Handler() { 
  4.         @Override 
  5.         public void handleMessage(Message msg) { 
  6.             super.handleMessage(msg); 
  7.             try { 
  8.                 Thread.sleep(2 * 1000); 
  9.             } catch (InterruptedException e) { 
  10.                 e.printStackTrace(); 
  11.             } 
  12.             Message response = Message.obtain(); 
  13.             Bundle data = new Bundle(); 
  14.             data.putString("body""response"); 
  15.             response.setData(data); 
  16.             try { 
  17.                 msg.replyTo.send(response);//回調客戶端 
  18.             } catch (RemoteException e) { 
  19.                 e.printStackTrace(); 
  20.             } 
  21.         } 
  22.     }); 
  23.  
  24.     @Override 
  25.     public IBinder onBind(Intent intent) { 
  26.         return messenger.getBinder();//將Binder返回給請求綁定的進程 
  27.     } 
  28.  
  29.  
  • 第三步:綁定Service進程,并在 ServiceConnection 中初始化 Sender;
  1. Intent intent = new Intent(this, IPCService.class); 
  2.     startService(intent); 
  3.     bindService(intent, conn, Context.BIND_AUTO_CREATE);//啟動綁定Service進程 
  4.  
  5.     private ServiceConnection conn = new ServiceConnection() { 
  6.         @Override 
  7.         public void onServiceConnected(ComponentName name, IBinder service) { 
  8.             mSender = new Messenger(service); //用Binder初始化Sender 
  9.         } 
  10.  
  11.         @Override 
  12.         public void onServiceDisconnected(ComponentName name) { 
  13.  
  14.         } 
  15.     };  
  • 第四步:用 Sender 和 Receiver 完成客戶端進程和服務進程的交互。
  1. if (mSender != null) { 
  2.         Message message = Message.obtain(); 
  3.         message.replyTo = mReceiver;//將 Receiver 一并發送給服務進程 
  4.         try { 
  5.              mSender.send(message); 
  6.         } catch (RemoteException e) { 
  7.              e.printStackTrace(); 
  8.         } 
  9.      }  

至此,在綁定服務進程初始化 Sender 后,即可以做多進程間的交互工作了。使用 Messenger 來實現多進程的交互相比我們用 aidl 來要方便得多,但是 Messenger 的內部也是采用 aidl 實現的,只不過為了方便開發者調用而進行一些封裝,使得開發者們可以忽略 aidl 的實現細節。簡單的了解了 Messenger 的基本使用后,下面我們就來看看 Messenger 的源代碼,了解一些內部的實現細節。

  • Messenger 源代碼通讀

Messenger 類位于 android.os 包下,代碼量不是很多,所以看起來難度不大,只有如下這么幾個方法。

在上面的示例代碼中可以看到,客戶端進程有 Sender 和 Receiver 兩個 Messenger,如果不需要實現服務進程回調客戶端進程,那么 Receiver 完全可以不要。當需要服務進程回調客戶端進程時,則需要傳入 Receiver 了。由于需要在進程間傳遞 Messenger 對象,那么 Messenger 類就必須要繼承 Serializable 或者 Parcelable 接口。按照 Android 系統一向的風格,都是偏向于推薦繼承 Parcelable 來實現。

所以,上面看到的 describeContents、writeToParcel 方法和 CREATOR 對象實際上繼承 Parcelable 的實現。不明白的童鞋可以參照 Parcelable 的官方文檔(需要梯子)

https://developer.android.com...

而 equals 和 hashCode 方法自然不用多說啦,大家熟悉得很。而 writeMessengerOrNullToParcel 和 readMessengerOrNullFromParcel 這對靜態方法主要是實現 Messenger 在 Parcel 中的讀寫操作的,實現比較簡單,大家參見下面代碼就可以理解了。

當然,Messenger 除了繼承 Parcelable 外,還需要聲明一個同名的 Messenger.aidl 文件,可以在 framework 層源碼下 android.os 包中找到 Messenger.aidl 文件,對于寫過 aidl 的童鞋,肯定不陌生了。

排除掉上面提到的方法,剩下的主要是 Messenger 的兩個構造方法以及 getBinder 和 send 方法。客戶端調用服務進程方法時,是通過 Messenger 中的 send 方法,所以我們先直接看 send 方法中的內部實現

其內部是調用了 mTarget 的 send 方法,那么 mTarget 又是何物呢?

 從上面可以看到 mTarget 是一個 IMessenger 實例,作為 Messenger 唯一的成員變量。 初始化 mTarget 是在 public Messenger(Handler target) 構造函數中,利用 Handler 的 getIMessenger 方法來獲取一個 IMessenger 的實例。

從上圖可以看到 getIMessenger 前面是沒有修飾符的,這樣控制了該方法的作用域僅限于 android.os 包內給其他類使用,我們日常開發是無法使用該方法的,所以在 API 文檔中也沒有提供相應接口文檔。在倒數第二行中可以看到 new MessengerImpl() 并在最后 return 給調用者。所以實際上, mTarget 具體實現是在 MessengerImpl 中。

MessengerImpl 實際上是 Handler 的一個私有內部類,它繼承了 IMessenger.Stub 并實現 send 方法。用過 aidl 的童鞋 IMessenger.Stub 的身影想必就明白了,實際上 IMessenger 就是系統提供的 IMessenger.aidl 文件,而 IMessenger.Stub 就是由 IMessenger.aidl 生成的類。 IMessenger.aidl 在 framework 層代碼的 android.os 包中可以找到,而關于 IMessenger 的 Java 實現,則可以看下面的鏈接。

http://grepcode.com/file/repo...

MessengerImpl 的 send 實現相對也比較簡單,只有兩行代碼

  1. public void send(Message msg) { 
  2.        msg.sendingUid = Binder.getCallingUid(); 
  3.        Handler.this.sendMessage(msg); 
  4.    }  

首先是將發起調用的客戶端進程的 Linux Uid 存儲在我們傳入的 Message 對象中,服務進程收到 Message 可以通過 msg.sendingUid 得知發起調用的進程的 Linux Uid。接著通過 Handler 的 sendMessage 方法發送給服務進程,這意味著 Messenger 與服務進程間的操作是串行的,因此,在有并行需求的場景下 Messenger 就不適用了。

了解完了 send 方法后,最后就只剩下 getBinder 了,其內部實現也簡單。

 參照前面的示例代碼,這里主要還是在 Service 的 onBind 方法中返回 Binder 對象給客戶端調用,實現同樣是 IMessenger 的 Java 實現中。

至此,基本上看完了整個 Messenger 的內部代碼,從上面的分析上看,內部實現確實非常簡單,基于 aidl 的基礎上做的封裝實現,又對開發者屏蔽了底層 aidl 的實現細節。當然個人認為有兩點不足之處:

  • 一個前面提到的 send 操作串行,并行場景則無法用 Messenger;
  • Messenger 內部沒有做 Binder 鍵斷裂重連的處理(個人認為內部處理了會更好,更加屏蔽底層的實現細節);

遠程調用的阻塞與非阻塞

Android 系統跨進程通訊的底層實現都是通過 Binder 實現,正常情況下客戶端進程發起一個遠程方法調用的流程大致如下:

  • 客戶端線程發起調用;
  • 客戶端線程將遠程調用操作交給 Binder 線程池,并阻塞等待返回遠程方法執行完畢返回;

這也就意味著,我們不能在客戶端進程的 UI 線程中發起遠程方法調用,不然如果遠程方法執行了耗時操作,客戶端的 UI 線程將會被阻塞,從而造成 ANR 的問題存在。讀者可以自行嘗試自定義 aidl 并發起一個耗時的遠程方法調用進行驗證。但是,如果你使用系統提供的 Messenger ,則不會出現這樣的問題,無論你的遠程方法執行多么耗時,客戶端 Messenger 發起調用后會繼續執行接下來的代碼,并不會進行阻塞等待。這里讓我百思不得其解,為什么呢?前面我們可以看到 Messenger 的 send 方法實現是在 MessengerImpl 中

并且,發送 Messeage 的操作是利用主線程的 Handler ,并沒有其他的異步操作,為何執行的過程中不阻塞?這點我也完全沒有想明白,最后折騰半天無果向任玉剛老師求助才得到答案。原來,默認情況下發起的遠程方法調用都是阻塞式的,但也可以是非阻塞式的。 Messenger 就是采用非阻塞的方式通訊,其關鍵就在于 IMessenger.aidl 的實現

相比平常自定義的 aidl,多了 oneway 的關鍵字,聲明和不聲明 oneway 關鍵字的在于生成 Java 類中一個參數

 

 

不聲明 oneway 時,mRemote.transact 傳入的最后一個參數是 0;聲明 oneway 時,mRemote.transact 傳入的最后一個參數是 android.os.IBinder.FLAG_ONEWAY 。

  

 

查看 API 文檔即可以看到 FLAG_ONEWAY 的作用就是讓客戶端能夠非阻塞的調用遠程方法,至此真相大白,如果我們自定義的 aidl 也想實現非阻塞的調用,只需聲明 oneway 關鍵字即可。

總結

因為平時并不常用到 oneway,加上文檔提及的很少,唯一有描述的就是下面這段。這次看了 Messenger 的代碼才知道有這么回事,也是漲姿勢了。

對我的博文感興趣,可以關注我的簡書喲:

http://www.jianshu.com/users/...

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2020-09-21 05:58:40

深度學習算法目標檢測

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2010-07-13 09:36:25

2010-06-23 20:31:54

2020-07-20 06:35:55

BashLinux

2017-06-13 12:40:47

Python字符串對象

2019-08-02 08:59:21

Token認證服務器

2017-01-20 08:30:19

JavaScriptfor循環

2019-11-29 16:21:22

Spring框架集成

2018-02-24 13:21:02

2021-09-03 08:27:47

FortinetSASE平臺安全

2018-09-04 16:20:46

MySQ索引數據結構

2013-04-10 11:16:19

iPad的MouseE

2023-12-01 09:14:58

ReactFiber

2010-11-15 11:40:44

Oracle表空間

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件
點贊
收藏

51CTO技術棧公眾號

欧美国产精品人人做人人爱| 在线看国产一区| 国产成人精品福利一区二区三区| 久久精品女人毛片国产| 要久久爱电视剧全集完整观看| 色综合天天综合网天天狠天天| 四虎影院一区二区三区 | 欧美视频在线观看免费| 色大师av一区二区三区| 午夜精品久久久久久久第一页按摩| 亚洲国内精品| 日韩一级黄色av| 老司机免费视频| 成人动漫视频在线观看| 欧美日韩亚洲一区二区| 色一情一乱一乱一区91| 你懂的免费在线观看| 国产一区二区看久久| 日韩av大片在线| 久久视频免费看| 成人情趣视频网站| 日韩精品视频在线| 能看毛片的网站| 99欧美精品| 精品久久久久久中文字幕一区奶水 | 国产劲爆久久| 正在播放亚洲一区| 无码日韩人妻精品久久蜜桃| 激情影院在线| 一级片视频免费| 亚洲精品韩国| 欧美激情一区二区三区久久久| 女女互磨互喷水高潮les呻吟 | 日日骚欧美日韩| 91成人福利在线| 久久久久性色av无码一区二区| 91欧美日韩| 中文一区二区视频| 天天躁夜夜躁狠狠是什么心态| 欧美人成在线观看ccc36| 欧美成人一区二区三区片免费 | 久久久精品一区| 中文天堂资源在线| 欧洲乱码伦视频免费| 亚洲精品自拍第一页| www.17c.com喷水少妇| 成功精品影院| 精品剧情在线观看| 美女流白浆视频| 中文字幕一区二区三区中文字幕| 91精品免费观看| 中文字幕国产免费| 97欧美成人| 色婷婷久久久综合中文字幕| 欧美极品欧美精品欧美图片| 高h视频在线播放| 一区二区激情视频| 永久免费网站视频在线观看| 亚洲成a人v欧美综合天堂麻豆| 久久女同精品一区二区| 精品久久久久久中文字幕动漫| 一级黄色片视频| 麻豆精品一二三| 国产精品一区二区三区免费视频| 国产伦精品一区二区三区视频我| 国产欧美三级| 青青草原一区二区| 免费黄色网址在线| 久久精品欧洲| 91国产视频在线播放| 日本在线小视频| 无码人妻精品一区二区三区夜夜嗨 | 久久先锋资源网| 国产一区免费| 日本毛片在线观看| 99视频精品全部免费在线| 精品国产一区二区三区四区精华| 嫩草影院一区二区| 成人免费av资源| 蜜桃999成人看片在线观看| 青青草免费在线| 国产亚洲自拍一区| 亚洲激情图片| 福利视频在线| 亚洲综合免费观看高清完整版在线| 99中文字幕在线观看| 在线观看免费视频你懂的| 亚洲一区在线播放| 久久网站免费视频| 欧美电影免费看| 欧美日韩一本到| 日本网站在线看| 久久资源综合| 亚洲人线精品午夜| 好吊日在线视频| 亚洲美洲欧洲综合国产一区| 国产成人精品在线观看| 国产精品嫩草影院桃色| 成人午夜av影视| 精品视频免费观看| h视频在线免费| 亚洲综合图片区| 国产午夜福利视频在线观看| 激情久久一区二区| 精品国产欧美一区二区| 97超碰在线资源| 亚洲理论电影网| 97香蕉久久超级碰碰高清版 | 午夜在线视频观看日韩17c| 国产精品免费久久久久久| 精品人妻少妇AV无码专区| 99re视频精品| av电影一区二区三区| 678在线观看视频| 欧美丝袜丝交足nylons| 精品国产乱码久久久久夜深人妻| 北岛玲一区二区| 人人九九精品视频| 亚洲三级av在线| 日本a级片视频| 日韩和欧美一区二区| 97se视频在线观看| www日韩tube| 午夜av区久久| 亚洲一二区在线观看| 亚洲bt欧美bt精品777| 久久艹在线视频| 最近中文字幕av| 久久精品一区二区三区不卡| 免费人成在线观看视频播放| 秋霞国产精品| 亚洲精品国产suv| 美女的奶胸大爽爽大片| 日本成人中文字幕| 精品国产乱码久久久久久丨区2区| 日本中文在线观看| 色综合一区二区| xxxwww国产| 亚洲精品久久| 国产精品一区二区在线| 二区三区在线| 欧美性猛交丰臀xxxxx网站| 国产在线a视频| 在线成人激情| 国产在线观看精品一区二区三区| 欧美日本网站| 亚洲大片免费看| 色欲无码人妻久久精品| 欧美国产一级| 国产精品色悠悠| 成人在线免费看| 午夜精品国产更新| 亚洲精品乱码久久| 99综合在线| 国产亚洲福利社区| eeuss鲁一区二区三区| 欧美成人猛片aaaaaaa| 日韩一级片大全| 久久成人久久爱| 亚洲人成影视在线观看| 国产亚洲精品精品国产亚洲综合| 亚洲视频在线免费看| 色av性av丰满av| www.性欧美| 乱子伦视频在线看| 国产伦精品一区二区三区视频| 日韩av电影在线播放| 91av中文字幕| 国产精品日韩无码| 亚洲欧美另类久久久精品| 天天综合成人网| 韩日在线一区| 精品伦精品一区二区三区视频 | 中文字幕在线不卡一区| 女同激情久久av久久| 欧美码中文字幕在线| 26uuu另类亚洲欧美日本老年| 视频三区在线观看| 在线欧美小视频| 娇小11一12╳yⅹ╳毛片| 久久国产夜色精品鲁鲁99| 大地资源第二页在线观看高清版| 精品国产一区二| 久久久久久高潮国产精品视| 欧美自拍偷拍第一页| 精品国产福利在线| 国产ts在线播放| 久草热8精品视频在线观看| 9色视频在线观看| 欧美理论电影在线精品| 国产精品久久久久久久久久尿| 欧美日韩xx| 精品国产sm最大网站免费看| 亚洲 欧美 日韩 综合| 国产午夜精品一区二区三区嫩草 | 国产91在线看| 97成人在线观看视频| 日韩.com| 国产精品夜夜夜一区二区三区尤| 亚洲国产欧美日本视频| 日韩在线视频免费观看| 午夜精品在线播放| 色婷婷久久综合| 看片网站在线观看| 不卡电影免费在线播放一区| 日本老熟妇毛茸茸| 欧美啪啪一区| 日本黄网免费一区二区精品| 91精品一久久香蕉国产线看观看| 国内精品久久久久影院优 | 日日夜夜一区| 欧美精品18videos性欧| 伊人免费在线| 日韩经典第一页| 国产99视频在线| 色视频欧美一区二区三区| 99久久婷婷国产综合| 99精品视频在线免费观看| 在线视频一区二区三区| 日本免费福利视频| 国精产品一区一区三区mba视频| www.亚洲成人网| 欧美成人精品| 图片区小说区区亚洲五月| 精品福利一区| 91在线观看网站| 久久福利在线| 日本精品久久久| 丁香花在线观看完整版电影| 日韩在线观看av| 午夜视频成人| 国产午夜精品一区二区三区| 性生活黄色大片| 在线成人免费观看| 这里只有精品999| 高跟丝袜欧美一区| 久久久久无码国产精品| 亚洲另类在线一区| 国产成人av免费在线观看| 久久久99精品久久| 亚洲一区二区三区四区五区六区 | 免费看的av网站| 麻豆精品视频在线| 成人午夜激情av| 日韩精品电影在线观看| 黄色免费观看视频网站| aⅴ色国产欧美| 无码熟妇人妻av在线电影| 亚洲国产老妈| 一区二区三区四区在线视频| 精品国产精品| 欧美日韩一区二 | 亚洲wwww| 国产精品成人品| 欧洲亚洲精品久久久久| 日本中文字幕不卡免费| 美女18一级毛片一品久道久久综合| 日韩有码在线视频| www.97av| 欧美一区二区久久| 精品国产999久久久免费| 欧美理论片在线| 国产精品-色哟哟| 欧美一区二区在线不卡| 国产视频手机在线| 日韩欧美中文一区二区| 国产夫妻性生活视频| 日韩欧美综合一区| 国产精品自拍电影| 精品免费99久久| 手机看片一区二区| 日韩电影中文 亚洲精品乱码| 天堂网在线资源| 亚洲欧美变态国产另类| 国产高清一级毛片在线不卡| 在线成人激情视频| 日韩黄色影院| 美女国内精品自产拍在线播放| 免费黄色在线| 欧美成年人视频网站欧美| 美女网站视频在线| 欧美亚洲国产日韩2020| 日日av拍夜夜添久久免费| 国产精品视频地址| 51亚洲精品| 麻豆91蜜桃| 欧美jizz| 亚洲中文字幕无码av永久| 男人操女人的视频在线观看欧美| 男人的天堂最新网址| 成人综合在线视频| 欧美高清性xxxx| 国产精品你懂的在线欣赏| 国产精品久久久精品四季影院| 亚洲地区一二三色| 91丨九色丨海角社区| 欧美一区二区三区免费视频| 丰满人妻一区二区三区免费| 亚洲国产第一页| 蜜桃视频在线观看免费视频网站www| 欧美成人久久久| 婷婷综合六月| 亚洲a级在线观看| 视频小说一区二区| 一区二区三区四区视频在线| 伊人久久大香线蕉综合热线| 欧美日韩亚洲一二三| 国产精品综合一区二区| xxxx国产视频| 中文字幕乱码久久午夜不卡| 欧美精品xxxxx| 91福利精品第一导航| av网站在线观看免费| 亚洲欧美中文字幕在线一区| 国产激情在线| 欧洲精品在线视频| 国产欧美视频在线| 免费久久久一本精品久久区| 国产精品99久久| 国产天堂在线播放| 久久久综合精品| 国产成人无码精品久在线观看| 日韩欧美一区电影| 麻豆视频在线免费观看| 人九九综合九九宗合| www.久久久.com| 亚洲成人a**址| 麻豆亚洲精品| 99精品一区二区三区无码吞精| 亚洲精品国产成人久久av盗摄| 在线免费观看高清视频| 亚洲美女免费精品视频在线观看| 后进极品白嫩翘臀在线播放| 成人欧美在线视频| 精品国产日韩欧美| 欧美 日韩 激情| 成人性生交大片免费看中文网站| 欧美日韩在线视频免费播放| 欧美人成免费网站| 在线观看美女网站大全免费| 青青草原一区二区| 日韩极品在线| 性高湖久久久久久久久aaaaa| 日本欧美在线看| 国产又粗又长免费视频| 在线观看www91| 国产乱子伦三级在线播放| 2020欧美日韩在线视频| 国产精品毛片久久久| 波多野结衣与黑人| 国产91在线|亚洲| www.天天色| 亚洲精品小视频在线观看| 欧美电影网址| 日韩欧美亚洲v片| 奇米精品一区二区三区在线观看 | 精品久久久久一区二区国产| 日韩在线免费电影| 国产欧美在线观看| 天堂美国久久| 日韩欧美国产片| 国产精品久久久久aaaa樱花| 中文字幕乱码在线观看| 亚洲欧美日韩中文在线| 亚洲精品.com| 亚洲高清乱码| 免费精品视频最新在线| 黄色a级片在线观看| 亚洲高清av在线| 新片速递亚洲合集欧美合集| 这里只有精品66| 国产精品亚洲第一区在线暖暖韩国 | 久久网一区二区| 欧美一区二区三区在线观看 | 国产超级av在线| 中文欧美字幕免费| 国产同性人妖ts口直男| 久久久久久高潮国产精品视| 久久aimee| 日韩精品一区二区三区不卡| 久久精品网站免费观看| 国产精品系列视频| 欧美精品九九久久| 思热99re视热频这里只精品 | 这里有精品可以观看| 日韩片电影在线免费观看| 美女网站色91| 久久在线视频精品| 亚洲欧洲一区二区三区在线观看| 精品欧美日韩精品| 国产欧美精品aaaaaa片| 久久久久9999亚洲精品| 国产精品色综合| 欧美在线中文字幕| 999国产精品永久免费视频app| 91丨porny丨对白| 欧美网站大全在线观看| 国产三线在线| 欧美精品一区二区三区在线看午夜 | av2020不卡|