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

得物H5容器野指針疑難問題排查 & 解決

移動開發(fā) iOS
本文中的crash從出現到解決歷時近一年,一開始根據線上日志判斷是h5 頁面返回 & h5 頁面滾動導致的問題,禁用手勢后雖然幾乎解決問題,但是線上還有零星crash上報,因此為了保證h5 離線功能的線上穩(wěn)定性,需要完美解決問題。

1、背景

得物 iOS 4.9.x 版本 上線后,一些帶有橫向滾動內容的h5頁面,有一個webkit 相關crash增加較快。通過Crash堆棧判斷是UIScrollview執(zhí)行滾動動畫過程中內存野指針導致的崩潰。

圖片

2、前期排查

通過頁面瀏覽日志,發(fā)現發(fā)生崩潰時所在的頁面都是在h5 web容器內,且都是在頁面的生命周期方法viewDidDisappear方法調用后才發(fā)生崩潰,因此推測崩潰是在h5 頁面返回時發(fā)生的。

剛好交易的同事復現了崩潰證實了我們的推測。因此可以基本確定:崩潰的原因是頁面退出后,頁面內存被釋放,但是滾動動畫繼續(xù)執(zhí)行,這時崩潰堆棧中scrollview的delegate沒有置空,系統(tǒng)繼續(xù)執(zhí)行delegate的相關方法,訪問了已經釋放的對象的內存(野指針問題)。

同時發(fā)生crash h5 頁面都存在一個特點,就是頁面內存在可以左右橫滑的tab視圖。

圖片

操作手勢側滑存在體驗問題,左右橫滑的tab視圖也會跟著滾動(見下面視頻)。關聯bugly用戶行為日志,判斷這個體驗問題是和本文中的crash有相關性的。

3、不完美的解決方案

經過上面的分析,修復思路是在h5頁面手勢側滑返回時,將h5容器頁面內tab的橫滑手勢禁掉(同時需要在 h5 web容器的viewWillAppear方法里將手勢再打開,因為手勢側滑是可以取消在返回頁面)。

具體代碼如下(這樣在操作頁面?zhèn)然祷貢r,頁面的手勢被禁掉,不會再滾動):

@objc dynamic func webViewCanScroll(enable:Bool) {        let contentView = self.webView.scrollView.subviews.first { view in            if let className = object_getClass(view), NSStringFromClass(className) == "WKContentView" {                return true            }            return false        }        let webTouchEventsGestureRecognizer = contentView?.gestureRecognizers?.first(where: { gesture in            if let className = object_getClass(gesture), NSStringFromClass(className) == "UIWebTouchEventsGestureRecognizer" {                return true            }            return false        })        webTouchEventsGestureRecognizer?.isEnabled = enable    }
@objc dynamic func webViewCanScroll(enable:Bool) {
        let contentView = self.webView.scrollView.subviews.first { view in
            if let className = object_getClass(view), NSStringFromClass(className) == "WKContentView" {
                return true
            }
            return false
        }
        let webTouchEventsGestureRecognizer = contentView?.gestureRecognizers?.first(where: { gesture in
            if let className = object_getClass(gesture), NSStringFromClass(className) == "UIWebTouchEventsGestureRecognizer" {
                return true
            }
            return false
        })
        webTouchEventsGestureRecognizer?.isEnabled = enable
    }

經過測試,h5 web容器側滑時出現的tab頁面左右滾動的體驗問題確實被解決。這樣既可以解決體驗問題,又可以解決側滑離開頁面導致的崩潰問題,但是這樣并沒有定位crash的根因。修復代碼上線后,crash量確實下降,但是每天還是有一些crash出現,且收到了個別頁面極端操作下偶現卡住的問題反饋。因此需要繼續(xù)排查crash根因,將crash根本解決掉。

圖片

繼續(xù)看文章開始的crash堆棧,通過Crash堆棧判斷崩潰原因是UIScrollview執(zhí)行滾動動畫過程中回調代理方法(見上圖)時訪問被釋放的內存。常規(guī)解決思路是在退出頁面后,在頁面生命周期的dealloc方法中,將UIScrollview的delegate置空即可。WKWebView確實有一個scrollVIew屬性,我們在很早的版本就將其delegate屬性置空,但是崩潰沒有解決。

deinit {         scrollView.delegate = nil         scrollView.dataSource = nil    }
deinit {
         scrollView.delegate = nil
         scrollView.dataSource = nil
    }

因此崩潰堆棧里的Scrollview代理不是這里的WKWebView的scrollVIew的代理。那崩潰堆棧中的scrollView代理到底屬于哪個UIScrollview呢?幸運的是蘋果webkit 是開源的,我們可以將webkit源碼下載下來看一下。

4、尋找崩潰堆棧中的ScrollViewDelegate

崩潰堆棧中的ScrollViewDelegate是WKScrollingNodeScrollViewDelegate。首先看看WKWebView的scrollview的 delegate是如何實現的,因為我們猜想這個scrollview的delegate除了我們自己設置的,是否還有其他delegate(比如崩潰堆棧中的WKScrollingNodeScrollViewDelegate)。

通過對Webkit源碼一番研究,發(fā)現scrollview的初始化方法:

- (void)_setupScrollAndContentViews{    CGRect bounds = self.bounds;    _scrollView = adoptNS([[WKScrollView alloc] initWithFrame:bounds]);    [_scrollView setInternalDelegate:self];    [_scrollView setBouncesZoom:YES];
}
- (void)_setupScrollAndContentViews
{
    CGRect bounds = self.bounds;
    _scrollView = adoptNS([[WKScrollView alloc] initWithFrame:bounds]);
    [_scrollView setInternalDelegate:self];
    [_scrollView setBouncesZoom:YES];


}

WKWebView的scrollVIew 是WKScrollView 類型。

4.1 WKScrollView 代理實現

首先看到WKWebView的scrollview的類型其實是WKScrollView(UIScrollview的子類),他除了繼承自父類的delegate屬性,還有一個internalDelegate屬性,那么這個internalDelegate屬性是不是我們要找的WKScrollingNodeScrollViewDelegate 呢?

@interface WKScrollView : UIScrollView
@property (nonatomic, assign) WKWebView <UIScrollViewDelegate> *internalDelegate;

@end
@interface WKScrollView : UIScrollView


@property (nonatomic, assign) WKWebView <UIScrollViewDelegate> *internalDelegate;




@end

通過閱讀源碼后發(fā)現不是這樣的(代碼有刪減,感興趣可自行閱讀源碼)。

- (void)setInternalDelegate:(WKWebView <UIScrollViewDelegate> *)internalDelegate{    if (internalDelegate == _internalDelegate)        return;    _internalDelegate = internalDelegate;    [self _updateDelegate];}
- (void)setDelegate:(id <UIScrollViewDelegate>)delegate{    if (_externalDelegate.get().get() == delegate)        return;    _externalDelegate = delegate;    [self _updateDelegate];}
- (id <UIScrollViewDelegate>)delegate{    return _externalDelegate.getAutoreleased();}
- (void)_updateDelegate{//......    if (!externalDelegate)    else if (!_internalDelegate)    else {        _delegateForwarder = adoptNS([[WKScrollViewDelegateForwarder alloc] initWithInternalDelegate:_internalDelegate externalDelegate:externalDelegate.get()]);        [super setDelegate:_delegateForwarder.get()];    }}
- (void)setInternalDelegate:(WKWebView <UIScrollViewDelegate> *)internalDelegate
{
    if (internalDelegate == _internalDelegate)
        return;
    _internalDelegate = internalDelegate;
    [self _updateDelegate];
}


- (void)setDelegate:(id <UIScrollViewDelegate>)delegate
{
    if (_externalDelegate.get().get() == delegate)
        return;
    _externalDelegate = delegate;
    [self _updateDelegate];
}


- (id <UIScrollViewDelegate>)delegate
{
    return _externalDelegate.getAutoreleased();
}


- (void)_updateDelegate
{//......
    if (!externalDelegate)
    else if (!_internalDelegate)
    else {
        _delegateForwarder = adoptNS([[WKScrollViewDelegateForwarder alloc] initWithInternalDelegate:_internalDelegate externalDelegate:externalDelegate.get()]);
        [super setDelegate:_delegateForwarder.get()];
    }
}

這個internalDelegate的作用是讓WKWebView 監(jiān)聽scrollview的滾動回調,同時也可以讓開發(fā)者在外部監(jiān)聽WKWebView的scrollview回調。如何實現的呢?可以查看WKScrollViewDelegateForwarder的實現。

- (void)forwardInvocation:(NSInvocation *)anInvocation{    //...    if (internalDelegateWillRespond)        [anInvocation invokeWithTarget:_internalDelegate];    if (externalDelegateWillRespond)        [anInvocation invokeWithTarget:externalDelegate.get()];
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    //...
    if (internalDelegateWillRespond)
        [anInvocation invokeWithTarget:_internalDelegate];
    if (externalDelegateWillRespond)
        [anInvocation invokeWithTarget:externalDelegate.get()];


}

通過復寫- (void)forwardInvocation:(NSInvocation *)anInvocation 方法,在消息轉發(fā)時實現的。

4.2 猜想 & 驗證

既然WKScrollingNodeScrollViewDelegate 不是WKScrollview的屬性,那說明崩潰堆棧中的scrollview不是WKScrollview,那頁面上還有其他scrollview么。我們看源碼WKScrollingNodeScrollViewDelegate 是在哪里設置的。

void ScrollingTreeScrollingNodeDelegateIOS::commitStateAfterChildren(const ScrollingStateScrollingNode& scrollingStateNode){        //......        if (scrollingStateNode.hasChangedProperty(ScrollingStateNode::Property::ScrollContainerLayer)) {            if (!m_scrollViewDelegate)                m_scrollViewDelegate = adoptNS([[WKScrollingNodeScrollViewDelegate alloc] initWithScrollingTreeNodeDelegate:this]);        } }
void ScrollingTreeScrollingNodeDelegateIOS::commitStateAfterChildren(const ScrollingStateScrollingNode& scrollingStateNode)
{
        //......
        if (scrollingStateNode.hasChangedProperty(ScrollingStateNode::Property::ScrollContainerLayer)) {
            if (!m_scrollViewDelegate)
                m_scrollViewDelegate = adoptNS([[WKScrollingNodeScrollViewDelegate alloc] initWithScrollingTreeNodeDelegate:this]);
        }
 }

搜索webkit的源碼,發(fā)現創(chuàng)建WKScrollingNodeScrollViewDelegate的位置只有一處。但是webkit的源碼太過于復雜,無法通過閱讀源碼的方式知道WKScrollingNodeScrollViewDelegate屬于哪個scrollview。

為此我們只能換一種思路,我們通過xcode調試的方式查看當前webview加載的頁面是否還有其他scrollview。

圖片

頁面上剛好還有一個scrollview:WKChildScrollview

這個WKChildScrollview 是否是崩潰堆棧中的scrollview呢,如果我們能確定他的delegate是WKScrollingNodeScrollViewDelegate,那就說明這個WKChildScrollview 是崩潰堆棧中的scrollview。

為了驗證這個猜想,我們首先找到源碼,源碼并沒有太多,看不出其delegate類型。

@interface WKChildScrollView : UIScrollView <WKContentControlled>@end
@interface WKChildScrollView : UIScrollView <WKContentControlled>
@end

我們只能轉換思路在運行時找到WKWebView的類型為WKChildScrollView的子view(通過OC runtime & 視圖樹遍歷的方式),判斷他的delegate是否為WKScrollingNodeScrollViewDelegate 。

我們運行時找到類型為 WKChildScrollView 的子view后,獲取其delegate類型,確實是WKScrollingNodeScrollViewDelegate。至此我們找到了崩潰堆棧中的scrollview。

確定了崩潰堆棧中的scrollview的類型,那么修復起來也比較容易了。在頁面生命周期的viewDidAppear方法里,獲取類型為 WKChildScrollView的子view。然后在dealloc方法里,將其delegate置空即可。

deinit {        if self.childScrollView != nil {            if self.childScrollView?.delegate != nil {                 self.childScrollView?.delegate = nil             }        }}

deinit {
        if self.childScrollView != nil {
            if self.childScrollView?.delegate != nil {
                 self.childScrollView?.delegate = nil
             }
        }
}

4.3 小程序同層渲染

想完了解決方案,那么WKChildScrollView 是做啥用的呢?

WKWebView 在內部采用的是分層的方式進行渲染,它會將 WebKit 內核生成的 Compositing Layer(合成層)渲染成 iOS 上的一個 WKCompositingView,這是一個客戶端原生的 View,不過可惜的是,內核一般會將多個 DOM 節(jié)點渲染到一個 Compositing Layer 上,因此合成層與 DOM 節(jié)點之間不存在一對一的映射關系。當把一個 DOM 節(jié)點的 CSS 屬性設置為 overflow: scroll (低版本需同時設置 -webkit-overflow-scrolling: touch)之后,WKWebView 會為其生成一個 WKChildScrollView,與 DOM 節(jié)點存在映射關系,這是一個原生的 UIScrollView 的子類,也就是說 WebView 里的滾動實際上是由真正的原生滾動組件來承載的。WKWebView 這么做是為了可以讓 iOS 上的 WebView 滾動有更流暢的體驗。雖說 WKChildScrollView 也是原生組件,但 WebKit 內核已經處理了它與其他 DOM 節(jié)點之間的層級關系,這一特性可以用來做小程序的同層渲染。(「同層渲染」顧名思義則是指通過一定的技術手段把原生組件直接渲染到 WebView 層級上,此時「原生組件層」已經不存在,原生組件此時已被直接掛載到 WebView 節(jié)點上。你幾乎可以像使用非原生組件一樣去使用「同層渲染」的原生組件,比如使用 view、image 覆蓋原生組件、使用 z-index 指定原生組件的層級、把原生組件放置在 scroll-view、swiper、movable-view 等容器內等等)。

5、蘋果的修復方案

本著嚴謹的態(tài)度,我們想是什么導致了最開始的崩潰堆棧呢?是我們開發(fā)過程中的功能還是系統(tǒng)bug?如果是系統(tǒng)bug,其他公司也可能遇到,但是互聯網上搜不到其他公司或開發(fā)者討論崩潰相關信息。我們繼續(xù)看一下崩潰堆棧的top 函數RemoteScrollingTree::scrollingTreeNodeDidScroll() 源碼如下:

void RemoteScrollingTree::scrollingTreeNodeDidScroll(ScrollingTreeScrollingNode& node, ScrollingLayerPositionAction scrollingLayerPositionAction){    ASSERT(isMainRunLoop());
    ScrollingTree::scrollingTreeNodeDidScroll(node, scrollingLayerPositionAction);
    if (!m_scrollingCoordinatorProxy)        return;
    std::optional<FloatPoint> layoutViewportOrigin;    if (is<ScrollingTreeFrameScrollingNode>(node))        layoutViewportOrigin = downcast<ScrollingTreeFrameScrollingNode>(node).layoutViewport().location();
    m_scrollingCoordinatorProxy->scrollingTreeNodeDidScroll(node.scrollingNodeID(), node.currentScrollPosition(), layoutViewportOrigin, scrollingLayerPositionAction);}
void RemoteScrollingTree::scrollingTreeNodeDidScroll(ScrollingTreeScrollingNode& node, ScrollingLayerPositionAction scrollingLayerPositionAction)
{
    ASSERT(isMainRunLoop());


    ScrollingTree::scrollingTreeNodeDidScroll(node, scrollingLayerPositionAction);


    if (!m_scrollingCoordinatorProxy)
        return;


    std::optional<FloatPoint> layoutViewportOrigin;
    if (is<ScrollingTreeFrameScrollingNode>(node))
        layoutViewportOrigin = downcast<ScrollingTreeFrameScrollingNode>(node).layoutViewport().location();


    m_scrollingCoordinatorProxy->scrollingTreeNodeDidScroll(node.scrollingNodeID(), node.currentScrollPosition(), layoutViewportOrigin, scrollingLayerPositionAction);
}

崩潰在這個函數里,查看這個函數的commit記錄:

圖片

圖片

簡單描述一下就是scrollingTreeNodeDidScroll方法中使用的m_scrollingCoordinatorProxy 對象改成weak指針,并進行判空操作。這種改變,正是解決m_scrollingCoordinatorProxy 內存被釋放后還在訪問的方案。

這個commit是2023年2月28號提交的,commit log是:

[UI-side compositing] RemoteScrollingTree needs to hold a weak ref to the RemoteScrollingCoordinatorProxyhttps://bugs.webkit.org/show_bug.cgi?id=252963rdar://105949247
Reviewed by Tim Horton.
The scrolling thread can extend the lifetime of the RemoteScrollingTree via activity on that thread,so RemoteScrollingTree needs to hold a nullable reference to the RemoteScrollingCoordinatorProxy;use a WeakPtr.
[UI-side compositing] RemoteScrollingTree needs to hold a weak ref to the RemoteScrollingCoordinatorProxy
https://bugs.webkit.org/show_bug.cgi?id=252963
rdar://105949247


Reviewed by Tim Horton.


The scrolling thread can extend the lifetime of the RemoteScrollingTree via activity on that thread,
so RemoteScrollingTree needs to hold a nullable reference to the RemoteScrollingCoordinatorProxy;
use a WeakPtr.

至此,我們基本確認,這個崩潰堆棧是webkit內部實現的一個bug,蘋果內部開發(fā)者最終使用弱引用的方式解決。

同時修復上線后,這個crash的崩潰量也降為0。

6、總結

本文中的crash從出現到解決歷時近一年,一開始根據線上日志判斷是h5 頁面返回 & h5 頁面滾動導致的問題,禁用手勢后雖然幾乎解決問題,但是線上還有零星crash上報,因此為了保證h5 離線功能的線上穩(wěn)定性,需要完美解決問題。

本文的crash 似曾相識,但是經過驗證和閱讀源碼后發(fā)現并不是想象的那樣,繼續(xù)通過猜想+閱讀源碼的方式尋找到了崩潰堆棧中的真正scrollview代理對象,從而在app 側解決問題。最后發(fā)現是蘋果webkit的bug。

本文中的崩潰問題本質上是野指針問題,那么野指針問題定位有沒有通用的解決方案呢?

責任編輯:武曉燕 來源: 得物技術
相關推薦

2012-05-04 09:18:46

2011-05-06 14:05:22

打印機照片打印

2010-03-09 12:23:30

Python編碼

2009-06-18 08:46:56

微軟Windows 7操作系統(tǒng)

2017-04-18 22:50:10

OSPF疑難問題

2009-12-25 10:59:08

WPF Timer

2009-12-23 08:53:56

Windows 7遠程協助

2011-08-03 13:25:19

布線系統(tǒng)規(guī)劃

2011-04-26 16:39:30

照片打印機

2010-01-26 10:13:45

學習C++

2010-07-05 14:41:21

SQL Server數

2011-04-01 14:05:09

SQL數據庫

2009-12-24 18:03:35

WPF線程渲染

2016-03-22 15:05:00

定性移動數據開源

2012-05-14 11:48:18

MSinfo32Windows Ser

2020-08-12 12:10:31

前端開發(fā)技術

2016-11-24 15:03:58

JAVANATIVE野指針

2016-11-24 15:39:03

JavaNATIVE野指針

2009-11-02 15:03:21

VSFTP服務

2023-02-08 18:33:49

SRE探索業(yè)務
點贊
收藏

51CTO技術棧公眾號

97人人做人人爱| 欧美日韩国产在线观看| 久久国产精品99久久久久久丝袜| 日韩精品在线免费看| 国产精品欧美大片| 色欲综合视频天天天| 亚洲高清在线观看一区| 99久久久久久久| 99精品国产在热久久| 亚洲性猛交xxxxwww| 欧美成人三级在线播放| xxxwww在线观看| 性娇小13――14欧美| 中文字幕亚洲二区| 久久久高清视频| av久久网站| 亚洲六月丁香色婷婷综合久久| 大波视频国产精品久久| 超碰在线免费97| 亚洲久久一区二区| 日韩在线精品视频| 日韩精品卡通动漫网站| 日韩高清二区| 欧美日韩国产美女| av网站在线观看不卡| 直接在线观看的三级网址| 97久久超碰精品国产| 成人精品一区二区三区| 国产精品21p| 黄色精品网站| 久久手机免费视频| 免费一级做a爰片久久毛片潮| 一区二区三区在线免费看| 欧美三级午夜理伦三级中视频| 蜜桃传媒一区二区三区| 中文字幕在线观看播放| 国产精品福利一区二区三区| 热re99久久精品国99热蜜月| 日本精品一区二区在线观看| 国产精品亚洲人在线观看| 国产美女扒开尿口久久久| 欧美精品韩国精品| 韩日在线一区| 欧美黑人国产人伦爽爽爽| 人人干在线观看| 欧美色网址大全| 亚洲色图激情小说| 亚洲色图14p| youjizzjizz亚洲| 精品国产伦一区二区三区观看体验 | 欧美精品videos另类日本| 波多野结衣亚洲一区二区| 国产精品成人一区二区不卡| 日韩中文字幕免费看| 美女av免费看| 香蕉精品视频在线观看| 精品国内自产拍在线观看| av片在线免费看| 手机在线电影一区| 久久久久999| 青春草免费视频| 欧美日韩一区自拍 | 婷婷电影在线观看| 色综合久久久久综合| av网址在线观看免费| 黑人巨大精品| 欧美日韩亚洲综合一区二区三区| 亚洲天堂2018av| 国产精品麻豆| 亚洲福利影片在线| 无码精品一区二区三区在线播放| 黑人久久a级毛片免费观看| 日韩精品免费在线视频观看| 美国黄色一级视频| 久久99国产精品视频| 亚洲丝袜在线视频| 中文字幕求饶的少妇| 亚洲免费二区| 久久久久久中文字幕| 日韩一区二区视频在线| 三级影片在线观看欧美日韩一区二区| 51精品国产黑色丝袜高跟鞋 | 4438x成人网最大色成网站| 夜夜爽久久精品91| 米奇精品关键词| 一区二区三区精品99久久 | www.亚洲视频| 亚洲激情在线播放| 欧美牲交a欧美牲交| 99久久伊人| 精品久久99ma| 国产午夜福利一区| 亚洲无线视频| 国产精品视频男人的天堂| 国内老熟妇对白hdxxxx| 91视频一区二区三区| 一区二区免费在线视频| 国产夫妻在线| 91精品国产综合久久久久久漫画| 女同性恋一区二区三区| 久久五月天小说| 午夜精品蜜臀一区二区三区免费| 国产情侣呻吟对白高潮| 成人午夜电影小说| 色综合电影网| аⅴ资源天堂资源库在线| 欧美日韩国产在线播放网站| 99re这里只有| 91精品国产乱码久久久久久| 欧美专区福利在线| 草草视频在线播放| 国产欧美日韩激情| 你懂的av在线| 欧美视频三区| 中文字幕日韩电影| 色网站在线播放| 国产高清不卡一区二区| 亚洲 日韩 国产第一区| 亚洲精华液一区二区三区| 欧美一级欧美三级| 免费黄色在线网址| 亚洲永久免费| 精品999在线观看| 自由的xxxx在线视频| 欧美日韩精品系列| 日本一级免费视频| 国产精品试看| 精品免费日产一区一区三区免费| v片在线观看| 欧美另类高清zo欧美| 色欲狠狠躁天天躁无码中文字幕| 亚洲人成久久| 国产精品一 二 三| 日韩av激情| 欧美一区二区三区视频免费| 婷婷丁香综合网| 日本不卡视频在线| 欧美一区激情视频在线观看| 人在线成免费视频| 亚洲激情中文字幕| 九九九国产视频| 粉嫩aⅴ一区二区三区四区五区| 波多野结衣三级在线| 国产精品久久久久久久久久齐齐 | 欧美高清视频在线高清观看mv色露露十八 | **精品中文字幕一区二区三区| 伊人久久综合97精品| 一级特黄免费视频| 国产精品网站导航| 天天操,天天操| 91欧美国产| 成人免费在线视频网址| 黄网站视频在线观看| 91精品国产综合久久久久久久久久 | 日本午夜人人精品| 精品影院一区| 欧美日韩中文字幕一区| 国产一区二区三区视频播放| 免费看欧美美女黄的网站| 亚洲精品欧洲精品| 亚洲欧美专区| 欧美理论电影在线播放| 国产精品进线69影院| 国产精品50p| 四虎5151久久欧美毛片| 国产91成人在在线播放| 国模精品一区二区| 欧美色窝79yyyycom| 老司机精品免费视频| 久久97超碰色| 欧美日韩午夜爽爽| 国产伦精品一区二区三区在线播放 | 色噜噜狠狠成人网p站| 国产又黄又粗的视频| 另类欧美日韩国产在线| 中国一级大黄大黄大色毛片| 亚洲一区二区免费在线观看| 欧美亚洲成人xxx| 成a人片在线观看www视频| 欧美高清一级片在线| 久久久久亚洲AV| 91麻豆文化传媒在线观看| 久久精品影视大全| 午夜免费视频在线国产| 欧美精品亚洲一区二区在线播放| 夫妻性生活毛片| 国产成人免费高清| 日本一道本久久| 国产日产一区| 91九色露脸| 伊人久久视频| 久久人人爽亚洲精品天堂| 黄色一级大片在线免费看国产一| 欧美性少妇18aaaa视频| 国产精品精品软件男同| 成人a区在线观看| 天天干天天综合| 一级成人国产| 国产成人精品免费看在线播放| 国产香蕉精品| 成人久久一区二区三区| 91超碰国产在线| 久久精品视频网站| 免费在线观看一级毛片| 欧美一区二区美女| 波多野结衣影片| 午夜欧美大尺度福利影院在线看| 国产黄色录像视频| 91亚洲国产成人精品一区二三| www.欧美三级电影.com| 国产精品一区二区免费视频| 欧美色xxxx| 欧美日韩免费一区二区| 日本一区二区三区在线观看| 丰满人妻一区二区三区免费视频棣| 玖玖玖国产精品| 国产av人人夜夜澡人人爽麻豆| 91一区在线| 欧美一区二区视频在线| 红杏视频成人| 91久久精品一区二区别| 亚洲欧洲日韩精品在线| 欧洲精品毛片网站| free性欧美16hd| 不卡av电影在线观看| av片在线看| 一区二区三区天堂av| 午夜视频福利在线| 欧美精品一区二区三区蜜桃视频| 国产精品免费无遮挡| 欧美色网站导航| 这里只有久久精品视频| 色国产精品一区在线观看| 日本va欧美va国产激情| 亚洲成av人片在www色猫咪| 黄页网站免费观看| 亚洲精品视频在线看| 永久免费未视频| 国产精品九色蝌蚪自拍| 又色又爽的视频| 国产精品―色哟哟| 在线观看免费小视频| 国产日韩欧美综合在线| 国产人妻一区二区| 久久久久久免费毛片精品| 中文字字幕码一二三区| eeuss影院一区二区三区| 污污免费在线观看| 波多野洁衣一区| 在线精品一区二区三区| 99re视频精品| 亚洲天堂视频一区| 国产欧美精品在线观看| 欧美精品日韩在线| 中文字幕永久在线不卡| 99久久99久久精品国产| 亚洲免费大片在线观看| 久久久久久久久久久97| 午夜精品福利一区二区三区蜜桃| 久久久久久久极品| 欧美伊人久久久久久久久影院| 亚洲免费视频二区| 在线播放视频一区| 亚洲乱码精品久久久久..| 亚洲国产精品va在线看黑人动漫| 深爱五月激情五月| 亚洲视频在线观看免费| av电影在线观看一区二区三区| xxx一区二区| 日本在线观看大片免费视频| 97精品欧美一区二区三区| 欧美xoxoxo| 91久久中文字幕| 国产精品美女在线观看直播| 日本公妇乱淫免费视频一区三区| 久久神马影院| 丰满少妇久久久| 欧美aaaaaa午夜精品| 欧美熟妇另类久久久久久多毛| 成人av在线播放网站| 影音先锋制服丝袜| 依依成人精品视频| 国产在线观看黄色| 欧美高清视频不卡网| 欧美一区二区三区激情| 亚洲丝袜av一区| 在线免费av导航| 欧美自拍大量在线观看| 99综合久久| 久久久国产精品一区二区三区| 日韩精品免费一区二区在线观看 | 日韩午夜av| 欧美大尺度做爰床戏| 国产高清一区日本| 亚洲中文字幕一区| 亚洲美女精品一区| 欧美国产一级片| 亚洲а∨天堂久久精品9966| jizz视频在线观看| 午夜精品久久久久久久男人的天堂 | 国产精品99免费看| 91人人澡人人爽人人精品| 成人激情小说乱人伦| 黄色激情小视频| 欧美视频在线免费| 亚洲精品久久久久avwww潮水| 永久555www成人免费| 春色校园综合激情亚洲| 成人久久18免费网站图片| 国产精品探花在线观看| 久久这里只有精品18| 久久精品99国产精品| 给我看免费高清在线观看| 亚洲精品菠萝久久久久久久| 伊人网av在线| 亚洲欧美激情在线视频| 91九色美女在线视频| 亚洲在线视频福利| 欧美丰满日韩| 亚洲精品视频导航| 久久精品一区八戒影视| 国产成人无码精品亚洲| 日韩精品最新网址| 黄色免费在线观看网站| 国产精品色悠悠| 成人在线免费观看视频| 国产xxxxx在线观看| gogogo免费视频观看亚洲一| 九九精品在线观看视频| 欧美一区二区日韩一区二区| 午夜在线视频播放| 国产精品欧美激情| 国产成人影院| 欧美国产日韩在线播放| xfplay精品久久| 天天综合网久久综合网| 日韩国产欧美精品一区二区三区| 999福利在线视频| 国产日产精品一区二区三区四区| 欧美啪啪一区| 亚洲成人福利视频| 亚洲一级在线观看| 蜜桃av中文字幕| 97热精品视频官网| 日韩av三区| 欧美aⅴ在线观看| 久久久久久久久久久99999| 激情视频网站在线观看| 亚洲日韩欧美视频| yy6080久久伦理一区二区| 午夜精品一区二区在线观看 | 日本韩国精品在线| 国产日产精品久久久久久婷婷| 国产精品wwwwww| 日韩久久综合| 亚洲一二三不卡| 一区二区三区.www| 日批免费在线观看| 日韩av三级在线观看| heyzo久久| 亚洲男人天堂2021| 亚洲福利一二三区| 日本不卡视频一区二区| 国产精品入口福利| 欧美在线不卡| 50一60岁老妇女毛片| 一本大道久久a久久精品综合| jizz在线免费观看| 97se亚洲综合在线| 亚洲制服av| 长河落日免费高清观看| 日韩一区二区三区视频| 白浆在线视频| 先锋影音一区二区三区| 国产乱码精品一区二区三区av| 国产精品成人av久久| 亚洲欧美视频在线| 96sao精品免费视频观看| 免费人成自慰网站| 欧美国产精品久久| 午夜精品在线播放| 日韩暖暖在线视频| 欧美va天堂在线| ass精品国模裸体欣赏pics| 欧美精品三级日韩久久| 久久丁香四色| 日韩在线一区二区三区免费视频| 99久久伊人| 日本黄色片一级片| 老牛影视精品| 欧美精品一区二区视频| 美女任你摸久久| 国产污片在线观看| 中文字幕国产亚洲| 福利片在线一区二区| www.欧美日本| 一区二区三区波多野结衣在线观看 | 欧美人伦禁忌dvd放荡欲情| www.综合网.com| 亚洲v国产v|