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

一款可以讓大型iOS工程編譯速度提升50%的工具

開發 開發工具
cocoapods-hmap-prebuilt 是美團平臺迭代組自研的一款 cocoapods 插件,以 Header Map 技術 為基礎,進一步提升代碼的編譯速度,完善頭文件的搜索機制。

 

cocoapods-hmap-prebuilt 是什么?

cocoapods-hmap-prebuilt 是美團平臺迭代組自研的一款 cocoapods 插件,以 Header Map 技術 為基礎,進一步提升代碼的編譯速度,完善頭文件的搜索機制。

雖然以二進制組件的方式構建 App 是 HPX (美團移動端統一持續集成/交付平臺)的主流解決方案,但在某些場景下(Profile、Address/Thread/UB/Coverage Sanitizer、App 級別靜態檢查、ObjC 方法調用兼容性檢查等等),我們的構建工作還是需要以全源碼編譯的方式進行;而且在實際開發過程中,大多是以源碼的方式進行開發,所以我們將實驗對象設置為基于全源碼編譯的流程。

廢話不多說,我們來看看它的實際使用效果!

總的來說,以美團和大眾點評的全源碼編譯流程為實驗對象的前提下,cocoapods-hmap-prebuilt 插件能將總鏈路提升 45% 以上的速度,在 Xcode 打包環節上能提升 50% 以上的速度,是不是有點動心了?

為了更好的理解這個插件的價值和功能,我們不妨先看一下當前的工程中存在的問題。

為什么現有的項目不夠好?

目前,美團內的 App 都是基于 CocoaPods 做包管理方面的工作,所以在實際的開發過程中,CocoaPods 會在 Pods/Header/ 目錄下添加組件名目錄和頭文件軟鏈,類似于下面的形式:

  1. /Users/sketchk/Desktop/MyApp/Pods 
  2. └── Headers 
  3.     ├── Private 
  4.     │   └── AFNetworking 
  5.     │       ├── AFHTTPRequestOperation.h -> ./XXX/AFHTTPRequestOperation.h 
  6.     │       ├── AFHTTPRequestOperationManager.h -> ./XXX/AFHTTPRequestOperationManager.h 
  7.     │       ├── ... 
  8.     │       └── UIRefreshControl+AFNetworking.h -> ./XXX/UIRefreshControl+AFNetworking.h 
  9.     └── Public 
  10.         └── AFNetworking 
  11.             ├── AFHTTPRequestOperation.h -> ./XXX/AFHTTPRequestOperation.h 
  12.             ├── AFHTTPRequestOperationManager.h -> ./XXX/AFHTTPRequestOperationManager.h 
  13.             ├── ... 
  14.             └── UIRefreshControl+AFNetworking.h -> ./XXX/UIRefreshControl+AFNetworking.h 

也正是通過這樣的目錄結構和軟鏈,CocoaPods 得以在 Header Search Path 中添加如下的參數,使得預編譯環節順利進行。

  1. $(inherited) 
  2. ${PODS_ROOT}/Headers/Private 
  3. ${PODS_ROOT}/Headers/Private/AFNetworking 
  4. ${PODS_ROOT}/Headers/Public 
  5. ${PODS_ROOT}/Headers/Public/AFNetworking 

雖然這種構建 Search Path 的方式解決了預編譯的問題,但在某些項目中,例如多達 400+ 組件的巨型項目中,會造成以下幾點問題:

  1. -I 
  2. ${PODS_ROOT}/Headers/Private 

想解決上述的問題,好一點的情況下,可能會浪費 1 個小時,而不好的情況,就是讓有風險的代碼上線了,你說工程師會不會因此而感到頭疼?

Header Map 是個啥?

還好 cocoapods-hmap-prebuilt 的出現,讓這些問題變成了歷史,不過要想理解它為什么能解決這些問題,我們得先理解一下什么是 Header Map。

Header Map 其實是一組頭文件信息映射表!

為了更直觀的理解 Header Map,我們可以在 Build Setting 中開啟 Use Header Map 選項,真實的體驗一下它。

然后在 Build Log 里獲取相應組件里對應文件的編譯命令,并在最后加上 -v 參數,來查看其運行的秘密:

  1. $ clang <list of arguments> -c some-file.m -o some-file.o -v 

在 console 的輸出內容中,我們會發現一段有意思的內容:

通過上面的圖,我們可以看到編譯器將尋找頭文件的順序和對應路徑展示出來了,而在這些路徑中,我們看到了一些陌生的東西,即后綴名為 .hmap 的文件,后面還有個括號寫著 headermap。

沒錯!它就是 Header Map 的實體。

此時 Clang 已經在剛才提到的 hmap 文件里塞入了一份頭文件名和頭文件路徑的映射表,不過它是一種二進制格式的文件,為了驗證這個的說法,我們可以通過 milend 編寫的 hmap 工具 來查其內容。

在執行相關命令(即 hmap print )后,我們可以發現這些 hmap 里保存的信息結構大致如下, 類似于一個 Key-Value 的形式,Key 值是頭文件的名稱,Value 是頭文件的實際物理路徑:

需要注意,映射表的鍵值內容會隨著使用場景產生不同的變化,例如頭文件引用是在 "..." 的形式下,還是 <...> 的形式下,又或是在 Build Phase 里 Header 的配置情況。例如,你將頭文件設置為 Public 的時候,在某些 hmap 中,它的 Key 值就為 PodA/ClassA ,而將其設置為 project 的時候,它的 Key 值可能就是 ClassA ,而配置這些信息的地方,如下圖所示:

至此我想你應該了解到 Header Map 到底是個什么東西了。

當然這種技術也不是一個什么新鮮事兒,在 Facebook 的buck工具中也提供了類似的東西,只不過文件類型變成了 HeaderMap.java 的樣子。

此時,我估計你可能并不會對 buck 產生太多的興趣,而是開始思考上一張圖中 Headers 的 Public、Private、Project 到底代表著什么意思,好像很多同學從來沒怎么關注過,以及為什么它會影響 hmap 里的內容?

Public,Private,Project 是個啥?

在 Apple 官方的 Xcode Help - What are build phases? 文檔中,我們可以看到如下的一段解釋:

  1. Associates publicprivate, or project header files with the target. Public and private headers define API intended for use by other clients, and are copied into a product for installation. For example, public and private headers in a framework target are copied into Headers and PrivateHeaders subfolders within a product. Project headers define API used and built by a target, but not copied into a product. This phase can be used once per target. 

總的來說,我們可以知道一點,就是 Build Phases - Headers 中提到 Public 和 Private 是指可以供外界使用的頭文件,而 Project 中的頭文件是不對外使用的,也不會放在最終的產物中。

如果你繼續翻閱一些資料,例如 StackOverflow - Xcode: Copy Headers: Public vs. Private vs. Project? 和 StackOverflow - Understanding Xcode’s Copy Headers phase ,你會發現在早期 Xcode Help 的 Project Editor 章節里,有一段名為 Setting the Role of a Header File 的段落,里面詳細記載了三個類型的區別。

Public: The interface is finalized and meant to be used by your product’s clients. A public header is included in the product as readable source code without restriction. Private : The interface isn’t intended for your clients or it’s in early stages of development. A private header is included in the product, but it’s marked “private”. Thus the symbols are visible to all clients, but clients should understand that they’re not supposed to use them. Project : The interface is for use only by implementation files in the current project. A project header is not included in the target, except in object code. The symbols are not visible to clients at all, only to you.

至此,我們應該能夠徹底了解了 Public、Private、Project 的區別。簡而言之,Public 還是通常意義上的 Public,Private 則代表 In Progress 的含義,至于 Project 才是通常意義上的 Private 含義。

此時,你會不會聯想到 CocoaPods 中 Podspec 的 Syntax 里還有 public_header_files 和 private_header_files 兩個字段,它們的真實含義是否和 Xcode 里的概念沖突呢?

這里我們仔細閱讀一下 官方文檔的解釋 ,尤其是 private_header_files 字段。

我們可以看到, private_header_files 在這里的含義是說,它本身是相對于 Public 而言的,這些頭文件本義是不希望暴露給用戶使用的,而且也不會產生相關文檔,但是在構建的時候,會出現在最終產物中,只有既沒有被 Public 和 Private 標注的頭文件,才會被認為是真正的私有頭文件,且不出現在最終的產物里。

看起來,CocoaPods 對于 Public 和 Private 的官方解釋是和 Xcode 中的描述一致的,兩處的 Private 并非我們通常理解的 Private,它的本意更應該是開發者準備對外開放,但又沒完全 Ready 的頭文件,更像一個 In Progress 的含義。

這一塊是不是讓你有點大跌眼鏡?那么,在現實世界中,我們是否正確的使用了它們呢?

為什么用原生的 hmap 不能改善編譯速度?

前面我們介紹了 hmap 是什么,以及怎么開啟它(啟用 Build Setting 中的 Use Header Map 選項),也介紹了一些影響生成 hmap 的因素(Public、Private、Project)。

那是不是我只要開啟 Xcode 提供的 Use Header Map 就可以提升編譯速度了呢?

很可惜,答案是否定的!

至于原因,我們就從下面的例子開始說起,假設我們有一個基于 CocoaPods 構建的全源碼工程項目,它的整體結構如下:

  • 首先,Host 和 Pod 是我們的兩個 Project,Pods 下的 Target 的產物類型為 Static Library。
  • 其次,Host 底下會有一個同名的 Target,而 Pods 目錄下會有 n+1 個 Target,其中 n 取決于你依賴的組件數量,而 1 是一個名為 Pods-XXX 的 Target,最后,Pods-XXX 這個 Target 的產物會被 Host 里的 Target 所依賴。

整個結構看起來如下所示:

當構建的產物類型為 Static Library 的時候,CocoaPods 在創建頭文件產物過程中,它的邏輯大致如下:

  • 不論 podspec 里如何設置 public_header_files 和 private_header_files ,相應的頭文件都會被設置為 Project 類型。
  • 在 Pods/Headers/Public 中會保存所有被聲明為 public_header_files 的頭文件。
  • 在 Pods/Headers/Private 中會保存所有頭文件,不論是 public_header_files 或者 private_header_files 描述到,還是那些未被描述的,這個目錄下是當前組件的所有頭文件全集。
  • 如果 podspec 里未標注 Public 和 Private 的時候, Pods/Headers/Public 和 Pods/Headers/Private 的內容一樣且會包含所有頭文件。

正是由于這種機制,會導致一些有意思的問題發生。

  • 首先,由于所有頭文件都被當做最終產物保留下來,在結合 Header Search Path 里 Pods/Headers/Private 路徑的存在,我們完全可以引用到其他組件里的私有頭文件,例如我只要使用 #import <SomePod/Private_Header.h> 的方式,就會命中私有文件的匹配路徑。
  • 其次,就是在 Static Library 的狀況下,一旦我們開啟了 Use Header Map,結合組件里所有頭文件的類型為 Project 的情況,這個 hmap 里只會包含 #import "ClassA.h" 的鍵值引用,也就是說只有 #import "ClassA.h" 的方式才會命中 hmap 的策略,否則都將通過 Header Search Path 尋找其相關路徑,例如下圖中的 PodB,在其 build 的過程中,Xcode 會為 PodB 生成 5 個 hmap 文件,也就是說這 5 個文件只會在編譯 PodB 中使用,其中 PodB 會依賴 PodA 的一些頭文件,但由于 PodA 中的頭文件都是 Project 類型的,所以其在 hmap 里的 Key 全部為 ClassA.h ,也就是說我們只能以 #import "ClassA.h" 的方式引入。

而我們也知道,在引用其他組件的時候,通常都會采用 #import 的方式引入。至于為什么會用這種方式,一方面是這種寫法會明確頭文件的由來,避免問題,另一方面也是這種方式可以讓我們在是否開啟 clang module 中隨意切換。當然,還有一點就是Apple 在 WWDC 里曾經不止一次建議開發者使用這種方式來引入頭文件。

接著上面的話題來說,所以說在 Static Library 的情況下且以 #import <A/A.h> 這種標準方式引入頭文件時,開啟 Use Header Map 選項并不會幫我們提升編譯速度。

但真的就沒有辦法使用 Header Map 了么?

cocoapods-hmap-prebuilt 誕生了

當然,總是有辦法解決的,我們完全可以自己動手做一個基于 CocoaPods 規則下的 hmap 文件,正是基于這個想法,美團自研的 cocoapods-hmap-prebuilt 插件誕生了!

它的核心功能并不多,大概有以下幾點:

組件名/頭文件名

聽起來可能有點繞,內容也有點多,不過這些你都不用關心,你只需要通過以下 2 個步驟就能將其使用起來:

  1. 在 Gemfile 里聲明插件。
  2. 在 Podfile 里使用插件。
  1. // this is part of Gemfile 
  2. source 'http://sakgems.sankuai.com/' do 
  3.   gem 'cocoapods-hmap-prebuilt' 
  4.   gem 'XXX' 
  5.   ... 
  6. end 
  7.  
  8. // this is part of Podfile 
  9. target 'XXX' do 
  10.   plugin 'cocoapods-hmap-prebuilt' 
  11.   pod 'XXX' 
  12.   ... 
  13. end 

除此之外,為了拓展其實用性,我們還提供了頭文件補丁(解決重名頭文件的定向選取)和環境變量注入(無侵入的在其他系統中使用)的能力,便于其在不同場景下的使用。

總結

至此,關于 cocoapods-hmap-prebuilt 的介紹就要結束了。

回看整個故事的開始,Header Map 是我在研究 Swift 和 Objective-C 混編過程中發現的一個很小的知識點,而且 Xcode 自身就實現了一套基于 Header Map 的功能,在實際的使用過程中,它的表現并不理想。

但幸運的是,在后續的探索的過程中,我們發現了為什么 Xcode 的 Header Map 沒有生效,以及為什么它與 CocoaPods 出現了不兼容的情況,雖然它的原理并不復雜,核心點就是將文件查找和讀取等 IO 操作編變成了內存讀取操作,但結合實際的業務場景,我們發現它的收益是十分可觀的。

或許這是在提醒我們,要永遠對技術保持一顆好奇的心!

其實,利用 Clang Module 技術也可以解決本文一開始提到的幾個問題,但它并不在這篇文章的討論范圍中,如果你對 Clang Module 或者對 Swift 與 Objective-C 混編感興趣,歡迎閱讀參考文檔中的 《從預編譯的角度理解 Swift 與 Objective-C 及混編機制》一文,以了解更多的詳細信息。

 

 

責任編輯:張燕妮 來源: 美團技術團隊
相關推薦

2020-07-09 10:02:27

Python開發工具

2015-09-23 17:39:52

Github開源工具

2015-09-28 09:56:17

Github開源工具編程

2021-11-01 05:53:08

Doldrums逆向工程分析工具安全工具

2025-03-10 00:00:50

2019-03-28 14:22:26

工具代碼開發

2025-04-10 09:10:00

.NET開源Windows

2014-06-20 10:32:42

APP上癮設計

2021-02-16 10:58:50

ScreenLinux命令

2021-01-27 13:16:39

ScreenLinux命令

2013-10-15 09:26:12

2021-07-09 10:14:05

IP工具命令

2020-12-22 10:30:47

Nagios工具監控

2011-05-10 09:55:14

2024-02-23 08:13:25

Excalidraw白板工具開源

2021-03-25 16:15:24

SQL工具慢查詢

2025-01-22 16:13:07

2011-01-11 13:45:20

2025-04-07 08:10:00

2019-11-11 08:00:00

Doppler遠程監測工具Linux
點贊
收藏

51CTO技術棧公眾號

国产成人一区二区| 日韩电影网在线| 最近中文字幕免费mv| 精品二区在线观看| 亚洲福利专区| 亚洲色图美腿丝袜| 国产日韩欧美久久| 免费在线中文字幕| 久久蜜桃香蕉精品一区二区三区| 国产美女精品视频免费观看| 欧美日韩在线视频免费播放| 亚瑟一区二区三区四区| 91精品国产入口在线| 黄色一级片播放| av片在线观看网站| 久久久久久久一区| 亚洲自拍高清视频网站| 国产成人无码专区| 国产精品va| 中文字幕欧美日韩| 性囗交免费视频观看| jizz欧美| 日韩欧美在线观看视频| 伊人久久大香线蕉午夜av| 天天射天天操天天干| 国产一区二区三区在线观看免费视频| 国产91精品视频在线观看| 日本高清一二三区| 国产一区99| 日韩电视剧在线观看免费网站| 无码国产精品一区二区高潮| 欧美日韩免费观看视频| 图片区小说区区亚洲影院| 大桥未久一区二区| av大片在线播放| 91毛片在线观看| 国产精品一区而去| 国产黄色小视频在线观看| 久久精品国产秦先生| 国产精品久久久久久影视| 国产成人啪精品午夜在线观看| 一区二区三区网站| 日韩中文综合网| 黄色片网站免费| 亚洲资源网你懂的| 日韩激情视频在线播放| 182在线视频| 国产精品17p| 欧美第一区第二区| 精产国品一区二区三区| 精品久久亚洲| 日韩午夜小视频| 手机在线观看日韩av| 成人亚洲精品| 欧美一激情一区二区三区| 超碰成人在线播放| 日韩五码电影| 8v天堂国产在线一区二区| 一区二区在线免费看| 黄色精品视频网站| 91精品国产综合久久久蜜臀粉嫩| 天堂在线中文在线| 91麻豆精品国产综合久久久 | 国产精品8888| av免费在线观看网站| 一区二区三区在线视频观看58 | 国产在线更新| 一区二区三区欧美视频| 日韩亚洲欧美视频| 午夜影院在线播放| 色网综合在线观看| 激情五月俺来也| 91九色成人| 精品第一国产综合精品aⅴ| 91精品啪在线观看国产| 乱亲女h秽乱长久久久| 亚洲欧美日韩精品久久奇米色影视| 中文字幕人妻一区二区| 日韩免费特黄一二三区| 久久人人爽人人爽爽久久 | 欧美视频在线观看 亚洲欧| 欧美极品欧美精品欧美图片| 日本成人福利| 日韩一区二区三区视频在线| 亚洲图片综合网| 九一精品国产| 久久亚洲精品国产亚洲老地址| 久久久久成人网站| 久久亚洲一区| 亚洲最大av在线| 欧美性孕妇孕交| 中文字幕在线观看一区| 精品久久久久久无码中文野结衣| 免费福利视频一区二区三区| 6080午夜不卡| 国产美女喷水视频| 欧美jizz| 9.1国产丝袜在线观看 | 欧美成人手机视频| 久久久水蜜桃av免费网站| 国产日韩在线一区| 头脑特工队2在线播放| 国产精品久久久久毛片软件| 国产欧美日韩网站| 色8久久久久| 亚洲欧美国产一区二区三区| 极品魔鬼身材女神啪啪精品| 久久久久免费| 国产一区二区三区免费不卡| 免费av毛片在线看| 五月天一区二区三区| 国产免费中文字幕| 宅男在线一区| 国语自产精品视频在线看一大j8 | 欧洲精品视频在线| 欧美亚洲大片| 亚洲福利在线播放| 在线看的片片片免费| 久久一区中文字幕| 高清不卡日本v二区在线| www.91在线| 色综合天天综合网国产成人综合天| 三级黄色片播放| 91欧美国产| 国产精品久久久久久久久| 神宫寺奈绪一区二区三区| 亚洲人成影院在线观看| 久草福利视频在线| 蜜桃一区二区三区| 777精品视频| 人妻偷人精品一区二区三区| 亚洲欧美另类久久久精品2019| 亚洲视频在线观看一区二区三区| 久久亚洲黄色| 性欧美暴力猛交69hd| 性色av蜜臀av| 一区二区在线免费| 伊人免费视频二| 久久人体视频| 国产日韩欧美视频在线| 成年人视频网站在线| 在线观看视频91| 国产精品无码一区二区三区| 久久青草久久| 日产国产精品精品a∨| 亚洲综合电影| 一区二区在线视频| 伊人成人在线观看| 国产精品夫妻自拍| 午夜啪啪小视频| 久久久久电影| 亚洲一区二区在线| 顶级网黄在线播放| 日韩无一区二区| 欧美黄色免费看| 成人午夜私人影院| 日韩欧美国产综合在线| 久久资源综合| 国产精品99蜜臀久久不卡二区| 黄色av网址在线免费观看| 在线观看成人小视频| www..com.cn蕾丝视频在线观看免费版| 日韩**一区毛片| 正在播放91九色| 亚洲一区二区三区在线免费| 九九热在线精品视频| 欧美熟妇交换久久久久久分类| 五月综合激情日本mⅴ| 中文人妻一区二区三区| 青青青伊人色综合久久| 日本不卡一区二区三区四区| 亚洲成人黄色| 中文字幕亚洲区| 91pron在线| 美女精品视频| 亚洲人成网7777777国产| 欧美另类高清videos的特点| 国产精品美女久久久久久久久| 中文字幕亚洲影院| 亚洲国产二区| 天堂资源在线亚洲资源| 日本高清久久| 98精品国产高清在线xxxx天堂| 色av男人的天堂免费在线| 欧美私模裸体表演在线观看| 成年人av电影| 久久久久久久久97黄色工厂| 污污的视频免费观看| 欧美一级视频免费| 美女一区二区视频| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 国产aⅴ爽av久久久久成人| 亚洲午夜在线电影| 欧美午夜激情影院| 国产精品1区2区3区在线观看| 国产精品网站免费| 久久美女精品| 久久久久久九九| 国产午夜久久av| 国产999精品久久久| 高潮毛片在线观看| 国产午夜精品麻豆| 国产后入清纯学生妹| 色噜噜狠狠成人中文综合| 精品一区在线观看视频| 久久久精品tv| 日本道中文字幕| 精品一区二区在线视频| 欧美三级午夜理伦三级| 欧美69视频| 亚洲一二三区精品| 日韩极品少妇| 成人免费观看网站| 亚洲欧美专区| 国产精品视频xxxx| 咪咪网在线视频| 欧美国产日韩xxxxx| 欧美激情办公室videoshd| 国产视频自拍一区| 亚洲欧美另类日韩| 91精品国产综合久久久蜜臀粉嫩| 伦av综合一区| 精品国产福利在线| 欧美国产在线看| 国产精品久久久久久久浪潮网站 | 国产午夜精品福利| 少妇被狂c下部羞羞漫画| 精品伊人久久久久7777人| 日本久久久精品视频| 黄色亚洲精品| 一级性生活视频| 日韩欧美高清在线播放| 欧美日韩一区二区三区在线观看免| 国产精品久久久网站| 91欧美日韩一区| yiren22亚洲综合| 国产精品av在线播放| 美女日韩欧美| 国产不卡av在线免费观看| 中国色在线日|韩| 午夜精品久久久久久99热软件| 日本无删减在线| 欧美日韩成人在线视频| 亚洲丝袜一区| 久99久在线视频| 一二三四区在线观看| 欧美一级专区免费大片| 久久在精品线影院精品国产| 这里只有精品视频在线| 国产精品国产亚洲伊人久久| 亚洲日本理论电影| 精品无人区无码乱码毛片国产| 日本午夜视频在线观看| 国产素人视频在线观看| 天天躁日日躁狠狠躁欧美巨大小说 | 欧美色123| 99久久精品免费| 欧美精品第1页| 日本道色综合久久| 欧美成人精品在线视频| 国产精品免费看久久久香蕉| 国产一区二区三区无遮挡| 日韩精品在线观看av| 微拍福利一区二区| 中文字幕有码在线观看| 欧美极品美女视频| 亚洲最大视频网| 国产成人自拍在线| www.啪啪.com| 久久久久久亚洲综合影院红桃| 内射毛片内射国产夫妻| 国产精品狼人久久影院观看方式| 久久国产高清视频| 亚洲国产综合色| 国产亚洲欧美在线精品| 欧美午夜精品久久久久久孕妇 | 成人3d动漫一区二区三区91| 成人台湾亚洲精品一区二区| 久久久综合香蕉尹人综合网| 欧美一区二区三区激情视频| 自拍偷拍视频在线| 精久久久久久| 精品久久久久久中文字幕2017| 狠狠色丁香婷综合久久| 少妇极品熟妇人妻无码| 久久久欧美精品sm网站| 黑人狂躁日本娇小| 亚洲成人免费视| 青青艹在线观看| 日韩精品一区二区三区四区| 免费播放片a高清在线观看| 久久精品国产免费观看| 91福利在线免费| 国产美女扒开尿口久久久| 北条麻妃一区二区三区在线| 日韩精品成人一区二区在线观看| 一区二区三区午夜视频| 中文字幕无码不卡免费视频| 国产成人8x视频一区二区 | 欧美一区二区黄片| 伊人伊成久久人综合网站| 国内在线视频| 国产日韩在线观看av| 亚洲精品亚洲人成在线观看| 天堂一区二区三区 | 激情五月色综合国产精品| 欧美少妇在线观看| 玖玖精品视频| 日韩无码精品一区二区| 中文字幕一区三区| 国产欧美一区二区三区在线看蜜臂| 6080午夜不卡| freemovies性欧美| 91精品国产91久久久久久久久| 99精品视频在线免费播放 | 亚洲男人在线天堂| 亚洲欧美日韩在线| 中文字幕在线网站| 精品亚洲aⅴ在线观看| 丁香花视频在线观看| 成人福利视频在线观看| 国产乱码精品一区二区亚洲| 欧美日韩在线一| 成人中文字幕合集| 国产一区二区播放| 日本韩国精品一区二区在线观看| 人妻妺妺窝人体色www聚色窝| 久久在线观看视频| 超碰国产精品一区二页| 日本在线一区| 日产国产欧美视频一区精品| 欧美激情aaa| 懂色aⅴ精品一区二区三区蜜月| 成人午夜视频一区二区播放| 久热精品视频在线免费观看| 欧美另类激情| 亚洲精品人成| 蜜桃一区二区三区四区| 日韩一级av毛片| 色婷婷精品久久二区二区蜜臂av| 视频污在线观看| 欧美激情中文字幕在线| 97se亚洲国产一区二区三区| 在线观看污视频| 国产成人精品免费| 久久久久成人网站| 精品久久久久久无| www欧美xxxx| 久久久影院一区二区三区| 香蕉久久国产| 波多野结衣a v在线| 色欧美88888久久久久久影院| 国产色a在线| 国产在线久久久| 91精品国产91久久久久久黑人| 伊人色在线视频| 亚洲欧美一区二区久久 | 风间由美一区二区三区在线观看| 麻豆成人在线视频| 精品国产99国产精品| 日韩欧美精品一区二区三区| 欧美日韩高清免费| 久久精品噜噜噜成人av农村| 欧美 日韩 国产 一区二区三区| 日韩午夜在线影院| 草草影院在线| 久久精品美女| 奇米精品一区二区三区四区| 一区二区三区在线播放视频| 欧美一区二区精品在线| 狂野欧美性猛交xxxxx视频| 精品视频导航| 日本中文字幕一区| 午夜爽爽爽男女免费观看| 亚洲第一区在线| 亚洲不卡系列| 黄色一级大片免费| 91在线视频18| 夜夜躁很很躁日日躁麻豆| 另类色图亚洲色图| 蜜桃久久久久| www.久久91| 亚洲国产成人tv| 99青草视频在线播放视| av成人午夜| 日韩电影网1区2区| 久久高清无码视频| 国产亚洲精品91在线| 午夜视频一区二区在线观看| 自慰无码一区二区三区| 亚洲欧洲精品一区二区精品久久久 | 99久久婷婷国产综合| 亚洲激情小视频| 国产亚洲欧美日韩精品一区二区三区| 日本熟妇人妻xxxx| 国产亚洲一本大道中文在线| 国产黄色片av| 国产精品成人一区二区| 黄色免费成人| 婷婷丁香综合网|