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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

android6.0 Activity(四) Surface创建

發布時間:2023/12/20 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android6.0 Activity(四) Surface创建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載: https://blog.csdn.net/kc58236582/article/details/52421683 

原文:http://blog.csdn.net/luoshengyang/article/details/8303098,原文代碼比較老了,但是核心不變。在原文基礎上修改了一些代碼,以及加入自己少量的理解。

在上一篇博客中,我們分析了應用程序窗口連接到WindowManagerService服務的過程。在這個過程中,WindowManagerService服務會為應用程序窗口創建過一個到SurfaceFlinger服務的連接。有了這個連接之后,WindowManagerService服務就可以為應用程序窗口創建繪圖表面了,以便可以用來渲染窗口的UI。在本文中,我們就詳細分析應用程序窗口的繪圖表面的創建過程。


一、Surface創建過程介紹

這節主要是把http://blog.csdn.net/luoshengyang/article/details/8303098這篇博客復制過來的

每一個在C++層實現的應用程序窗口都需要有一個繪圖表面,然后才可以將自己的UI表現出來。這個繪圖表面是需要由應用程序進程請求SurfaceFlinger服務來創建的,在SurfaceFlinger服務內部使用一個Layer對象來描述,同時,SurfaceFlinger服務會返回一個實現了ISurface接口的Binder本地對象給應用程序進程,于是,應用程序進程就可以獲得一個實現了ISurface接口的Binder代理對象。有了這個實現了ISurface接口的Binder代理對象之后,在C++層實現的應用程序窗口就可以請求SurfaceFlinger服務分配圖形緩沖區以及渲染已經填充好UI數據的圖形緩沖區了。

? 對于在Java層實現的Android應用程序窗口來說,它也需要請求SurfaceFlinger服務為它創建繪圖表面,這個繪圖表面使用一個Surface對象來描述。由于在Java層實現的Android應用程序窗口還要接受WindowManagerService服務管理,因此,它的繪圖表面的創建流程就會比在C++層實現的應用程序窗口復雜一些。具體來說,就是在在Java層實現的Android應用程序窗口的繪圖表面是通過兩個Surface對象來描述,一個是在應用程序進程這一側創建的,另一個是在WindowManagerService服務這一側創建的,它們對應于SurfaceFlinger服務這一側的同一個Layer對象,如圖所示:

?在應用程序進程這一側,每一個應用程序窗口,即每一個Activity組件,都有一個關聯的Surface對象,這個Surface對象是保在在一個關聯的ViewRootImpl對象的成員變量mSurface中的。這里我們只關注Surface類的實現。在應用程序進程這一側,每一個Java層的Surface對都對應有一個C++層的Surface對象。

?? 在WindowManagerService服務這一側,每一個應用程序窗口,即每一個Activity組件,都有一個對應的WindowState對象,這個WindowState對象的成員變量mSurface同樣是指向了一個Surface對象,在WindowManagerService服務這一側,每一個Java層的Surface對都對應有一個C++層的SurfaceControl對象。

一個應用程序窗口分別位于應用程序進程和WindowManagerService服務中的兩個Surface對象有什么區別呢?雖然它們都是用來操作位于SurfaceFlinger服務中的同一個Layer對象的,不過,它們的操作方式卻不一樣。具體來說,就是位于應用程序進程這一側的Surface對象負責繪制應用程序窗口的UI,即往應用程序窗口的圖形緩沖區填充UI數據,而位于WindowManagerService服務這一側的Surface對象負責設置應用程序窗口的屬性,例如位置、大小等屬性。這兩種不同的操作方式分別是通過C++層的Surface對象和SurfaceControl對象來完成的,因此,位于應用程序進程和WindowManagerService服務中的兩個Surface對象的用法是有區別的。之所以會有這樣的區別,是因為繪制應用程序窗口是獨立的,由應用程序進程來完即可,而設置應用程序窗口的屬性卻需要全局考慮,即需要由WindowManagerService服務來統籌安排,例如,一個應用程序窗口的Z軸坐標大小要考慮它到的窗口類型以及它與系統中的其它窗口的關系。

說到這里,另外一個問題又來了,由于一個應用程序窗口對應有兩個Surface對象,那么它們是如何創建出來的呢?簡單地說,就是按照以下步驟來創建:

?????? 1. 應用程序進程請求WindowManagerService服務為一個應用程序窗口創建一個Surface對象;

?????? 2. WindowManagerService服務請求SurfaceFlinger服務創建一個Layer對象,并且獲得一個ISurface接口;

?????? 3. WindowManagerService服務將獲得的ISurface接口保存在其內部的一個Surface對象中,并且將該ISurface接口返回給應用程序進程;

?????? 4. 應用程序進程得到WindowManagerService服務返回的ISurface接口之后,再將其封裝成其內部的另外一個Surface對象中。

?那么應用程序窗口的繪圖表面又是什么時候創建的呢?一般是在不存在的時候就創建,因為應用程序窗口在運行的過程中,它的繪圖表面會根據需要來銷毀以及重新創建的,例如,應用程序窗口在第一次顯示的時候,就會請求WindowManagerService服務為其創建繪制表面。從前面Android應用程序窗口(Activity)的視圖對象(View)的創建過程分析一文可以知道,當一個應用程序窗口被激活并且它的視圖對象創建完成之后,應用程序進程就會調用與其所關聯的一個ViewRootImpl對象的成員函數requestLayout來請求對其UI進行布局以及顯示。由于這時候應用程序窗口的繪圖表面尚未創建,因此,ViewRoot類的成員函數requestLayout就會請求WindowManagerService服務來創建繪圖表面。接下來,我們就從ViewRoot類的成員函數requestLayout開始,分析應用程序窗口的繪圖表面的創建過程,如圖所示:

二、requestLayout函數

之前我們分析過在ViewRootImpl的setView函數中調用了requestLayout函數,現在我們來分析下這個函數, ViewRootImpl類的成員函數requestLayout首先調用另外一個成員函數checkThread來檢查當前線程是否就是創建當前正在處理的ViewRootImpl對象的線程。如果不是的話,那么ViewRoot類的成員函數checkThread就會拋出一個異常出來。ViewRoot類是從Handler類繼承下來的,用來處理應用程序窗口的UI布局和渲染等消息。由于這些消息都是與Ui相關的,因此它們就需要在UI線程中處理,這樣我們就可以推斷出當前正在處理的ViewRootImpl對象是要應用程序進程的UI線程中創建的。進一步地,我們就可以推斷出ViewRootImpl類的成員函數checkThread實際上就是用來檢查當前線程是否是應用程序進程的UI線程,如果不是的話,它就會拋出一個異常出來。

??????? 通過了上述檢查之后,ViewRootImpl類的成員函數requestLayout首先將其成員變量mLayoutRequested的值設置為true,表示應用程序進程的UI線程正在被請求執行一個UI布局操作,接著再調用另外一個成員函數scheduleTraversals來繼續執行UI布局的操作。

  • @Override
  • public void requestLayout() {
  • if (!mHandlingLayoutInLayoutRequest) {
  • checkThread();
  • mLayoutRequested = true;
  • scheduleTraversals();
  • }
  • }
  • 在scheduleTraversals函數中,ViewRootImpl類的成員變量mTraversalScheduled用來表示應用程序進程的UI線程是否已經在scheduleTraversals。如果已經調度了的話,它的值就會等于true。在這種情況下, ViewRootImpl類的成員函數scheduleTraversals就什么也不做,否則的話,它就會首先將成員變量mTraversalScheduled的值設置為true,就會發送一個消息來處理mTraversalRunnable這個Runnable。

  • void scheduleTraversals() {
  • if (!mTraversalScheduled) {
  • mTraversalScheduled = true;
  • mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
  • mChoreographer.postCallback(
  • Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
  • if (!mUnbufferedInputDispatch) {
  • scheduleConsumeBatchedInput();
  • }
  • notifyRendererOfFramePending();
  • pokeDrawLockIfNeeded();
  • }
  • }
  • 我們來看下TraversalRunnable 這個Runnable,就是調用了doTraversal函數

  • final class TraversalRunnable implements Runnable {
  • @Override
  • public void run() {
  • doTraversal();
  • }
  • }
  • 而在doTraversal這個函數中調用了performTraversals函數

  • void doTraversal() {
  • if (mTraversalScheduled) {
  • mTraversalScheduled = false;
  • mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
  • if (mProfile) {
  • Debug.startMethodTracing("ViewAncestor");
  • }
  • performTraversals();
  • if (mProfile) {
  • Debug.stopMethodTracing();
  • mProfile = false;
  • }
  • }
  • }
  • ???????? ViewRootImpl類的成員函數performTraversals的實現是相當復雜的,這里我們分析它的實現框架.

    ??????? 在分析ViewRootImpl類的成員函數performTraversals的實現框架之前,我們首先了解ViewRoot類的以下五個成員變量:

    ??????? –mView:它的類型為View,但它實際上指向的是一個DecorView對象,用來描述應用程序窗口的頂級視圖,這一點可以參考前面Android應用程序窗口(Activity)的視圖對象(View)的創建過程分析一文。

    ??????? –mLayoutRequested:這是一個布爾變量,用來描述應用程序進程的UI線程是否需要正在被請求執行一個UI布局操作。

    ??????? –mFirst:這是一個布爾變量,用來描述應用程序進程的UI線程是否第一次處理一個應用程序窗口的UI。

    ??????? –mFullRedrawNeeded:這是一個布爾變量,用來描述應用程序進程的UI線程是否需要將一個應用程序窗口的全部區域都重新繪制。

    ??????? –mSurface:它指向一個Java層的Surface對象,用來描述一個應用程序窗口的繪圖表面。

    ??????? 注意,成員變量mSurface所指向的Surface對象在創建的時候,還沒有在C++層有一個關聯的Surface對象,因此,這時候它描述的就是一個無效的繪圖表面。另外,這個Surface對象在應用程序窗口運行的過程中,也會可能被銷毀,因此,這時候它描述的繪圖表面也會變得無效。在上述兩種情況中,我們都需要請求WindowManagerService服務來為當前正在處理的應用程序窗口創建有一個有效的繪圖表面,以便可以在上面渲染UI。這個創建繪圖表面的過程正是本文所要關心的。

    ??????? 理解了上述五個成員變量之后,我們就可以分析ViewRootImpl類的成員函數performTraversals的實現框架了,如下所示:

    ??????? 1. 將成員變量mView和mFullRedrawNeeded的值分別保存在本地變量host和fullRedrawNeeded中,并且將成員變量mTraversalScheduled的值設置為false,表示應用程序進程的UI線程中的消息已經被處理了。

    ??????? 2. 本地變量newSurface用來描述當前正在處理的應用程序窗口在本輪的消息處理中是否新創建了一個繪圖表面,它的初始值為false。

    ??????? 3. 如果成員變量mLayoutRequested的值等于true,那么就表示應用程序進程的UI線程正在被請求對當前正在處理的應用程序窗口執行一個UI布局操作,因此,這時候就會調用本地變量host所描述的一個頂層視圖對象的成員函數measure來測量位于各個層次的UI控件的大小。

    ??????? 4. 如果當前正在處理的應用程序窗口的UI是第一次被處理,即成員變量mFirst的值等于true,或者當前正在處理的應用程序窗口的大小發生了變化,即本地變量windowShouldResize的值等于true,或者當前正在處理的應用程序窗口的邊襯發生了變化,即本地變量insetsChanged的值等于true,或者正在處理的應用程序窗口的可見性發生了變化,即本地變量viewVisibilityChanged的值等于true,或者正在處理的應用程序窗口的UI布局參數發生了變化,即本地變量params指向了一個WindowManager.LayoutParams對象,那么應用程序進程的UI線程就會調用另外一個成員函數relayoutWindow來請求WindowManagerService服務重新布局系統中的所有窗口。WindowManagerService服務在重新布局系統中的所有窗口的過程中,如果發現當前正在處理的應用程序窗口尚未具有一個有效的繪圖表面,那么就會為它創建一個有效的繪圖表面,這一點是我們在本文中所要關注的。

    ??????? 5. 應用程序進程的UI線程在調用ViewRootImpl類的成員函數relayoutWindow來請求WindowManagerService服務重新布局系統中的所有窗口之前,會調用成員變量mSurface所指向的一個Surface對象的成員函數isValid來判斷它描述的是否是一個有效的繪圖表面,并且將結果保存在本地變量hadSurface中。

    ??????? 6. 應用程序進程的UI線程在調用ViewRootImpl類的成員函數relayoutWindow來請求WindowManagerService服務重新布局系統中的所有窗口之后,又會繼續調用成員變量mSurface所指向的一個Surface對象的成員函數isValid來判斷它描述的是否是一個有效的繪圖表面。如果這時候成員變量mSurface所指向的一個Surface對象描述的是否是一個有效的繪圖表面,并且本地變量hadSurface的值等于false,那么就說明WindowManagerService服務為當前正在處理的應用程序窗口新創建了一個有效的繪圖表面,于是就會將本地變量newSurface和fullRedrawNeeded的值均修改為true。

    ??????? 7. 應用程序進程的UI線程再次判斷mLayoutRequested的值是否等于true。如果等于的話,那么就說明需要對當前正在處理的應用程序窗口的UI進行重新布局,這是通過調用本地變量host所描述的一個頂層視圖對象的成員函數layout來實現的。在對當前正在處理的應用程序窗口的UI進行重新布局之前,應用程序進程的UI線程會將成員變量mLayoutRequested的值設置為false,表示之前所請求的一個UI布局操作已經得到處理了。

    ??????? 8. 應用程序進程的UI線程接下來就要開始對當前正在處理的應用程序窗口的UI進行重新繪制了,不過在重繪之前,會先詢問一下那些注冊到當前正在處理的應用程序窗口中的Tree Observer,即調用它們的成員函數dispatchOnPreDraw,看看它們是否需要取消接下來的重繪操作,這個詢問結果保存在本地變量cancelDraw中。

    ??????? 9. 如果本地變量cancelDraw的值等于false,并且本地變量newSurface的值也等于false,那么就說明注冊到當前正在處理的應用程序窗口中的Tree Observer不要求取消當前的這次重繪操作,并且當前正在處理的應用程序窗口也沒有獲得一個新的繪圖表面。在這種情況下,應用程序進程的UI線程就會調用ViewRoot類的成員函數draw來對當前正在處理的應用程序窗口的UI進行重繪。在重繪之前,還會將ViewRoot類的成員變量mFullRedrawNeeded的值重置為false。

    ?????? 10. 如果本地變量cancelDraw的值等于true,或者本地變量newSurface的值等于true,那么就說明注冊到當前正在處理的應用程序窗口中的Tree Observer要求取消當前的這次重繪操作,或者當前正在處理的應用程序窗口獲得了一個新的繪圖表面。在這兩種情況下,應用程序進程的UI線程就不能對當前正在處理的應用程序窗口的UI進行重繪了,而是要等到下一個消息到來的時候,再進行重繪,以便使得當前正在處理的應用程序窗口的各項參數可以得到重新設置。下一個消息需要馬上被調度,因此,應用程序進程的UI線程就會重新執行ViewRootImpl類的成員函數scheduleTraversals。

    ?????? 這樣,我們就分析完成ViewRoot類的成員函數performTraversals的實現框架了,接下來我們就繼續分析ViewRootImpl類的成員函數relayoutWindow的實現,以便可以看到當前正在處理的應用程序窗口的繪圖表面是如何創建的。

    在performTraversals函數中調用了relayoutWindow函數如下:

    relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);

    然后在relayoutWindow函數中調用了WindowSession的relayout函數

  • int relayoutResult = mWindowSession.relayout(
  • mWindow, mSeq, params,
  • (int) (mView.getMeasuredWidth() * appScale + 0.5f),
  • (int) (mView.getMeasuredHeight() * appScale + 0.5f),
  • viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0,
  • mWinFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
  • mPendingStableInsets, mPendingOutsets, mPendingConfiguration, mSurface);
  • 我們先看看IWindowSession函數,這個函數是一個aidl需要在out目錄下看其java文件

  • public interface IWindowSession extends android.os.IInterface
  • {
  • ......
  • public static abstract class Stub extends android.os.Binder implements android.view.IWindowSession
  • {
  • ......
  • private static class Proxy implements android.view.IWindowSession
  • {
  • private android.os.IBinder mRemote;
  • ......
  • public int relayout(android.view.IWindow window, android.view.WindowManager.LayoutParams attrs,
  • int requestedWidth, int requestedHeight, int viewVisibility, boolean insetsPending,
  • android.graphics.Rect outFrame,
  • android.graphics.Rect outContentInsets,
  • android.graphics.Rect outVisibleInsets,
  • android.content.res.Configuration outConfig,
  • android.view.Surface outSurface) throws android.os.RemoteException
  • {
  • android.os.Parcel _data = android.os.Parcel.obtain();
  • android.os.Parcel _reply = android.os.Parcel.obtain();
  • int _result;
  • try {
  • _data.writeInterfaceToken(DESCRIPTOR);
  • _data.writeStrongBinder((((window!=null))?(window.asBinder()):(null)));
  • if ((attrs!=null)) {
  • _data.writeInt(1);
  • attrs.writeToParcel(_data, 0);
  • }
  • else {
  • _data.writeInt(0);
  • }
  • _data.writeInt(requestedWidth);
  • _data.writeInt(requestedHeight);
  • _data.writeInt(viewVisibility);
  • _data.writeInt(((insetsPending)?(1):(0)));
  • mRemote.transact(Stub.TRANSACTION_relayout, _data, _reply, 0);
  • _reply.readException();
  • _result = _reply.readInt();
  • if ((0!=_reply.readInt())) {
  • outFrame.readFromParcel(_reply);
  • }
  • if ((0!=_reply.readInt())) {
  • outContentInsets.readFromParcel(_reply);
  • }
  • if ((0!=_reply.readInt())) {
  • outVisibleInsets.readFromParcel(_reply);
  • }
  • if ((0!=_reply.readInt())) {
  • outConfig.readFromParcel(_reply);
  • }
  • if ((0!=_reply.readInt())) {
  • outSurface.readFromParcel(_reply);
  • }
  • } finally {
  • _reply.recycle();
  • _data.recycle();
  • }
  • return _result;
  • }
  • ......
  • }
  • ......
  • }
  • ......
  • }
  • IWindowSession.Stub.Proxy類的成員函數relayout首先將從前面傳進來的各個參數寫入到Parcel對象_data中,接著再通過其成員變量mRemote所描述的一個Binder代理對象向運行在WindowManagerService服務內部的一個Session對象發送一個類型為TRANSACTION_relayout的進程間通信請求,其中,這個Session對象是用來描述從當前應用程序進程到WindowManagerService服務的一個連接的。

    我們來看下ViewRootImpl的Surface的readFromParcel函數,獲取數據之后調用了setNativeObjectLocked函數

  • public void readFromParcel(Parcel source) {
  • if (source == null) {
  • throw new IllegalArgumentException("source must not be null");
  • }
  • synchronized (mLock) {
  • // nativeReadFromParcel() will either return mNativeObject, or
  • // create a new native Surface and return it after reducing
  • // the reference count on mNativeObject. Either way, it is
  • // not necessary to call nativeRelease() here.
  • mName = source.readString();
  • setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source));
  • }
  • }
  • setNativeObjectLocked函數保存了從WMS傳過來的指針。

  • private void setNativeObjectLocked(long ptr) {
  • if (mNativeObject != ptr) {
  • if (mNativeObject == 0 && ptr != 0) {
  • mCloseGuard.open("release");
  • } else if (mNativeObject != 0 && ptr == 0) {
  • mCloseGuard.close();
  • }
  • mNativeObject = ptr;
  • mGenerationId += 1;
  • if (mHwuiContext != null) {
  • mHwuiContext.updateSurface();
  • }
  • }
  • }
  • ??????? 當運行在WindowManagerService服務內部的Session對象處理完成當前應用程序進程發送過來的類型為TRANSACTION_relayout的進程間通信請求之后,就會將處理結果寫入到Parcel對象_reply中,并且將這個Parcel對象_reply返回給當前應用程序進程處理。返回結果包含了一系列與參數window所描述的應用程序窗口相關的參數,如下所示:

    ?????? 1. 窗口的大小:最終保存在輸出參數outFrame中。

    ?????? 2. 窗口的內容區域邊襯大小:最終保存在輸出參數outContentInsets中。

    ?????? 3. 窗口的可見區域邊襯大小:最終保存在輸出參數outVisibleInsets中。

    ?????? 4. 窗口的配置信息:最終保存在輸出參數outConfig中。

    ?????? 5. 窗口的繪圖表面:最終保存在輸出參數outSurface中。

    ?????? 這里我們只關注從WindowManagerService服務返回來的窗口繪圖表面是如何保存到輸出參數outSurface中的,即關注Surface類的成員函數readFromParcel的實現。從前面的調用過程可以知道,輸出參數outSurface描述的便是當前正在處理的應用程序窗口的繪圖表面,將WindowManagerService服務返回來的窗口繪圖表面保存在它里面,就相當于是為當前正在處理的應用程序窗口創建了一個繪圖表面。

    ?????? 在分析Surface類的成員函數readFromParcel的實現之前,我們先分析Session類的成員函數relayout的實現,因為它是用來處理類型為TRANSACTION_relayout的進程間通信請求的。


    2.1 WMS中創建SurfaceControl

    session類的relayout的話最后調用了WMS的relayoutWindow函數

  • public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
  • int requestedWidth, int requestedHeight, int viewFlags,
  • int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
  • Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Configuration
  • outConfig,
  • Surface outSurface) {
  • if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from "
  • + Binder.getCallingPid());
  • int res = mService.relayoutWindow(this, window, seq, attrs,
  • requestedWidth, requestedHeight, viewFlags, flags,
  • outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
  • outStableInsets, outsets, outConfig, outSurface);
  • if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to "
  • + Binder.getCallingPid());
  • return res;
  • }
  • 在WMS中后面有如下代碼,是把對象傳到outSurface中去了。

  • SurfaceControl surfaceControl = winAnimator.createSurfaceLocked();
  • if (surfaceControl != null) {
  • outSurface.copyFrom(surfaceControl);
  • ?WindowManagerService類的成員函數relayoutWindow的實現是相當復雜的,這里我們只關注與創建應用程序窗口的繪圖表面相關的代碼。

    ??????? 簡單來說,WindowManagerService類的成員函數relayoutWindow根據應用程序進程傳遞過來的一系列數據來重新設置由參數client所描述的一個應用程序窗口的大小和可見性等信息,而當一個應用程序窗口的大小或者可見性發生變化之后,系統中當前獲得焦點的窗口,以及輸入法窗口和壁紙窗口等都可能會發生變化,而且也會對其它窗口產生影響,因此,這時候WindowManagerService類的成員函數relayoutWindow就會對系統中的窗口的布局進行重新調整。對系統中的窗口的布局進行重新調整的過程是整個WindowManagerService服務最為復雜和核心的內容,我們同樣是在后面的文章中再詳細分析。

    ??????? 現在,我們就主要分析參數client所描述的一個應用程序窗口的繪圖表面的創建過程。

    ??????? WindowManagerService類的成員函數relayoutWindow首先獲得與參數client所對應的一個WindowState對象win,這是通過調用WindowManagerService類的成員函數windowForClientLocked來實現的。如果這個對應的WindowState對象win不存在,那么就說明應用程序進程所請求處理的應用程序窗口不存在,這時候WindowManagerService類的成員函數relayoutWindow就直接返回一個0值給應用程序進程。

    ??????? WindowManagerService類的成員函數relayoutWindow接下來判斷參數client所描述的一個應用程序窗口是否是可見的。一個窗口只有在可見的情況下,WindowManagerService服務才會為它創建一個繪圖表面。 一個窗口是否可見由以下兩個條件決定:

    ??????? 1. 參數viewVisibility的值等于View.VISIBLE,表示應用程序進程請求將它設置為可見的。

    ??????? 2. WindowState對象win的成員變量mAppToken不等于null,并且它所描述的一個AppWindowToken對象的成員變量clientHidden的值等于false。這意味著參數client所描述的窗口是一個應用程序窗口,即一個Activity組件窗口,并且這個Activity組件當前是處于可見狀態的。當一個Activity組件當前是處于不可見狀態時,它的窗口就也必須是處于不可見狀態。

    ??????? 注意,當WindowState對象win的成員變量mAppToken等于null時,只要滿足條件1就可以了,因為這時候參數client所描述的窗口不是一個Activity組件窗口,它的可見性不像Activity組件窗口一樣受到Activity組件的可見性影響。

    ??????? 我們假設參數client所描述的是一個應用程序窗口,并且這個應用程序窗口是可見的,那么WindowManagerService類的成員函數relayoutWindow接下來就會調用WindowState對象win的winAnimator的函數createSurfaceLocked來為它創建一個繪圖表面。如果這個繪圖表面能創建成功,那么WindowManagerService類的成員函數relayoutWindow就會將它的內容拷貝到輸出參數outSource所描述的一個Surface對象去,以便可以將它返回給應用程序進程處理。另一方面,如果這個繪圖表面不能創建成功,那么WindowManagerService類的成員函數relayoutWindow就會將輸出參數outSource所描述的一個Surface對象的內容釋放掉,以便應用程序進程知道該Surface對象所描述的繪圖表面已經失效了。

    ??????? 接下來,我們就繼續分析WindowState類的winAnimator的成員函數createSurfaceLocked的實現,以便可以了解一個應用程序窗口的繪圖表面的創建過程。

  • SurfaceControl createSurfaceLocked() {
  • final WindowState w = mWin;
  • if (mSurfaceControl == null) {
  • if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG,
  • "createSurface " + this + ": mDrawState=DRAW_PENDING");
  • mDrawState = DRAW_PENDING;
  • if (w.mAppToken != null) {
  • if (w.mAppToken.mAppAnimator.animation == null) {
  • w.mAppToken.allDrawn = false;
  • w.mAppToken.deferClearAllDrawn = false;
  • } else {
  • // Currently animating, persist current state of allDrawn until animation
  • // is complete.
  • w.mAppToken.deferClearAllDrawn = true;
  • }
  • }
  • mService.makeWindowFreezingScreenIfNeededLocked(w);
  • int flags = SurfaceControl.HIDDEN;
  • final WindowManager.LayoutParams attrs = w.mAttrs;
  • if (mService.isSecureLocked(w)) {
  • flags |= SurfaceControl.SECURE;
  • }
  • int width;
  • int height;
  • if ((attrs.flags & LayoutParams.FLAG_SCALED) != 0) {
  • // for a scaled surface, we always want the requested
  • // size.
  • width = w.mRequestedWidth;
  • height = w.mRequestedHeight;
  • } else {
  • width = w.mCompatFrame.width();
  • height = w.mCompatFrame.height();
  • }
  • // Something is wrong and SurfaceFlinger will not like this,
  • // try to revert to sane values
  • if (width <= 0) {
  • width = 1;
  • }
  • if (height <= 0) {
  • height = 1;
  • }
  • float left = w.mFrame.left + w.mXOffset;
  • float top = w.mFrame.top + w.mYOffset;
  • // Adjust for surface insets.
  • width += attrs.surfaceInsets.left + attrs.surfaceInsets.right;
  • height += attrs.surfaceInsets.top + attrs.surfaceInsets.bottom;
  • left -= attrs.surfaceInsets.left;
  • top -= attrs.surfaceInsets.top;
  • if (DEBUG_VISIBILITY) {
  • Slog.v(TAG, "Creating surface in session "
  • + mSession.mSurfaceSession + " window " + this
  • + " w=" + width + " h=" + height
  • + " x=" + left + " y=" + top
  • + " format=" + attrs.format + " flags=" + flags);
  • }
  • // We may abort, so initialize to defaults.
  • mSurfaceShown = false;
  • mSurfaceLayer = 0;
  • mSurfaceAlpha = 0;
  • mSurfaceX = 0;
  • mSurfaceY = 0;
  • w.mLastSystemDecorRect.set(0, 0, 0, 0);
  • mHasClipRect = false;
  • mClipRect.set(0, 0, 0, 0);
  • mLastClipRect.set(0, 0, 0, 0);
  • // Set up surface control with initial size.
  • try {
  • mSurfaceW = width;
  • mSurfaceH = height;
  • final boolean isHwAccelerated = (attrs.flags &
  • WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
  • final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format;
  • if (!PixelFormat.formatHasAlpha(attrs.format)
  • && attrs.surfaceInsets.left == 0
  • && attrs.surfaceInsets.top == 0
  • && attrs.surfaceInsets.right == 0
  • && attrs.surfaceInsets.bottom == 0) {
  • flags |= SurfaceControl.OPAQUE;
  • }
  • mSurfaceFormat = format;
  • if (DEBUG_SURFACE_TRACE) {
  • mSurfaceControl = new SurfaceTrace(//新建一個SurfaceTrace對象
  • mSession.mSurfaceSession,
  • attrs.getTitle().toString(),
  • width, height, format, flags);
  • } else {
  • mSurfaceControl = new SurfaceControl(
  • mSession.mSurfaceSession,
  • attrs.getTitle().toString(),
  • width, height, format, flags);
  • }
  • ?在創建一個應用程序窗口的繪圖表面之前,我們需要知道以下數據:

    ??????? 1. 應用程序窗口它所運行的應用程序進程的PID。

    ??????? 2. 與應用程序窗口它所運行的應用程序進程所關聯的一個SurfaceSession對象。

    ??????? 3. 應用程序窗口的標題。

    ??????? 4. 應用程序窗口的像素格式。

    ??????? 5. 應用程序窗口的寬度。

    ??????? 6. 應用程序窗口的高度。

    ??????? 7. 應用程序窗口的圖形緩沖區屬性標志。

    ??????? 第1個和第2個數據可以通過當前正在處理的WindowState對象的成員變量mSession所描述的一個Session對象的成員變量mPid和mSurfaceSession來獲得;第3個和第4個數據可以通過當前正在處理的WindowState對象的成員變量mAttr所描述的一個WindowManager.LayoutParams對象的成員函數getTitle以及成員變量format來獲得;接下來我們就分析后面3個數據是如何獲得的。

    ??????? WindowState類的成員變量mFrame的類型為Rect,它用來描述應用程序窗口的位置和大小,它們是由WindowManagerService服務根據屏幕大小以及其它屬性計算出來的,因此,通過調用過它的成員函數width和height就可以得到要創建繪圖表面的應用程序窗口的寬度和高度,并且保存在變量w和h中。但是,當當前正在處理的WindowState對象的成員變量mAttr所描述的一個WindowManager.LayoutParams對象的成員變量flags的LayoutParams.FLAG_SCALED位不等于0時,就說明應用程序進程指定了該應用程序窗口的大小,這時候指定的應用程序窗口的寬度和高度就保存在WindowState類的成員變量mRequestedWidth和mRequestedHeight中,因此,我們就需要將當前正在處理的WindowState對象的成員變量mRequestedWidth和mRequestedHeight的值分別保存在變量w和h中。經過上述兩步計算之后,如果得到的變量w和h等于0,那么就說明當前正在處理的WindowState對象所描述的應用程序窗口的大小還沒有經過計算,或者還沒有被指定過,這時候就需要將它們的值設置為1,避免接下來創建一個大小為0的繪圖表面。

    ??????? 如果當前正在處理的WindowState對象的成員變量mAttr所描述的一個WindowManager.LayoutParams對象的成員變量memoryType的值等于MEMORY_TYPE_PUSH_BUFFERS,那么就說明正在處理的應用程序窗口不擁有專屬的圖形緩沖區,這時候就需要將用來描述正在處理的應用程序窗口的圖形緩沖區屬性標志的變量flags的Surface.PUSH_BUFFERS位設置為1。

    ?????? 此外,如果當前正在處理的WindowState對象的成員變量mAttr所描述的一個WindowManager.LayoutParams對象的成員變量flags的WindowManager.LayoutParams.FLAG_SECURE位不等于0,那么就說明正在處理的應用程序窗口的界面是安全的,即是受保護的,這時候就需要將用來描述正在處理的應用程序窗口的圖形緩沖區屬性標志的變量flags的Surface.SECURE位設置為1。當一個應用程序窗口的界面是受保護時,SurfaceFlinger服務在執行截屏功能時,就不能把它的界面截取下來。

    ?????? 上述數據準備就緒之后,就可以創建當前正在處理的WindowState對象所描述的一個應用程序窗口的繪圖表面了,不過在創建之前,還會初始化該WindowState對象的以下成員變量:

    ?????? –mReportDestroySurface的值被設置為false。當一個應用程序窗口的繪圖表面被銷毀時,WindowManagerService服務就會將相應的WindowState對象的成員變量mReportDestroySurface的值設置為true,表示要向該應用程序窗口所運行在應用程序進程發送一個繪圖表面銷毀通知。

    ?????? –mSurfacePendingDestroy的值被設置為false。當一個應用程序窗口的繪圖表面正在等待銷毀時,WindowManagerService服務就會將相應的WindowState對象的成員變量mReportDestroySurface的值設置為true。

    ?????? –mDrawPending的值被設置為true。當一個應用程序窗口的繪圖表面處于創建之后并且繪制之前時,WindowManagerService服務就會將相應的WindowState對象的成員變量mDrawPending的值設置為true,以表示該應用程序窗口的繪圖表面正在等待繪制。

    ?????? –mCommitDrawPending的值被設置為false。當一個應用程序窗口的繪圖表面繪制完成之后并且可以顯示出來之前時,WindowManagerService服務就會將相應的WindowState對象的成員變量mCommitDrawPending的值設置為true,以表示該應用程序窗口正在等待顯示。

    ?????? –mReadyToShow的值被設置為false。有時候當一個應用程序窗口的繪圖表面繪制完成并且可以顯示出來之后,由于與該應用程序窗口所關聯的一個Activity組件的其它窗口還未準備好顯示出來,這時候WindowManagerService服務就會將相應的WindowState對象的成員變量mReadyToShow的值設置為true,以表示該應用程序窗口需要延遲顯示出來,即需要等到與該應用程序窗口所關聯的一個Activity組件的其它窗口也可以顯示出來之后再顯示。

    ?????? –如果成員變量mAppToken的值不等于null,那么就需要將它所描述的一個AppWindowToken對象的成員變量allDrawn的值設置為false。從前面Android應用程序窗口(Activity)與WindowManagerService服務的連接過程分析一文可以知道,一個AppWindowToken對象用來描述一個Activity組件的,當該AppWindowToken對象的成員變量allDrawn的值等于true時,就表示屬于該Activity組件的所有窗口都已經繪制完成了。

    ?????? –mSurfaceShown的值被設置為false,表示應用程序窗口還沒有顯示出來,它是用來顯示調試信息的。

    ?????? –mSurfaceLayer的值被設置為0,表示應用程序窗口的Z軸位置,它是用來顯示調試信息的。

    ?????? –mSurfaceAlpha的值被設置為1,表示應用程序窗口的透明值,它是用來顯示調試信息的。

    ?????? –mSurfaceX的值被設置為0,表示應用程序程序窗口的X軸位置,它是用來顯示調試信息的。

    ?????? –mSurfaceY的值被設置為0,表示應用程序程序窗口的Y軸位置,它是用來顯示調試信息的。

    ?????? –mSurfaceW的值被設置為w,表示應用程序程序窗口的寬度,它是用來顯示調試信息的。

    ?????? –mSurfaceH的值被設置為h,表示應用程序程序窗口的高度,它是用來顯示調試信息的。

    ?????? 一個應用程序窗口的繪圖表面在創建完成之后,函數就會將得到的一個Surface對象保存在當前正在處理的WindowState對象的成員變量mSurface中。注意,如果創建繪圖表面失敗,并且從Surface類的構造函數拋出來的異常的類型為Surface.OutOfResourcesException,那么就說明系統當前的內存不足了,這時候函數就會調用WindowManagerService類的成員函數reclaimSomeSurfaceMemoryLocked來回收內存。

    ?????? 如果一切正常,那么函數接下來還會設置當前正在處理的WindowState對象所描述應用程序窗口的以下屬性:

    ????? 1. X軸和Y軸位置。前面提到,WindowState類的成員變量mFrame是用來描述應用程序窗口的位置和大小的,其中,位置就是通過它所描述的一個Rect對象的成員變量left和top來表示的,它們分別應用窗口在X軸和Y軸上的位置。此外,當一個WindowState對象所描述的應用程序窗口是一個壁紙窗口時,該WindowState對象的成員變量mXOffset和mYOffset用來描述壁紙窗口相對當前要顯示的窗口在X軸和Y軸上的偏移量。因此,將WindowState類的成員變量mXOffset的值加上另外一個成員變量mFrame所描述的一個Rect對象的成員變量left的值,就可以得到一個應用程序窗口在X軸上的位置,同樣,將WindowState類的成員變量mYOffset的值加上另外一個成員變量mFrame所描述的一個Rect對象的成員變量top的值,就可以得到一個應用程序窗口在Y軸上的位置。最終得到的位置值就分別保存在WindowState類的成員變量mSurfaceX和mSurfaceY,并且會調用WindowState類的成員變量mSurface所描述的一個Surface對象的成員函數setPosition來將它們設置到SurfaceFlinger服務中去。

    ????? 2. Z軸位置。在前面Android應用程序窗口(Activity)與WindowManagerService服務的連接過程分析一文中提到,WindowState類的成員變量mAnimLayer用來描述一個應用程序窗口的Z軸位置,因此,這里就會先將它保存在WindowState類的另外一個成員變量mSurfaceLayer中,然后再調用WindowState類的成員變量mSurface所描述的一個Surface對象的成員函數setLayer來將它設置到SurfaceFlinger服務中去。

    ????? 3. 抖動標志。如果WindowState類的成員變量mAttr所描述的一個WindowManager.LayoutParams對象的成員變量flags的WindowManager.LayoutParams.FLAG_DITHER位不等于0,那么就說明一個應用程序窗口的圖形緩沖區在渲染時,需要進行抖動處理,這時候就會調用WindowState類的成員變量mSurface所描述的一個Surface對象的成員函數setLayer來將對應的應用程序窗口的圖形緩沖區的屬性標志的Surface.SURFACE_DITHER位設置為1。

    ????? 4. 顯示狀態。由于當前正在處理的WindowState對象所描述的一個應用程序窗口的繪圖表面剛剛創建出來,因此,我們就需要通知SurfaceFlinger服務將它隱藏起來,這是通過調用當前正在處理的WindowState對象的成員變量mSurface所描述的一個Surface對象的成員變量hide來實現的。這時候還會將當前正在處理的WindowState對象的成員變量mSurfaceShown和mLastHidden的值分別設置為false和true,以表示對應的應用程序窗口是處于隱藏狀態的。

    ????? 注意,為了避免SurfaceFlinger服務每設置一個應用程序窗口屬性就重新渲染一次系統的UI,上述4個屬性設置需要在一個事務中進行,這樣就可以避免出現界面閃爍。我們通過調用Surface類的靜態成員函數openTransaction和closeTransaction就可以分別在SurfaceFlinger服務中打開和關閉一個事務。

    ????? 還有另外一個地方需要注意的是,在設置應用程序窗口屬性的過程中,如果拋出了一個RuntimeException異常,那么就說明系統當前的內存不足了,這時候函數也會調用WindowManagerService類的成員函數reclaimSomeSurfaceMemoryLocked來回收內存。

    ????? 接下來,我們就繼續分析Surface類的構造函數的實現,以便可以了解一個應用程序窗口的繪圖表面的詳細創建過程。


    2.2 SurfaceControl在JNI層創建了SurfaceControl C++層對象那個

    下面我們再來看看SurfaceControl的構造函數,主要是調用了nativeCreate函數

  • public SurfaceControl(SurfaceSession session,
  • String name, int w, int h, int format, int flags)
  • throws OutOfResourcesException {
  • if (session == null) {
  • throw new IllegalArgumentException("session must not be null");
  • }
  • if (name == null) {
  • throw new IllegalArgumentException("name must not be null");
  • }
  • if ((flags & SurfaceControl.HIDDEN) == 0) {
  • Log.w(TAG, "Surfaces should always be created with the HIDDEN flag set "
  • + "to ensure that they are not made visible prematurely before "
  • + "all of the surface's properties have been configured. "
  • + "Set the other properties and make the surface visible within "
  • + "a transaction. New surface name: " + name,
  • new Throwable());
  • }
  • mName = name;
  • mNativeObject = nativeCreate(session, name, w, h, format, flags);
  • if (mNativeObject == 0) {
  • throw new OutOfResourcesException(
  • "Couldn't allocate SurfaceControl native object");
  • }
  • mCloseGuard.open("release");
  • }
  • 我們來看下這個nativeCreate就是通過上篇博客說的SurfaceComposerClient來獲取一個c++層的SurfaceControl

  • static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,
  • jstring nameStr, jint w, jint h, jint format, jint flags) {
  • ScopedUtfChars name(env, nameStr);
  • sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj));
  • sp<SurfaceControl> surface = client->createSurface(
  • String8(name.c_str()), w, h, format, flags);
  • if (surface == NULL) {
  • jniThrowException(env, OutOfResourcesException, NULL);
  • return 0;
  • }
  • surface->incStrong((void *)nativeCreate);
  • return reinterpret_cast<jlong>(surface.get());
  • }
  • 而nativeCreate返回的值保存在mNativeObject 中,后面所有一些操作函數都是通過mNativeObject 傳到JNI進行操作的。

  • public void setLayer(int zorder) {
  • checkNotReleased();
  • nativeSetLayer(mNativeObject, zorder);
  • }
  • public void setPosition(float x, float y) {
  • checkNotReleased();
  • nativeSetPosition(mNativeObject, x, y);
  • }
  • public void setSize(int w, int h) {
  • checkNotReleased();
  • nativeSetSize(mNativeObject, w, h);

  • 在WMS中的Surface是保存在每一個Activity對應的WindowState的winAnimator的mSurfaceControl成員變量中。而Activity的Surface是保存在ViewRootImpl的Surface是通過WMS的outSurface保存在ViewRoot的mSurface中。

    所以最后無論在WMS的SurfaceControl還是ViewRootImpl的Surface最后在c++層用的是同一個對象。
    ?

    三、總結

    至此,我們就分析完成Android應用程序窗口的繪圖表面的創建過程了。通過這個過程我們就可以知道:

    ?????? 1. 每一個應用程序窗口都對應有兩個Java層的Surface對象,其中一個是在WindowManagerService服務這一側創建的,而另外一個是在應用程序進程這一側創建的。

    ?????? 2. 在WindowManagerService服務這一側創建的Java層的Surface對象在C++層關聯有一個SurfaceControl對象,用來設置應用窗口的屬性,例如,大小和位置等。

    ?????? 3. 在應用程序進程這一側創建的ava層的Surface對象在C++層關聯有一個Surface對象,用來繪制應用程序窗品的UI。

    ?????? 理解上述三個結論對理解Android應用程序窗口的實現框架以及WindowManagerService服務的實現都非常重要。 一個應用程序窗口的繪圖表面在創建完成之后,接下來應用程序進程就可以在上面繪制它的UI了。

    總結

    以上是生活随笔為你收集整理的android6.0 Activity(四) Surface创建的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    美女网站视频免费都是黄 | 成人高清在线 | 国语自产偷拍精品视频偷 | www.色午夜| 免费a网址 | 国产成人三级在线观看 | 国产精品专区h在线观看 | 国产精品日韩在线观看 | 色婷婷中文 | 欧美日韩视频在线观看一区二区 | 日韩欧美xxxx | 奇米影视999 | 国产日本三级 | 久久综合亚洲鲁鲁五月久久 | a视频在线看 | 久久久久久免费毛片精品 | 日韩av线观看 | 中文字幕资源网在线观看 | 少妇av网 | 日日干,天天干 | 在线精品视频在线观看高清 | 亚洲乱码精品久久久 | 亚洲欧洲在线视频 | 天天干天天操av | 久久综合狠狠综合久久综合88 | 日韩在线观看 | 999电影免费在线观看2020 | 日b视频在线观看网址 | 亚洲精品乱码久久久久久写真 | 久精品一区 | 国产精品一区二区免费 | 国产一区二区三区在线免费观看 | 亚洲一区二区三区毛片 | 日韩av网页| 亚洲精品综合久久 | 人人超碰在线 | 中国美女一级看片 | 亚洲国产欧美一区二区三区丁香婷 | 久久人人爽人人爽人人片av免费 | 日韩乱理| 91麻豆精品 | av在线com | 国产精品欧美在线 | av在线一| 日韩一级电影在线观看 | av在线不卡观看 | 日韩成人高清在线 | 96精品视频 | 久9在线 | 天天操天天干天天摸 | 国产精品不卡 | 91久久精品日日躁夜夜躁国产 | 中文字幕电影高清在线观看 | 午夜黄色影院 | 日韩一级电影在线观看 | 免费精品视频在线 | 亚洲春色综合另类校园电影 | 99热在线免费观看 | 又色又爽又黄 | 精品国产视频一区 | 玖玖视频精品 | 激情久久久久 | 日本精品视频在线 | 国产精品九九九 | 人人看人人草 | 国产免费久久久久 | 国产青春久久久国产毛片 | 香蕉视频免费在线播放 | 狠狠干夜夜操天天爽 | 成人香蕉视频 | 久草香蕉在线视频 | 日日摸日日添夜夜爽97 | 国产精品久久久久久久久免费 | 中文字幕在线视频一区二区三区 | 999国内精品永久免费视频 | 久久久夜色| 久久dvd| 国产手机视频在线观看 | 国产91精品一区二区绿帽 | 日韩理论片在线观看 | 97超碰总站 | 国产一区二区在线视频观看 | 四虎影视成人永久免费观看视频 | 久久视频这里有精品 | 蜜臀久久99精品久久久无需会员 | 欧美激情另类文学 | 亚洲在线 | 在线观看你懂的网址 | 天天综合网 天天 | 黄色不卡av| 四虎8848免费高清在线观看 | 麻豆视频www | 久久av在线播放 | 夜夜躁日日躁 | av网站免费看 | 激情五月综合 | 久久婷婷久久 | 又粗又长又大又爽又黄少妇毛片 | 国产精品中文字幕在线播放 | 日韩小视频| 人人爱人人舔 | 在线观看国产高清视频 | 91成人天堂久久成人 | 黄色精品国产 | 三上悠亚一区二区在线观看 | 四虎4hu永久免费 | 国产亚洲精品久久久久久久久久久久 | 国产午夜精品免费一区二区三区视频 | 日韩av成人免费看 | 欧美狠狠操 | 国产视频资源在线观看 | av丝袜在线 | 六月丁香激情综合色啪小说 | 在线观看黄色 | 日韩av手机在线看 | 国产精品久久久久久久久免费 | www.日本色 | 久久精品视频在线观看免费 | 免费看三级黄色片 | 九色91在线 | 欧美有色 | 久久中文欧美 | 欧美另类v | 欧美黄在线| 国产精品欧美久久久久天天影视 | 日韩在线不卡av | 国产精品欧美激情在线观看 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 三级在线视频观看 | 草久在线视频 | 国产精久久久久久妇女av | 色婷婷激情电影 | 亚洲成a人片在线www | 欧美成人按摩 | 久久久免费网站 | 91精品在线视频观看 | 天天天射 | 久草精品网 | 久久人人爽人人爽人人片av免费 | 亚洲乱码国产乱码精品天美传媒 | 日本性动态图 | 日韩在线视频线视频免费网站 | 日本久久免费视频 | 天天在线操| 国产精品成人一区 | 久久99国产精品自在自在app | 国产精品区免费视频 | 欧美一区二区三区在线观看 | 91香蕉嫩草 | 免费看的av片 | 国产精品成人免费 | 日韩经典一区二区三区 | 日韩av图片| 97精品一区二区三区 | 日韩精品视频一二三 | 欧美精品乱码久久久久 | 久爱精品在线 | 二区在线播放 | 射射射综合网 | 蜜臀久久99精品久久久久久网站 | 欧美日韩aa| 2021国产精品 | 国产视频精选在线 | 色国产精品 | 国产精品久久久区三区天天噜 | 九九久久久 | 97人人澡人人添人人爽超碰 | 一区二精品 | 亚洲精品日韩在线观看 | 久久久久久久久久网 | 天天躁日日躁狠狠躁av麻豆 | 激情婷婷综合网 | 亚洲资源在线网 | 亚洲国产精品成人va在线观看 | 国产精品99在线播放 | 欧美在线视频一区二区三区 | 中文字幕中文字幕中文字幕 | 在线免费观看av网站 | 国产亚洲人成网站在线观看 | 国产精品永久免费在线 | 国产一区成人 | 国产精品淫 | 五月天狠狠操 | 国产日韩精品久久 | 高清av免费看 | 欧美激情视频一区 | 久久九九精品久久 | 99热在线观看 | 麻豆影视网站 | 九九国产精品视频 | 免费看的黄网站软件 | 安徽妇搡bbbb搡bbbb | 国产精品九色 | 91色国产| 91在线免费公开视频 | 婷婷久久丁香 | 国产成人av | 欧美一二区在线 | 亚洲五月| 欧美综合在线视频 | 亚洲区精品视频 | 色综合久久久 | 中文国产在线观看 | 久久兔费看a级 | 免费能看的黄色片 | 一区二区三区不卡在线 | 麻豆激情电影 | 国产高清久久久久 | 国内精品久久久久影院日本资源 | 国产精品永久免费在线 | 色综合亚洲精品激情狠狠 | 色婷婷亚洲综合 | 亚洲精品美女免费 | 国产不卡一二三区 | 国内精品久久久久久久 | 麻豆视频观看 | 激情网站五月天 | 激情五月五月婷婷 | 不卡的av电影在线观看 | 国产精品ssss在线亚洲 | 欧美精品三级 | 日韩 精品 一区 国产 麻豆 | 97视频免费在线 | 免费日韩在线 | 玖玖在线资源 | 国产伦精品一区二区三区免费 | 中文字幕乱码视频 | 久久久久久久久影院 | 综合国产视频 | 激情综合五月婷婷 | 国产亚洲久一区二区 | 四虎影视av| 精品久操| 一区二区在线不卡 | 91视频91自拍 | 天天干天天操av | 最新精品视频在线 | 色噜噜日韩精品一区二区三区视频 | av免费福利 | 韩国av免费在线 | 99视频网站| 91九色丨porny丨丰满6 | 伊人黄 | 99在线观看视频 | 国产一区二区三区四区在线 | 麻豆网站免费观看 | 亚洲人毛片 | 国产成人av电影在线 | 久久久69 | 91高清视频免费 | 欧美午夜激情网 | 国产品久精国精产拍 | 青青久视频 | 好看的国产精品视频 | 久久成年人网站 | 国产一级视屏 | 天天色宗合 | 国产精品久久久久久久久久妇女 | 在线观看中文 | 不卡的av在线 | 在线观看完整版 | 一区二区三区四区久久 | 欧美有色 | 五月婷网 | 在线小视频你懂的 | 免费a v在线 | 亚洲精品一区二区在线观看 | 中午字幕在线 | 玖玖综合网 | 毛片视频电影 | 91超碰免费在线 | 亚洲国产精品成人女人久久 | 欧美日韩久久久 | 国产在线播放一区 | 香蕉91视频 | 美国av片在线观看 | 99视频一区二区 | 日韩成人不卡 | 九七人人干 | 福利网址在线观看 | 亚洲欧美综合 | 97免费公开视频 | 久草久| 国产午夜精品一区二区三区嫩草 | 992tv人人网tv亚洲精品 | 久久精品直播 | 成人香蕉视频 | 欧美巨大荫蒂茸毛毛人妖 | av丝袜在线| 欧美吞精| 91麻豆精品国产午夜天堂 | 不卡的av在线| 日韩中文在线电影 | 国产中文字幕在线观看 | 中文字幕999| 欧美成人影音 | 国产美女精品视频 | 日本资源中文字幕在线 | 国产不卡免费 | 国产国语在线 | 高清久久久久久 | 亚洲精品免费在线观看视频 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 五月激情亚洲 | 欧美日韩裸体免费视频 | 99精品在线视频观看 | 国产黄色在线网站 | 精品资源在线 | 色资源在线 | 在线观看aaa| 骄小bbw搡bbbb揉bbbb | 天堂网一区 | 开心综合网 | 国内免费久久久久久久久久久 | 天天操人| 丝袜护士aⅴ在线白丝护士 天天综合精品 | 999视频网 | 808电影 | 日操操| 国产美女精品人人做人人爽 | 久久久久久久久久网站 | 99精品免费在线 | 97在线观看免费观看 | 一级黄色免费网站 | 天天干天天做天天操 | 亚洲区另类春色综合小说校园片 | 国产一二三四在线视频 | 亚洲 欧洲 国产 精品 | 99久久日韩精品免费热麻豆美女 | 超碰97.com | 色偷偷88888欧美精品久久久 | 久久亚洲私人国产精品va | 国产在线一区二区三区播放 | 丁香婷婷激情啪啪 | 不卡的av片 | 国产精品成人久久久久久久 | 91丨九色丨蝌蚪丨老版 | 久草在线 | 亚洲精品中文在线观看 | 久久久精选 | 日韩国产精品一区 | 91精品视频免费观看 | 天天操夜 | 香蕉精品视频在线观看 | 欧美精品资源 | 在线高清 | 欧美日韩国产一区二区三区在线观看 | 久草在线欧美 | 天天射天天干天天爽 | 日本99久久| 国产在线超碰 | 91精彩视频 | 二区视频在线观看 | 久久综合免费视频 | 天堂网一区 | 日本电影久久 | 在线播放 日韩专区 | 亚洲成av人影院 | 成人国产网址 | 美女搞黄国产视频网站 | 97国产大学生情侣酒店的特点 | 色婷婷av一区 | 一区二区三区视频网站 | 蜜桃av观看 | 精品久久久久久久久亚洲 | 天天爽人人爽夜夜爽 | 黄色小网站免费看 | 日本黄区免费视频观看 | 色综合天天天天做夜夜夜夜做 | 香蕉视频网站在线观看 | 五月婷婷久久综合 | 色中射| 黄色三级网站在线观看 | 51久久成人国产精品麻豆 | 成全在线视频免费观看 | 黄色毛片大全 | 国产一区二区三精品久久久无广告 | 国产资源在线视频 | 在线免费色 | 日本午夜在线亚洲.国产 | 99精品免费视频 | 亚洲国产精品一区二区久久,亚洲午夜 | 黄色一级网 | 久久国产精品99国产 | 国产精品福利小视频 | 激情在线网址 | 久久五月情影视 | 免费欧美 | 天天操天天艹 | 亚洲综合射 | 91入口在线观看 | 少妇资源站 | 四虎影视国产精品免费久久 | 亚洲国产剧情 | 久久久国产精品视频 | av成人免费观看 | 有码视频在线观看 | 808电影免费观看三年 | 91av国产视频 | 欧美日韩国产一区二区三区 | 久久久亚洲成人 | 国产精品99久久久久人中文网介绍 | 处女av在线 | 亚洲1区在线| 国产日产欧美在线观看 | 亚洲激情六月 | 日日碰夜夜爽 | 波多野结衣在线播放一区 | 日韩精品中文字幕在线不卡尤物 | 在线国产不卡 | 色欧美成人精品a∨在线观看 | 999久久久免费视频 午夜国产在线观看 | 国产日韩欧美中文 | 久久免费的精品国产v∧ | 成人精品一区二区三区电影免费 | 亚洲五月综合 | 国产精品 国内视频 | 福利一区在线视频 | 麻豆国产精品永久免费视频 | 99久久精品国产亚洲 | 久久一区二区三区超碰国产精品 | 97色婷婷成人综合在线观看 | 欧美精品黑人性xxxx | 人人干人人干人人干 | 美女久久久久久久久久 | 麻豆国产网站入口 | 久久伦理电影 | 精品国产乱码久久久久久1区2匹 | 欧美日韩精品网站 | 亚洲在线国产 | 涩涩网站在线观看 | 狠狠色丁香婷婷综合久小说久 | 日日天天狠狠 | 久久精品国产亚洲aⅴ | 欧美一级在线 | 日韩视频免费在线观看 | 久草综合视频 | 伊人天堂av | 中文十次啦 | www成人av | 午夜手机电影 | 亚洲国产激情 | 精品亚洲一区二区三区 | 综合网天天射 | 亚洲综合激情小说 | 日本精品视频在线播放 | 欧美专区日韩专区 | 99免费精品| 在线免费观看黄色av | 午夜在线日韩 | 国产麻豆剧传媒免费观看 | 93久久精品日日躁夜夜躁欧美 | 国产精品毛片一区视频播 | 中文字幕在线一区观看 | 天天综合网久久 | 四虎影院在线观看av | 91网站观看 | 精品国产99国产精品 | 国产精品av免费观看 | 亚洲精品mv在线观看 | 操操操av| 91人人插| 特级黄色一级 | 国产一区国产二区在线观看 | 久久激情五月丁香伊人 | 成人一区二区三区在线观看 | 亚洲精品乱码久久久久久蜜桃91 | 国产在线探花 | 久久综合九色综合97婷婷女人 | 九九免费在线观看 | 国产成人精品午夜在线播放 | 久久综合婷婷综合 | 欧美肥妇free| 99精品视频免费全部在线 | 国产在线综合视频 | 欧美国产高清 | 久久精品视频免费播放 | 亚洲精品9 | 亚洲精品免费在线视频 | 成人app在线免费观看 | 99国产视频 | 亚洲女人天堂成人av在线 | 国产 精品 资源 | 国产亚洲资源 | 91精品国产成人观看 | 日韩成人免费在线电影 | 亚洲理论视频 | 特黄特色特刺激视频免费播放 | 久草在线久草在线2 | 在线看一区 | 99视频精品| 欧美一级性生活 | 综合久久一本 | 色99导航| 精品国产理论片 | 国产精品久久久一区二区三区网站 | 91资源在线免费观看 | 96亚洲精品久久久蜜桃 | 五月开心婷婷网 | 激情综合电影网 | 国产精品中文字幕在线播放 | 夜夜摸夜夜爽 | 免费国产在线视频 | 久草在线视频在线 | 国精产品一二三线999 | 精品福利网站 | 人人插人人舔 | 一级做a爱片性色毛片www | 91人人爽久久涩噜噜噜 | 在线导航av | 国产精品国内免费一区二区三区 | 日韩区欧美久久久无人区 | 免费观看第二部31集 | 狠狠搞,com| 黄色91免费观看 | 91精选在线观看 | 久久少妇 | 国产一区免费观看 | 欧美久久99 | 色资源中文字幕 | 色亚洲网 | 18网站在线观看 | 日本中文字幕网址 | 国产欧美久久久精品影院 | 超碰最新网址 | 久久av在线播放 | 国产精品久久久久久一二三四五 | 91片网| 色婷婷 亚洲 | 网址你懂的在线观看 | 在线观看视频免费播放 | 91九色视频在线观看 | 亚洲精品1区2区3区 超碰成人网 | 亚洲a网| 日韩在线中文字幕 | 日本三级久久久 | 激情九九 | av片子在线观看 | 免费高清在线视频一区· | 国产精品免费久久久久影院仙踪林 | 国产一级片不卡 | 国产91精品在线观看 | 亚洲黄色网络 | 精品福利视频在线观看 | 国产在线a | 国产精品高 | 国产一二三区在线观看 | 国产精品手机在线观看 | 久久香蕉国产精品麻豆粉嫩av | 亚洲精品乱码白浆高清久久久久久 | 国产区精品在线观看 | 久久精品第一页 | 亚洲精品国久久99热 | 欧美日韩午夜爽爽 | 午夜精品一区二区三区可下载 | 免费在线观看av网站 | 成人av电影免费在线播放 | 欧美性爽爽 | 91精品成人久久 | 国产精品99久久久精品 | 黄色看片| 6080yy午夜一二三区久久 | 国产精品久久人 | 日韩高清不卡一区二区三区 | 中文字幕一区二区三区精华液 | 欧美日韩观看 | 97视频中文字幕 | 91在线视频免费播放 | 欧美在线观看视频一区二区三区 | 看毛片网站 | 最近最新最好看中文视频 | 最新av免费在线 | 久久久久久久久电影 | 在线观看视频你懂 | 91麻豆国产 | wwwwww国产 | 国产精品久久av | 日本三级在线观看中文字 | 欧美一级视频一区 | 91精品国产91热久久久做人人 | 插婷婷| 亚洲视频大全 | 天天操天天玩 | 特级毛片网 | 美女av免费 | 国产黄色精品网站 | 免费aa大片 | 玖玖在线视频观看 | 天天搞天天干天天色 | 在线免费成人 | 久久麻豆视频 | 国产精品一区二区三区视频免费 | 国内精品中文字幕 | 国产96av| 久久一区二 | 五月天色中色 | 日韩激情一二三区 | 黄污网站在线观看 | 深爱激情站 | 国产精品久久免费看 | 最新91在线视频 | 麻豆视频在线免费观看 | 99精品在线直播 | 国产 欧美 在线 | 91人人网 | a级一a一级在线观看 | 91在线精品视频 | 国产一在线精品一区在线观看 | 超碰国产在线观看 | 国产精品专区h在线观看 | 久热av在线| 日韩欧美一区二区三区黑寡妇 | 欧美日韩精品在线观看 | 99精品欧美一区二区三区 | 最新日韩在线 | 激情综合五月网 | 日韩精品五月天 | 成人午夜精品久久久久久久3d | 亚洲精品中文在线观看 | 成年人在线观看免费视频 | 天天视频色版 | 亚洲精品字幕 | 国产一级视频免费看 | 人人藻人人澡人人爽 | 国产a免费 | 亚洲黄色小说网 | 五月天最新网址 | 久久久久久免费网 | 亚洲一级黄色av | 91高清免费看 | 国产精品久久久久久五月尺 | 91正在播放 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产一级片免费观看 | 在线91播放 | 密桃av在线 | 精品国产精品国产偷麻豆 | 黄色影院在线免费观看 | 丁香高清视频在线看看 | 一区二区三区四区免费视频 | 中文有码在线视频 | 欧美成人性战久久 | 国产精品第一页在线观看 | 国产精品九九九九九 | 国产片免费在线观看视频 | 麻豆成人网 | 视频国产 | 亚洲资源在线 | 久久精品123 | 在线播放 一区 | 色婷在线| av免费在线播放 | 国产尤物视频在线 | 青青河边草免费 | 天天操福利视频 | 91激情| 亚洲五月激情 | 国产日韩欧美网站 | 国产视频精选在线 | 久久激情五月丁香伊人 | 欧美一级欧美一级 | 91麻豆免费看 | 日本亚洲国产 | 久久dvd| bayu135国产精品视频 | 精品视频www | 超碰精品在线 | 久久日韩精品 | 欧美午夜理伦三级在线观看 | 欧美精品中文 | 久久久久久久久久免费视频 | 在线观看视频在线 | 国产成人福利在线观看 | 在线观看成人福利 | 亚洲精品乱码久久 | 日韩欧美视频在线 | 超碰人人草 | 欧美久久久久久久久久久久 | 99精品一区二区三区 | 国产高清第一页 | 日韩欧美在线视频一区二区三区 | 91在线视频 | 成人在线观看资源 | 国产特级毛片 | 日韩在线影视 | 欧美日韩在线免费观看 | 亚洲黄色网络 | 亚洲精品日韩av | 韩国三级一区 | 在线免费黄网站 | 黄色小视频在线观看免费 | 国产高清成人在线 | 在线视频观看亚洲 | 国产精品观看在线亚洲人成网 | 亚洲视频每日更新 | 欧美人交a欧美精品 | 狠狠ri | 在线观看久久久久久 | 国产精品理论在线观看 | 91色蜜桃 | 在线91视频 | 国产精品xxxx18a99 | 在线观看亚洲精品视频 | av免费网 | 国产香蕉久久精品综合网 | 美女视频黄色免费 | 国产视频亚洲 | 午夜电影av | 亚洲成av人影片在线观看 | 天天综合网入口 | 精品国产一区二区三区在线观看 | 成人免费精品 | 免费精品视频在线 | 久久久久久久综合色一本 | 午夜美女视频 | av在线一级| 一级c片| 精品国偷自产国产一区 | 精品久久久久久亚洲综合网 | 欧美福利精品 | 在线播放你懂 | 国产中文字幕免费 | 久久国产影院 | 999成人| 中文字幕国产一区 | 国产精品一区二区免费视频 | 久久久婷 | 国产精品久久久精品 | 亚洲草视频 | 黄色小网站免费看 | 午夜久久美女 | 久久精品国产成人 | 在线观看视频一区二区三区 | 国产精品久久久久久久婷婷 | 九九九九热精品免费视频点播观看 | www免费网站在线观看 | 亚洲成熟女人毛片在线 | 激情五月婷婷丁香 | 国产精品久久久免费 | 绯色av一区| 超级碰99| 日韩av电影中文字幕在线观看 | 久久成人18免费网站 | 久久久福利影院 | 欧美成天堂网地址 | 亚州精品天堂中文字幕 | 国产成人精品999在线观看 | 亚洲91网站 | 国产在线va | 欧美日韩伦理一区 | 在线观看91精品国产网站 | 亚州国产视频 | 日韩字幕在线 | 99国产精品一区 | 久久99精品一区二区三区三区 | 日韩精品一区二区三区电影 | av中文字幕亚洲 | 久久免费美女视频 | 91精品网站 | 国产欧美中文字幕 | 99久久久久国产精品免费 | 国产精品18久久久久久久久久久久 | 久久免费国产精品 | 日本精a在线观看 | 韩国中文三级 | 在线成人一区二区 | 69精品久久久 | 天天干亚洲 | 亚洲精品激情 | 精品无人国产偷自产在线 | 日韩在线免费不卡 | 最新动作电影 | 久久99精品国产麻豆宅宅 | 亚洲精品在线资源 | 天天摸天天操天天爽 | 国产精品高潮呻吟久久久久 | 四虎精品成人免费网站 | 免费观看91| 日韩av电影手机在线观看 | 日本精品在线看 | 九草视频在线 | 亚洲美女精品区人人人人 | 九九九热 | 中文字幕色在线视频 | 久久手机免费视频 | 91成人精品一区在线播放69 | 97精品视频在线播放 | 欧美另类xxx | 成人午夜电影在线 | 在线激情小视频 | 国产偷v国产偷∨精品视频 在线草 | 在线观看av中文字幕 | 天堂av免费在线 | 国产亚洲精品免费 | 中文字幕av专区 | 日日操夜夜操狠狠操 | 欧美日韩一区二区三区在线免费观看 | 国产69精品久久久久9999apgf | 日韩动态视频 | 久久婷婷视频 | 人人爽人人做 | 一区中文字幕在线观看 | 久久免费福利 | 亚洲国产精品成人av | 久久久久久亚洲精品 | 欧美色就是色 | 国产一区二区久久久 | 日本高清久久久 | 99九九免费视频 | 97热视频 | 精品一区二区三区久久久 | 四虎影视8848aamm | 免费黄色a网站 | 日韩一区二区三区免费电影 | 国产电影一区二区三区四区 | 中文十次啦 | 国产一区国产二区在线观看 | www.天天操.com | 中文字幕在线一区二区三区 | 精品国产网址 | 久草久草在线 | 免费日韩一级片 | 国产99一区视频免费 | 99久久国产免费免费 | 国模视频一区二区三区 | 毛片1000部免费看 | 国产99久久久精品 | www.av在线播放 | 成人免费在线观看入口 | 美女网站视频免费黄 | 免费激情在线电影 | 成人九九视频 | 黄色精品一区二区 | 夜夜躁日日躁狠狠久久88av | 国产视频一区二区在线 | 丁香花中文字幕 | 99色精品视频 | 91大神一区二区三区 | 欧美-第1页-屁屁影院 | 亚洲区另类春色综合小说 | 亚洲视频在线观看 | 91精品国产99久久久久久久 | 久久色中文字幕 | 亚洲国产精品成人av | 免费瑟瑟网站 | 欧美国产不卡 | 亚洲黄色免费电影 | 亚洲国产精品电影 | 99久久这里有精品 | 91视频在线免费 | 日韩高清精品免费观看 | 天天干,天天干 | 国产高清综合 | 综合色播 | 成人免费在线电影 | 久久高清毛片 | 亚洲一区二区三区四区在线视频 | 在线免费观看视频你懂的 | 欧美天堂久久 | 在线观看日韩视频 | 99久久这里只有精品 | 五月婷婷色综合 | 欧美午夜精品久久久久 | 狠狠躁夜夜躁人人爽超碰91 | 91网免费看| 午夜精品久久久99热福利 | 亚洲国产手机在线 | 亚洲电影免费 | 超碰在线日本 | 亚洲精品色视频 | 国产精品一区二区三区免费看 | 精品久久美女 | 亚洲欧美国内爽妇网 | 欧美了一区在线观看 | 99久久久国产精品美女 | 97精品在线观看 | 精品99在线 | 美女视频黄,久久 | 最近2019好看的中文字幕免费 | 一区二区在线电影 | 91麻豆精品国产91久久久无需广告 | 亚洲精品乱码久久久久久蜜桃欧美 | 欧美91精品国产自产 | 91精品播放 | 日韩精品一区二区久久 | 国产成人在线一区 | 色噜噜日韩精品一区二区三区视频 | 91成人小视频| 亚洲国产成人精品在线观看 | 婷婷精品视频 | 久久人人爽av | 日韩a级黄色片 | av成人免费观看 | www五月婷婷| 日韩国产精品毛片 | 国产xx在线| 国产精品久久久久久久久久久久午 | 这里只有精彩视频 | 高清不卡免费视频 | 国产免费视频一区二区裸体 | 最近中文字幕久久 | 久久av免费| 久久久久久久久综合 | 免费精品国产va自在自线 | 免费久草视频 | 三级在线播放视频 | 精品99久久久久久 | 91在线91拍拍在线91 | 国产成人免费高清 | 亚洲片在线| 免费精品视频在线观看 | 色午夜| 欧美激情精品久久久久久变态 | 国产高清专区 | 狠狠操天天操 | 亚洲综合欧美激情 | 国产专区在线视频 | 日韩高清在线观看 | 国产成人精品久久二区二区 | 欧美9999| 亚洲婷婷丁香 | 成人小电影在线看 | 日韩在线免费电影 | 日韩成人免费在线 | 在线免费观看视频一区 | 夜夜操网| 久久精品国产精品亚洲 | 99综合电影在线视频 | 成人精品亚洲 | 国产精品久99 | 久久精品中文字幕 | 一区二区中文字幕在线观看 | 国产视频精品在线 | 日韩中文在线字幕 | 精品国产一区二区三区蜜臀 | 九九九国产 | 99久久精品视频免费 | 国产在线精 | 中文字幕在线播放日韩 | 999成人国产 | 日韩精品一区二区三区免费视频观看 | 亚洲乱码在线观看 | 国产欧美高清 | 日韩av片在线 | 超碰97国产在线 | 亚洲精品欧洲精品 | 精品乱码一区二区三四区 | 九九亚洲视频 | www.色在线| 精品夜夜嗨av一区二区三区 | 综合天堂av久久久久久久 | 91黄视频在线 | 成人高清在线 | 91麻豆精品国产91久久久久久久久 | 色视频网页| 日日夜夜天天操 | 伊人天堂av | 欧美日韩一区二区三区在线观看视频 | 99久久综合狠狠综合久久 | 少妇搡bbbb搡bbb搡忠贞 | 久久久久久久久久久久久影院 | 波多野结衣电影久久 | 国产色综合天天综合网 | 夜色资源站wwwcom | 色婷婷六月天 | 四虎在线免费 | 欧美日韩一区久久 | 成人av免费网站 | 51精品国自产在线 | 国产91影视 | 夜色资源网 | 欧美日韩国产在线 | 激情婷婷亚洲 | 国产成人精品一二三区 | 国产精品自产拍 | 黄色大片视频网站 | 免费日韩视 | 欧美一级电影免费观看 | 天天操天天爱天天干 | 欧美日韩不卡一区二区三区 | 麻豆国产在线播放 | 日韩欧美高清在线观看 | av在线免费播放网站 | 69亚洲视频| 免费看一级特黄a大片 | 亚洲视频免费在线 | 久久er99热精品一区二区三区 | 日韩三级.com | 日韩在线三级 | 精品一二三四五区 | av天天在线观看 | 国产白浆在线观看 | 午夜99| 免费欧美 | 日韩高清精品一区二区 | 91麻豆精品国产91久久久久 | 国产一二三四在线观看视频 | 欧美一级特黄高清视频 |