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

得物 iOS 啟動優化之 Building Closure

移動開發 iOS
我們探索了 BuildingClosure 的生成過程,發現在Building Closure階段中,可能存在字符串的 Hash 碰撞 引發循環次數大幅增加,進而引發了啟動耗時暴增,進而導致啟動耗時的大幅增加。

一、神秘的 BuildingClosure

    1. dyld && BuildingClosure

    2. BuildingClosure 非常耗時

    3. BuildingClosure 文件解析

二、離奇的啟動耗時暴增事件 

    1. 啟動耗時暴增 200ms

    2. BuildingClosure 耗時異常變化定位

三、啟動優化新秘境

    1. Perfect Hash

    2. 向前一步

四、總結

得物一直重視用戶體驗,尤其是啟動時長這一重要指標。在近期的啟動時長跟進中,我們發現了在BuildingClosure 階段的一個優化方式,成功的幫助我們降低了 1/5 的 BuildingClosure 階段的啟動耗時。Building Closure 并非工程的編譯階段(雖然它有一個building),Building Closure 是應用初次啟動時會經歷的階段,因此它會影響應用的啟動時長。

單就BuildingClosure階段而言,我們觀察到該階段其中一個函數從 480ms 暴增到 1200ms 左右(PC 電腦端運行 dyld 調試統計耗時數據),我們通過優化,將耗時從1200ms降低到110ms。即使相比最開始的情況,也相當于從480ms降低到了110ms,由此可見Building Closure 優化是應用進行啟動優化必不可少的一個重要手段。因此在這里我們也和各位讀者進行分享,期望能夠對各自項目有所幫助。

一、神秘的 BuildingClosure

啟動優化的技術、實現方案業界有不少的文章可以參考學習,這里不再額外贅述。我們來探索下啟動過程中非常神秘的 BuildingClosure。

BuildingClosure 是在 System Interface Initialization 階段 dyld 生成的,并且我們也無法做任何的干預,另外相關的剖析文章相對較少,所以說 BuildingClosure 較為神秘,也是實至名歸。

BuildingClosure 是由 dyld 在應用啟動階段執行的,所以想要了解 BuildingClosure 還是要從 dyld 開始了解。

dyld && BuildingClosure

Dyld 源碼可以在 Apple GitHub 上查閱 https://github.com/apple-oss-distributions/dyld

相信大家都應該了解過,BuildingClosure 是在 iOS 13 引入進來的,對應的 dyld 為 dyld3,目的是為了減少啟動環節符號查找、Rebase、Bind 的耗時。

核心技術邏輯是將重復的啟動工作只做一次,在 App 首次啟動、版本更新、手機重啟之后的這次啟動過程中,將相關信息緩存到 Library/Caches/com.app.dyld/xx.dyld 文件中,App 在下次啟動時直接使用緩存好的信息,進而優化二次啟動的速度。

在 iOS 15 Dyld4 中更是引入了 SwiftConformance,進一步解決了運行時 Swift 中的類型、協議檢查的耗時。

圖片圖片

以上優化,我們都無需做任何工作即可享受 dyld 帶來的啟動速度的優化,可以感受到 Apple 的開發人員也在關心啟動速度并為之做了大量的工作。

BuildingClosure 非常耗時

我們通過 instrument 觀測到 BuildingClosure 的耗時占據了啟動耗時將近 1/3 的時間。

雖然說,BuildingClosure 只會在首次啟動、版本更新、手機重啟的第一次啟動生成和耗時,但是對用戶的體驗影響是非常之大的。

圖片圖片

BuildingClosure 文件解析

我們通過對 dyld 的編譯和搭建模擬手機環境,成功模擬器了 dyld 加載可執行文件的過程,也就成功解析了 BuildingClosure 文件。BuildingClosure 文件數據格式如下(數據格式、注釋僅供參考,并非全部的數據格式):

BuildingClosure 文件內部結構(數據格式、注釋僅供參考)BuildingClosure 文件內部結構(數據格式、注釋僅供參考)

其中占用比較大的部分主要為 Loader-selectorReferencesFixupsSize SwiftTypeConformance  objcSelector objcClass

二、離奇的啟動耗時暴增事件

如上,我們已經對 BuildingClosure 有了基本的了解和對 dyld 的執行過程有了一定的了解。但是這份寧靜在某一天突然被打破。

啟動耗時暴增 200ms

在我們一個新版本開發過程中,例行對啟動耗時進行跟蹤測試,但是發現新版本啟動耗時暴增 200ms,可以說是災難級別的事情。

我們開始對最近的出包做了基本的耗時統計,方式為基于 instrument,統計出來啟動各個階段的耗時數據。經過對比,可以明顯觀測到,200ms 耗時的增加表現在 BuildingClosure 這個環節。

但是 BuildingClosure 耗時的增加既不是階梯式增加,也不是線性增加,并且只在新版本有增加。在排除相關因素(動態庫、工程配置、打包腳本、編譯環境)之后,仍然沒有定位明確的原因。

在以上定位工作之后,最終確定耗時確實在 dyld 的 BuildingClosure 階段耗時,并且懷疑可能是某些代碼觸發了 Dyld 的隱藏彩蛋。所以我們開始了對 BuildingClosure 更深一步的研究。

BuildingClosure 耗時異常變化定位

通過使用 Instrument 對 System Interface Initialization 階段進行堆棧分析,最終發現了耗時最高的函數:dyld4::PrebuiltObjC::generateHashTables(dyld4::RuntimeState&)

在對比了新老版本數據,耗時變化差異的函數也是此函數,我們簡稱為 generateHashTables。這樣使得我們更加確定耗時為 dyld 過程中的 BuildingClosure 階段。

圖片

使用 Instrument 分析 BuildingClosure 階段耗時

三、啟動優化新秘境

在發現 BuildingClosure 生成過程中耗時占比非常大,并且有異常時,起初并沒有意識到有什么問題,因為這是 dyld 內的代碼,并未感覺會有什么問題。但是一切都指向了該函數,于是開始擼起袖子看代碼。

從代碼中可以看到,此處是為了生成 BuildingClosure 中 objcSelector objcClass objcProtocol 這三個部分的 HashTable(可以參考上面的 【BuildingClosure 文件解析】部分)。

拿起 dyld 開始對耗時異常版本的可執行文件進行調試,通過對該函數和內部實現的代碼邏輯閱讀,以及增加耗時信息打印。最終確定,耗時的代碼在 make_perfect 這個函數中,這個函數是對【輸入的字符串列表】生成一個【完美 Hash 表】。

void PrebuiltObjC::generateHashTables(RuntimeState& state)
{
    // Write out the class table
    writeObjCDataStructHashTable(state, PrebuiltObjC::ObjCStructKind::classes, objcImages, classesHashTable, duplicateSharedCacheClassMap, classMap);
    // Write out the protocol table
    writeObjCDataStructHashTable(state, PrebuiltObjC::ObjCStructKind::protocols, objcImages, protocolsHashTable, duplicateSharedCacheClassMap, protocolMap);
    // If we have closure selectors, we need to make a hash table for them.
    if ( !closureSelectorStrings.empty() ) {
        objc::PerfectHash phash;
        objc::PerfectHash::make_perfect(closureSelectorStrings, phash);
        size_t size = ObjCStringTable::size(phash);
        selectorsHashTable.resize(size);
        //printf("Selector table size: %lld\n", size);
        selectorStringTable = (ObjCStringTable*)selectorsHashTable.begin();
        selectorStringTable->write(phash, closureSelectorMap.array());
    }
}

繼續深入了解 make_perfect 這個函數的實現。

Perfect Hash

通過對研讀代碼邏輯和耗時分析,最終定位到耗時代碼部分為PerfectHash.cpp 中 findhash 函數,這個函數也是 完美散列函數 的核心邏輯。

  這里涉及到了一個概念PerfectHash,PerfectHash 的核心是完美散列函數,我們看下維基百科的解釋:

https://zh.wikipedia.org/wiki/%E5%AE%8C%E7%BE%8E%E6%95%A3%E5%88%97

對集合S的完美散列函數是一個將S的每個元素映射到一系列無沖突的整數的哈希函數

簡單來講 完美散列函數 是【對輸入的字符串列表】【為每個字符串生成一個唯一整數】。

for (si=1; ; ++si)
    {
        ub4 rslinit;
        /* Try to find distinct (A,B) for all keys */
        *salt = si * 0x9e3779b97f4a7c13LL; /* golden ratio (arbitrary value) */
        initnorm(keys, *alen, blen, smax, *salt);
        rslinit = inittab(tabb, keys, FALSE);
        if (rslinit == 0)
        {
            /* didn't find distinct (a,b) */
            if (++bad_initkey >= RETRY_INITKEY)
            {
                /* Try to put more bits in (A,B) to make distinct (A,B) more likely */
                if (*alen < maxalen)
                {
                    *alen *= 2;
                }
                else if (blen < smax)
                {
                    blen *= 2;
                    tabb.resize(blen);
                    tabq.resize(blen+1);
                }
                bad_initkey = 0;
                bad_perfect = 0;
            }
            continue;                             /* two keys have same (a,b) pair */
        }
        /* Given distinct (A,B) for all keys, build a perfect hash */
        if (!perfect(tabb, tabh, tabq, smax, scramble, (ub4)keys.count()))
        {
            if (++bad_perfect >= RETRY_PERFECT)
            {
                if (blen < smax)
                {
                    blen *= 2;
                    tabb.resize(blen);
                    tabq.resize(blen+1);
                    --si;               /* we know this salt got distinct (A,B) */
                }
                else
                {
                    return false;
                }
                bad_perfect = 0;
            }
            continue;
        }
        break;
    }

此時通過對比新老版本的數據(使用 dyld 分別運行新老版本的可執行文件對比打印的日志),發現:

  • 老版本循環了 31 次成功生成 HashTable
  • 新版本循環了 92 次成功生成 HashTable

至此,我們距離成功已經非常接近了,于是進一步研讀 dyld 源碼和增加了更多打印信息代碼,最終找到了相互沖突的函數字符串名稱。

/*
 * put keys in tabb according to key->b_k
 * check if the initial hash might work
 */
static int inittab_ts(dyld3::OverflowSafeArray<bstuff>& tabb, dyld3::OverflowSafeArray<key>& keys, int complete, int si)
// bstuff   *tabb;                     /* output, list of keys with b for (a,b) */
// ub4       blen;                                            /* length of tabb */
// key      *keys;                               /* list of keys already hashed */
// int       complete;        /* TRUE means to complete init despite collisions */
{
  int  nocollision = TRUE;
  ub4 i;
  memset((void *)tabb.begin(), 0, (size_t)(sizeof(bstuff)*tabb.maxCount()));
  /* Two keys with the same (a,b) guarantees a collision */
  for (i = 0; i < keys.count(); i++) {
    key *mykey = &keys[i];
    key *otherkey;
    for (otherkey=tabb[mykey->b_k].list_b;
     otherkey;
     otherkey=otherkey->nextb_k)
    {
      if (mykey->a_k == otherkey->a_k)
      {
          // 打印沖突的字符串
        std::cout << mykey->name_k << " and " << otherkey->name_k << " has the same ak " << otherkey->a_k << " si is " << si << std::endl;
        nocollision = FALSE;
          /* 屏蔽此處代碼,有沖突的情況下,繼續執行,便于打印所有的沖突
    if (!complete)
      return FALSE;
           */
      }
    }
    ++tabb[mykey->b_k].listlen_b;
    mykey->nextb_k = tabb[mykey->b_k].list_b;
    tabb[mykey->b_k].list_b = mykey;
  }
  /* no two keys have the same (a,b) pair */
  return nocollision;
}

根據以上信息,我們已經了解到在Building Closure階段中,可能存在字符串的 Hash 碰撞 引發循環次數大幅增加,進而引發了啟動耗時暴增。

在經過 dyld 調試的耗時數據、構建出包后驗證的數據驗證后,通過避免 Hash 碰撞,我們完成了啟動時長的優化。

向前一步

其實從打印的沖突函數名稱來看,歷史代碼中已經存在了 Hash 碰撞 的現象。

猜想,如果我們解決了所有的字符串的 Hash 碰撞,豈不是不僅可以修復啟動耗時異常上升的問題,還可以進一步降低啟動耗時,提高啟動速度?

于是我們對每個有碰撞的函數名稱進行修改,經過出包驗證,結果與我們猜測的一致,啟動耗時有明顯的下降。

數據為 PC 電腦端運行 dyld 生成 BuildingClosure 的耗時數據,非手機端數據數據為 PC 電腦端運行 dyld 生成 BuildingClosure 的耗時數據,非手機端數據


四、總結

我們探索了 BuildingClosure 的生成過程,發現在Building Closure階段中,可能存在字符串的 Hash 碰撞 引發循環次數大幅增加,進而引發了啟動耗時暴增,進而導致啟動耗時的大幅增加。

我們也發現,Building Closure Hash碰撞相關的啟動耗時,其實與項目配置、編譯環境、打包腳本等均無任何關系,就只是存在了字符串的Hash 碰撞 ,才引發循環次數大幅增加,進而導致啟動時長增加。

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

2023-08-30 18:49:05

2024-09-03 16:09:59

2023-05-10 18:34:49

推薦價格體驗優化UV

2023-07-19 22:17:21

Android資源優化

2022-11-14 14:53:14

架構技術編輯工具

2021-11-23 10:25:35

性能優化iOS App 啟動優化

2024-08-13 15:26:44

2019-12-13 10:25:08

Android性能優化啟動優化

2023-03-30 18:39:36

2025-11-11 01:55:00

2022-12-12 18:56:04

2023-08-21 19:37:21

得物DGraph引擎

2023-04-28 18:37:38

直播低延遲探索

2023-10-09 18:35:37

得物Redis架構

2025-03-13 06:48:22

2017-01-19 19:07:28

iOS進階性能優化

2019-09-25 08:03:21

Android加速Google

2022-12-14 18:40:04

得物染色環境

2024-12-03 11:12:47

2023-02-08 18:33:49

SRE探索業務
點贊
收藏

51CTO技術棧公眾號

国产日韩一级片| 中文字幕在线成人| 青青草成人在线| 欧美女同在线观看| 色综合久久久久久| 成人羞羞网站入口| 91麻豆蜜桃一区二区三区| 北条麻妃一区二区三区中文字幕| 欧美精品久久久久久久自慰| 91禁在线观看| av中文一区| 色婷婷综合在线| 国产成人精品福利一区二区三区 | 日本精品网站| www.66久久| 美乳少妇欧美精品| 国产精品一区二区小说| 成人在线免费观看黄色| 亚洲精品久久久| 91久久奴性调教| 麻豆av福利av久久av| 久久精品人妻一区二区三区| 国产高清视频一区二区| 国产精品素人视频| 国产精品96久久久久久| 国产三级国产精品| 白浆在线视频| 成人国产电影网| 久久久久免费视频| 动漫av免费观看| 狠狠躁日日躁夜夜躁av| 一区在线播放| 亚洲电影成人av99爱色| 免费无码毛片一区二三区| www.污视频| 影音国产精品| 久久手机精品视频| 免费人成视频在线播放| 日本孕妇大胆孕交无码| 成人综合激情网| 久久久综合av| 欧美老熟妇一区二区三区| 久久99成人| 亚洲va国产天堂va久久en| 国产精品久久精品视| 国产情侣自拍av| 精品一区三区| 欧美日韩一区二区在线观看| 亚洲综合五月天| 国产精品永久久久久久久久久| 国产精品成人av| 欧美成人性战久久| 国产精品丝袜久久久久久消防器材 | 亚洲精品国产首次亮相| 日韩视频免费在线| 一本一本久久a久久| 久久国产精品免费一区二区三区| 欧美午夜精品一区二区蜜桃| 国产精品一区在线免费观看| 黄色一级a毛片| 国产成人在线电影| 97久久精品人搡人人玩| xxxxx在线观看| 91精品国产66| 亚洲电影一区二区三区| 欧美一区二区高清在线观看| 亚洲中文一区二区三区| 红桃视频欧美| 中文字幕精品网| 一二三四国产精品| eeuss鲁片一区二区三区| 疯狂欧美牲乱大交777| 在线视频91| 四虎永久在线观看| 91网址在线看| 日本一区二区不卡高清更新| 成人在线视频成人| 成人av免费在线播放| 国产区一区二区三区| 一级片aaaa| 国产乱码精品一区二区三区忘忧草 | 久久国产精品99久久久久久丝袜| 黄色片视频免费| 亚洲精品一区二区在线看| 精品国产免费一区二区三区四区 | 日韩av网站大全| 日本激情视频在线播放| a级片在线免费| 中文字幕一区二区三区不卡| 精品国产一区二区三区麻豆免费观看完整版| 亚洲无码精品一区二区三区| 国产精品久久| 国产91对白在线播放| 久久这里只有精品国产| 久久久久国产精品| 久久久久久69| 中文字幕有码无码人妻av蜜桃| 国产欧美日韩一级| 欧美国产精品日韩| 黄色免费看视频| 精品无码免费视频| 国产精品人人爽人人做我的可爱| 日韩美女免费线视频| 激情五月少妇a| 91综合网人人| 国产精品99在线观看| 国产视频精品xxxx| 无套白嫩进入乌克兰美女| 性chinese极品按摩| 日本免费在线观看| 99精品一区二区| av在线不卡观看| 国产特黄一级片| 久久毛片高清国产| 欧美一级二级三级| 成人在线高清免费| 制服丝袜亚洲色图| 色噜噜狠狠一区二区三区狼国成人| 日韩一区二区三区免费| 欧美专区日韩专区| 黄色一级片免费的| 精品国产三级| 这里只有精品丝袜| 91视频免费网址| 国产精品538一区二区在线| 日韩动漫在线观看| 日本免费在线观看| 日本韩国欧美一区二区三区| 国产+高潮+白浆+无码| 一本一道久久a久久精品蜜桃| 国产成人精品免高潮费视频| 欧美 日韩 国产 成人 在线| 99久久免费精品| 400部精品国偷自产在线观看| 日本另类视频| 亚洲美女动态图120秒| 波多野结衣 在线| 郴州新闻综合频道在线直播| 性欧美xxxx| 国产综合在线播放| 一个色在线综合| 99精品在线免费视频| 午夜激情成人网| 日韩成人中文字幕| 精品91久久久| 免费观看在线色综合| 亚洲最大成人在线| 色网站在线免费观看| 日本一区二区三区dvd视频在线| 亚洲欧洲一区二区在线观看| 欧美伦理免费在线| 色婷婷av一区二区三区大白胸| 亚洲av成人无码一二三在线观看| 成人免费a**址| 国产精品国产福利国产秒拍| 国内精品偷拍视频| 久久影视一区二区| 黄在线观看网站| 日韩欧美中文字幕在线视频 | 一区二区三区四区毛片| 欧美激情理论| 亚洲xxxx3d| 日本资源在线| 亚洲国产一区二区三区四区| 美国黄色特级片| 青青青爽久久午夜综合久久午夜| 国产在线精品自拍| www.看毛片| 一区二区理论电影在线观看| 久久久久亚洲av成人网人人软件| 亚洲黄页网站| 久久999免费视频| 波多野结衣影片| 国产精品国产三级国产a| 亚洲一区精品视频在线观看| 这里只有精品在线| 国产精品露出视频| 日韩精品99| 亚洲高清久久网| 国产在线观看黄色| 成人激情小说网站| 黄色片一级视频| 99精品综合| 国产精品国产精品国产专区蜜臀ah | 欧美日韩麻豆| 色综合久久久888| 午夜18视频在线观看| 亚洲伦理在线精品| 国模吧无码一区二区三区| 国产真实有声精品录音| 97精品久久久| 国产一区精品| 一本色道久久综合亚洲91 | 人人爽人人爽av| 亚洲人成久久| 北条麻妃高清一区| 成人性生交大片免费网站 | 国产精品视频精品视频| 神马久久高清| 亚洲国产综合91精品麻豆 | 成人免费黄色在线| 国产精品久久久久9999小说| 欧美成熟视频| 亚洲综合大片69999| 中文在线аv在线| 亚洲精品久久久久久久久久久久久 | 可以免费看不卡的av网站| 国产精品区一区| 成人午夜sm精品久久久久久久| 久久99青青精品免费观看| 国产在线观看高清视频| 精品国产凹凸成av人网站| 久久久久精彩视频| 欧美国产激情一区二区三区蜜月| 先锋资源在线视频| 久久国产欧美日韩精品| 伊人久久大香线蕉午夜av| 久久1电影院| 91国语精品自产拍在线观看性色| 欧美一级淫片aaaaaa| 欧美日韩电影在线播放| 国产日产精品一区二区三区的介绍| 免费成人在线视频观看| 国产深夜男女无套内射| 66视频精品| 亚洲人久久久| 神马久久一区二区三区| 久久99精品久久久久久青青日本| 国产精品中文| 成人久久久久久| 伊人电影在线观看| 精品剧情在线观看| aaaa一级片| 5月丁香婷婷综合| 亚洲天堂一二三| 在线视频国产一区| 中文在线第一页| 国产精品丝袜一区| a级片在线观看| 久久免费美女视频| 国产精品无码午夜福利| 久久精品国产99久久6| 亚洲国产精品毛片av不卡在线| 在线一区欧美| 亚洲在线欧美| 日韩成人免费| 91久久精品国产91久久性色tv| 51漫画成人app入口| 欧美黑人视频一区| 久久一卡二卡| 久久久亚洲国产| av资源网在线播放| 91高清在线免费观看| 九色porny丨国产首页在线| 中文字幕日韩av| 国产视频二区在线观看| 91精品国产欧美日韩| 日韩欧美一区二区一幕| 亚洲不卡av一区二区三区| 欧美成人aaaaⅴ片在线看| 国产精品国产a| 免费精品在线视频| 亚洲精选免费视频| 精品无码人妻一区二区三| 亚洲一区二区三区视频在线播放| 久久亚洲成人av| 欧美丝袜一区二区| 欧美交换国产一区内射| 亚洲综合无码一区二区| 日本熟伦人妇xxxx| 色欧美日韩亚洲| 91av久久久| 欧美精品一区二区在线播放| 欧美扣逼视频| 亚洲精品在线免费播放| 亚洲 小说区 图片区 都市| 亚洲午夜色婷婷在线| 午夜精品久久久久久久99热黄桃| 精品国产免费久久| 男人av在线| 久久久精品一区| 国产视频网址在线| 久久天天躁狠狠躁夜夜躁| 波多一区二区| 国产成人一区二区在线| 国产精品视频一区二区三区| 国内精品视频在线播放| 成人三级视频| 国产精品videossex国产高清| 久久一区二区三区喷水| 嫩草影院中文字幕| 日本亚洲最大的色成网站www| 激情久久综合网| 九一九一国产精品| 无限资源日本好片| 成人国产在线观看| 亚洲AV成人无码网站天堂久久| 一二三四区精品视频| 免费黄色一级大片| 精品99999| av二区在线| 中文字幕国产日韩| 丁香花在线观看完整版电影| 国产精品女人久久久久久| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲日本无吗高清不卡| 亚洲精华国产欧美| 成 人 黄 色 小说网站 s色| 99国产一区二区三精品乱码| 成年人二级毛片| **欧美大码日韩| 私库av在线播放| 亚洲香肠在线观看| 7777久久亚洲中文字幕| 亚洲人成在线电影| 成人免费视频| 91爱视频在线| 日韩欧美久久| gogogo免费高清日本写真| 在线一区电影| 羞羞的视频在线| 国产日韩亚洲欧美综合| 亚洲国产精品一区二区久久hs| 五月天一区二区| 亚洲黄色免费观看| 欧美第一区第二区| 黄色一级a毛片| 欧美另类在线观看| 96视频在线观看欧美| 91久久国产自产拍夜夜嗨| 日韩影院二区| 日本成人中文字幕在线| 91麻豆国产福利精品| 日本少妇激情视频| 欧美本精品男人aⅴ天堂| 二区三区在线观看| 海角国产乱辈乱精品视频| 亚洲图片小说区| 一本色道久久综合亚洲精品婷婷| 日韩精品电影在线观看| 久久久久久久久久毛片| 国产视频一区二区在线| 国产免费一区二区三区四区五区| 日韩精品中文字幕在线观看 | 亚洲激情一二三区| 国产亚洲精品久久久久久打不开| 欧美一区二区在线播放| 毛片av在线| 97超碰国产精品女人人人爽| 国产乱人伦丫前精品视频| 视频一区二区综合| 黄色欧美日韩| 精品国产乱码久久久久夜深人妻| 一区二区三区中文在线| 亚洲国产中文字幕在线| 国产亚洲人成a一在线v站| 成人看片网页| 亚洲一区二区三区精品视频| 另类小说欧美激情| 我要看黄色一级片| 日韩精品中文字幕在线不卡尤物| 日韩影视在线| 激情久久av| 久久字幕精品一区| 后入内射无码人妻一区| 欧美高清性hdvideosex| 毛片免费在线观看| 国产精品第二页| 亚洲成人国产| 天堂www中文在线资源| 日本韩国一区二区三区视频| 三级外国片在线观看视频| 51午夜精品| 久久电影一区| 97中文字幕在线观看| 精品久久久久久久久久| 国产高清视频在线| 91免费看片网站| 欧美色图在线播放| 伊人色在线观看| 亚洲高清久久久| 搞黄视频免费在线观看| 91最新在线免费观看| 99热这里只有成人精品国产| 男人的天堂av网| 色国产综合视频| 国产在线更新| 国产一区二中文字幕在线看| 欧美成人一品| 波多野吉衣中文字幕| 欧美夫妻性生活| 超碰在线资源| 亚洲精品美女久久7777777| 风间由美一区二区三区在线观看| 四虎影院中文字幕| 亚洲国产成人精品一区二区| 国产电影一区二区三区爱妃记| 小泽玛利亚av在线| 国产精品18久久久久久久久| 天堂网av手机版|