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

用戶數十億的iOS超級應用,10年代碼變化,你發現了嗎?

原創 精選
移動開發 iOS
FBiOS架構演變到今天,并不是有意為之的。它反映了10年以來的發展,這是由越來越多的工程師開發該App所需的技術決策、穩定性以及最重要的用戶體驗所推動的。

?作者 | Dustin Shahidehpour

策劃 | 言征 

iOS版Facebook(FBiOS)可以說是Meta最古老的移動代碼庫了。自2012年該應用程序被重寫以來,數千名工程師對其進行了研究,并將其交付給數十億用戶,它可以支持數百名工程師一次對其進行迭代。

FBiOS架構演變到今天,并不是有意為之的。它反映了10年以來的發展,這是由越來越多的工程師開發該App所需的技術決策、穩定性以及最重要的用戶體驗所推動的。

補充知識:

截止到2022年,該代碼庫已經走過了十周年,筆者將對這一演變背后的技術決策以及它們的歷史背景進行一些說明。

經過多年的迭代,Facebook代碼庫與典型的iOS代碼庫不同:

(1)它包含了C++、Objective-C(++)和Swift。

(2)它有幾十個動態加載的庫(dylib),以及太多的類,無法一次將它們加載到Xcode中。

(3)蘋果SDK的原始使用幾乎為零——一切都被內部抽象所包裝或替換。

(4)該應用程序大量使用代碼生成,這是由我們的自定義構建系統 Buck 推動的。

(5)如果我們的構建系統沒有大量緩存,工程師將不得不花一整天時間等待應用程序的構建。  

一、2014:建立我們自己的移動框架

2014年,對Facebook應用程序進行本地重寫已經過去兩年,這時,News Feed的代碼庫開始出現可靠性問題。當時,News Feed的數據模型得到了蘋果管理數據模型的默認框架:核心數據的支持。核心數據中的對象是可變的,這并不適合新聞提要的多線程架構。更糟糕的是,News Feed利用了雙向數據流,這源于它對Cocoa應用程序使用了蘋果事實上的設計模式:模型視圖控制器。

最終,這種設計加劇了不確定性代碼的產生,這些代碼很難調試或再現錯誤。很明顯,這種架構是不可持續的,是時候重新思考了。

在考慮新的設計時,一位工程師研究了React,Facebook的(開源)UI框架,該框架在Javascript社區中非常流行。React的聲明性設計抽象了導致Feed(在web上)出現問題的棘手命令式代碼,并利用了單向數據流,這使得代碼更易于推理。這些特征似乎很適合News Feed面臨的問題:蘋果的SDK中沒有聲明性UI。

Swift將在幾個月內發布,SwiftUI(蘋果的聲明性UI框架)將在2019年之前發布。如果NewsFeed想要有一個聲明性UI,那么團隊必須構建一個新的UI框架。

最終,這就是他們所做的。

在花了幾個月時間構建和遷移新聞提要以在新的聲明性UI和新的數據模型上運行后,FBiOS的性能提高了50%。

幾個月后,他們開源了基于React的移動UI框架ComponentKit。時至今日,ComponentKit仍然是在Facebook中構建本機UI的事實上的選擇。它通過視圖重用池、視圖展平和背景布局計算為應用程序提供了無數性能改進。它也啟發了其Android對手Litho和SwiftUI。

最終,選擇用自定義infra替換UI和數據層是一種權衡。為了獲得可以可靠維護的令人愉快的用戶體驗,新員工必須擱置他們對Apple API的行業知識,學習定制的內部基礎設施。

這將不是FBiOS最后一次做出平衡最終用戶體驗與開發者體驗和速度的決定。進入2015年,該應用的成功將引發我們所稱的功能爆炸。這也帶來了一系列獨特的挑戰。

二、2015:架構拐點

到2015年,Meta在其“移動第一”的口號上翻了一番,FBiOS代碼庫的每日貢獻者數量急劇增加。隨著越來越多的產品被集成到應用程序中,其發布時間開始縮短,人們開始注意到。到2015年底,啟動性能非常緩慢(接近30秒!),以至于有可能被手機的操作系統殺死。

經過調查,很明顯有許多因素導致啟動性能下降。為了簡潔起見,我們將只關注那些對應用程序架構有長期影響的方面:

(1)隨著應用程序的規模隨著每種產品的增長而增長,該應用程序的“前置”時間正在以無限的速度增長。

(2)該應用程序的“模塊”系統為每個產品提供了對該應用程序所有資源的無管制訪問。這導致了一個公共問題的悲劇,因為每個產品都利用它的“鉤子”來啟動,以執行計算上昂貴的操作,從而快速導航到該產品。

緩解和改善啟動所需的更改將從根本上改變產品工程師為FBiOS編寫代碼的方式。

三、2016年:Dylibs和模塊化

根據蘋果關于改進發布時間的維基,在調用應用程序的“主”功能之前,必須執行許多操作。通常,一個應用程序的代碼越多,所需時間就越長。

雖然“pre-main”在發布過程中僅貢獻了30秒的一小部分時間,但這是一個特別令人擔憂的問題,因為隨著FBiOS不斷積累新功能,它將繼續以無限的速度增長。

為了幫助緩解應用程序發布時間的無限增長,我們的工程師開始將大量產品代碼移入一個稱為動態庫(dylib)的延遲加載容器中。當代碼移動到動態加載的庫中時,不需要在應用程序的main()函數之前加載。

最初,FBiOS dylib結構如下:

圖片

創建了兩個產品dylib(FBCamera和NotOnStartup),第三個dylib(FBShared)用于在不同的dylib和主應用程序的二進制文件之間共享代碼。

dylib溶液效果很好。FBiOS能夠抑制應用程序啟動時間的無限增長。隨著時間的推移,大多數代碼都會以dylib結尾,這樣啟動時的性能就會保持快速,并且不會受到應用程序中添加或刪除產品的持續波動的影響。

dylibs的加入引發了Meta產品工程師編寫代碼方式的思想轉變。隨著dylib的添加,像NSClassFromString()這樣的運行時API冒著運行時失敗的風險,因為所需的類存在于卸載的dylib中。由于FBiOS的許多核心抽象都是在遍歷內存中的所有類的基礎上構建的,因此FBiOS必須重新思考其核心系統的工作情況。

除了運行時失敗之外,dylibs還引入了一類新的鏈接器錯誤。如果Facebook(啟動集)中的代碼引用了dylib中的代碼,工程師將看到如下鏈接器錯誤:

Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_SomeClass", referenced from:
objc-class-ref in libFBSomeLibrary-9032370.a(FBSomeFile.mm.o)

為了解決這個問題,工程師們需要用一個特殊的函數來包裝他們的代碼,如果需要的話,可以加載dylib,比如:

int main() {
DoSomething(context);
}

看起來像這樣:
int main() {
FBCallFunctionInDylib(
NotOnStatupFramework,
DoSomething,
context
);
}

該解決方案有效,但有很多奇怪的地方:

(1)應用程序特定的dylib枚舉被硬編碼到各種調用站點中。Meta的所有應用程序都必須共享一個dylib枚舉,讀者有責任確定代碼運行的應用程序是否使用了該dylib。

(2)如果使用了錯誤的dylib枚舉,代碼將失敗,但僅在運行時失敗。考慮到應用程序中大量的代碼和功能,這個延遲的信號導致了開發過程中的許多挫折。

最重要的是,我們唯一能防止在啟動過程中引入這些調用的系統是基于運行時的,在應用程序引入最后一分鐘的回歸時,許多發布都被延遲。

最終,dylib優化抑制了應用程序發布時間的無限增長,但這意味著應用程序架構的巨大轉折點。FBiOS工程師將在接下來的幾年里重新設計應用程序,以消除dylib帶來的一些粗糙邊緣,我們(最終)推出了一個比以往任何時候都更強大的應用程序架構。

四、2017:重新思考FBiOS架構

隨著dylibs的引入,FBiOS的幾個關鍵組件需要重新思考:

(1)“模塊注冊系統”不能再基于運行時。

(2)工程師們需要一種方法來了解啟動期間的任何代碼路徑是否會觸發dylib加載。

(3)為了解決這些問題,FBiOS轉向Meta的開源構建系統Buck。

在Buck中,每個“目標”(app、dylib、library等)都用一些配置聲明,如下所示:

apple_binary(
name = "Facebook",
...
deps = [
":NotOnStartup#shared",
":FBCamera#shared",
],
)

apple_library(
name = "NotOnStartup",
srcs = [
"SomeFile.mm",
],
labels = ["special_label"],
deps = [
":PokesModule",
...
],
)

每個“目標”都列出了構建它所需的所有信息(依賴項、編譯器標志、源等),當調用“buck build”時,它會將所有這些信息構建成一個可以查詢的圖形。

$ buck query “deps(:Facebook)
> :NotOnStartup
> :FBCamera

$ buck query “attrfilter(labels, special_label, deps(:Facebook))
> :NotOnStartup

使用這個核心概念(以及一些特殊的醬汁),FBiOS開始生成一些buck查詢,這些查詢可以在構建過程中生成應用程序中的類和函數的整體視圖。這些信息將成為該應用程序下一代架構的基石。

五、2018:生成代碼的激增

既然FBiOS能夠利用Buck查詢依賴關系中的代碼信息,那么它就可以創建一個“function/classes->dylibs”的映射,可以在運行中生成。

{
"functions": {
"DoSomething": Dylib.NotOnStartup,
...
},
"classes": {
"FBSomeClass": Dylib.SomeOtherOne
}
}

使用該映射作為輸入,FBiOS使用它生成從調用站點抽象出dylib枚舉的代碼:

static std::unordered_map<const char *, Dylib> functionToDylib {{
{ "DoSomething", Dylib.NotOnStartup },
{ "FBSomeClass", Dylib.SomeOtherOne },
...
}};

左右滑動查看完整代碼

使用代碼生成之所以吸引人,有幾個原因:

(1)因為代碼是基于本地輸入重新生成的,所以沒有什么可簽入的,也沒有更多的合并沖突!考慮到FBiOS的工程規模每年都會翻倍,這是一個巨大的開發效率勝利。

(2)不再需要應用程序特定的dylib(因此可以重命名為“FBCallFunction”)。相反,調用將從構建期間為每個應用程序生成的靜態映射中讀取。

事實證明,將Buck查詢與代碼生成相結合是如此成功,以至于FBiOS將其作為新插件系統的基礎,最終取代了基于運行時的應用程序模塊系統。

1.左移信號

使用Buck支持的插件系統。FBiOS能夠通過將infra遷移到基于插件的架構中,以構建時警告取代大多數運行時失敗。

構建FBiOS時,Buck可以生成一個圖表,顯示應用程序中所有插件的位置,如下所示:

圖片

從這個角度來看,插件系統可以顯示構建時間錯誤,以便工程師發出警告:

(1)“插件D、E可能會觸發dylib加載。這是不允許的,因為這些插件的調用方位于應用程序的啟動路徑中。”

(2)“應用程序中沒有用于呈現配置文件的插件……這意味著導航到該屏幕將無法工作?!?/p>

(3)“有兩個插件用于呈現組(插件A、插件B)。其中一個應該刪除。”

對于舊的應用程序模塊系統,這些錯誤將是“懶惰”的運行時斷言?,F在,工程師們相信,當FBiOS成功構建時,它不會因為功能缺失、應用程序啟動期間的dylib加載或模塊運行時系統中的不變量而失敗。

2.代碼生成的代價

雖然將FBiOS遷移到插件系統提高了應用程序的可靠性,為工程師提供了更快的信號,并使應用程序可以與其他移動應用程序輕松共享代碼,但這是有代價的:

(1)插件錯誤在Stack Overflow上很難找到答案,調試時會感到有些吃力。

(2)基于代碼生成和Buck的插件系統與傳統的iOS開發有著天壤之別。

(3)插件為代碼庫引入了一層中間層。大多數應用程序都會有一個包含所有功能的注冊表文件,這些都是在FBiOS中生成的,很難找到。

毫無疑問,插件使FBiOS遠離了慣用的iOS開發,但這種權衡似乎是值得的。我們的工程師可以更改Meta的許多應用程序中使用的代碼,并確保如果插件系統運行良好,任何應用程序都不會因缺少很少測試的代碼路徑中的功能而崩潰。像News Feed和Groups這樣的團隊可以為插件構建一個擴展點,并確保產品團隊可以在不觸及核心代碼的情況下集成到其表面。

六、2020:Swift與語言架構

應用程序規模問題導致的架構變化上,但蘋果SDK的變化也迫使FBiOS重新考慮其一些架構決策。

2020年,FBiOS開始看到來自蘋果的Swift專用API的數量增加,并且越來越多的人希望在代碼庫中使用更多的Swift。終于是時候接受這樣一個事實了:Swift是FB應用程序中不可避免的租戶。

歷史上,FBiOS曾使用C++作為構建抽象的杠桿,因為C++的“零開銷”原則,這節省了代碼大小。但C++尚未與Swift互操作。對于大多數FBiOS API(如ComponentKit),必須創建某種墊片以在Swift中使用,從而導致代碼膨脹。

下面是一個圖表,概述了代碼庫中的問題:

圖片

考慮到這一點,我們開始形成一種關于何時何地使用各種代碼的語言策略:

圖片

最終,FBiOS團隊開始建議:面向產品的API/代碼不應包含C++,這樣我們就可以自由使用蘋果公司的Swift和未來的Swift API。使用插件,FBiOS可以抽象出C++實現,這樣它們仍然為應用提供動力,但對大多數工程師來說是隱藏的。

這種類型的工作流意味著FBiOS工程師構建抽象的方式發生了一些變化。自2014年以來,影響框架構建中的最大因素是對應用程序大小和表現力的貢獻度(這就是為什么ComponentKit選擇Objective-C++而不是Objective-C的原因)。

Swift的引入導致開發人員的效率降低,不急,未來還能看到更多。

七、2022年:旅程已完成1%

自2014年以來,FBiOS架構發生了很大變化:

(1)它引入了大量內部抽象,如ComponentKit和GraphQL。

(2)它使用dylibs將“pre-main”時間保持在最小,并有助于快速啟動應用程序。

(3)它引入了一個插件系統(由Buck提供支持),這樣就可以從工程師那里抽象出dylib,因此代碼很容易在應用程序之間共享。

(4)它引入了關于何時何地使用各種語言的語言指南,并開始改變代碼庫以反映這些語言指南。

與此同時,蘋果對其手機、操作系統和SDK進行了令人興奮的改進:

(1) 他們的新手機速度很快。裝載成本比以前小得多。

(2) dyld3和鏈修復等操作系統改進提供了軟件,使代碼加載更快。

(3) 他們引入了SwiftUI,這是一個用于UI的聲明性API,它與ComponentKit共享了很多概念。

(4) 他們提供了改進的SDK,以及我們可以為其構建自定義框架的API(如iOS8中的可中斷動畫)。

隨著Facebook、Messenger、Instagram和WhatsApp分享了更多的體驗,FBiOS正在重新審視所有這些優化,以了解在哪些方面可以更接近平臺正統。最終,我們發現,共享代碼的最簡單方法是使用應用程序免費提供的東西,或者構建一個幾乎無依賴性且可以在所有應用程序之間集成的東西。

我們將于2032年在這里與您見面,回顧代碼庫的20周年紀念!?

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2010-11-04 10:06:27

GSMMTN華為

2024-05-20 08:25:55

2014-08-21 14:49:32

MIUI 6

2015-07-21 15:35:47

代碼總結源碼

2020-09-01 10:32:52

iOS微信新功能

2022-04-26 06:43:12

文檔TCPLinux

2016-10-24 15:44:15

2022-04-18 07:42:31

配置機制Spring

2020-08-17 09:30:34

代碼焦點程序員

2018-01-24 11:49:34

2015-11-16 14:52:13

代碼程序員

2018-08-22 09:01:08

2015-01-05 09:56:41

UDPLinux TCP

2020-04-14 15:30:00

微信群管理朋友圈

2012-02-23 13:34:28

2025-09-12 11:00:00

Akamai云計算安全

2018-07-12 14:03:33

區塊鏈新零售電子商務

2011-03-25 15:21:43

點贊
收藏

51CTO技術棧公眾號

三级a在线观看| 蜜桃999成人看片在线观看| 91麻豆精品成人一区二区| 亚洲小说春色综合另类电影| 一区二区三区精品久久久| 精品国产一区二区三区麻豆小说 | 日韩在线免费看| 麻豆一区二区99久久久久| 欧美国产中文字幕| 久久精品三级视频| 国产成人在线中文字幕| 欧美在线免费播放| www.夜夜爱| a黄色在线观看| 不卡视频免费播放| 国产精自产拍久久久久久| 日韩黄色精品视频| 一区二区三区四区电影| 亚洲国产精品成人精品| 国产高潮免费视频| 欧美极品videos大乳护士| 国产精品福利在线播放| 麻豆视频成人| 免费看国产片在线观看| 九九国产精品视频| 日本老师69xxx| 国产主播在线播放| 国产精品黑丝在线播放| 亚洲女人被黑人巨大进入| 免费在线观看日韩av| 99tv成人影院| 欧美三区免费完整视频在线观看| 欧美在线一区视频| 污视频网站在线免费| 国产精品色哟哟| 日本a级片久久久| 亚洲 欧美 激情 小说 另类| 国产精品小仙女| 成人性生交大片免费看小说| 好吊色在线视频| 久久成人国产| 26uuu另类亚洲欧美日本老年| 欧美色图一区二区| 伊人成综合网| 久久视频在线看| 午夜激情视频在线播放| 操欧美老女人| 在线视频日本亚洲性| 久久精品国产亚洲AV熟女| 欧美日韩一本| 日韩电影免费观看在线观看| 在线精品视频播放| 极品束缚调教一区二区网站| 日韩一区二区在线观看| 三年中文在线观看免费大全中国| 婷婷久久免费视频| 在线电影一区二区三区| 婷婷激情5月天| 91精品网站在线观看| 欧美男人的天堂一二区| 99九九99九九九99九他书对| 欧美激情三区| 欧美一区二区在线不卡| 亚洲精品无码久久久久久久| 天堂av一区| 亚洲第一精品福利| 制服丝袜第二页| 九九亚洲视频| 日韩最新中文字幕电影免费看| 亚洲a∨无码无在线观看| 日韩av片子| 久久中文字幕国产| 精品肉丝脚一区二区三区| 伊人久久亚洲美女图片| 青青在线视频一区二区三区| 中文字幕欧美在线观看| 加勒比婷婷色综合久久| 日韩精品av| 一本久久a久久精品亚洲| aa免费在线观看| 国产福利亚洲| 欧美一级日韩一级| 黄色av网址在线观看| 久久99国产成人小视频| 中文字幕免费国产精品| 国产一区二区播放| 中文一区在线| 国产精品爽黄69| www香蕉视频| 久久五月婷婷丁香社区| 一区二区精品在线观看| 国内小视频在线看| 在线亚洲高清视频| 午夜影院免费观看视频| 日韩美女国产精品| 久久精品视频播放| 国产成人无码精品| 久久国产精品99精品国产| 成人在线视频电影| 高清在线观看av| 亚洲精品一二三| 欧美牲交a欧美牲交aⅴ免费下载| 91天天综合| 精品久久一区二区| 国产福利不卡| 91n.com在线观看| 国产一区影院| 亚洲精品网址在线观看| 国产又粗又硬又长又爽| 久久电影一区| 成人性色av| 麻豆最新免费在线视频| 婷婷国产在线综合| 在线观看视频在线观看| 亚洲天堂日韩在线| 欧美大秀在线观看| 97国产精品久久久| 久久丝袜美腿综合| 国产尤物av一区二区三区| 欧美羞羞视频| 精品国产不卡一区二区三区| 国产黄色片在线| 久久三级视频| 国产精品区一区| 日本亚洲精品| 欧美伊人久久久久久午夜久久久久| jjzz黄色片| 2023国产精品久久久精品双| 国产精品福利在线观看网址| 外国精品视频在线观看| 亚洲制服丝袜在线| 亚洲一区二区三区四区精品| 成人看的羞羞网站| 欧美亚洲免费电影| 天堂在线视频观看| 亚洲午夜一区二区| jjzz黄色片| 国产精品v日韩精品v欧美精品网站| 成人久久久久爱| 欧美成人三区| 欧美日韩情趣电影| 精品在线观看一区| 美女视频网站黄色亚洲| 日韩精品无码一区二区三区| 亚洲黄色免费av| 日韩毛片在线看| 特黄视频免费看| 91亚洲男人天堂| 日日摸日日碰夜夜爽av| 三级精品视频| 日本久久久久久久久久久| 暖暖视频在线免费观看| 一本一本大道香蕉久在线精品 | 尤物九九久久国产精品的特点 | 国产精品自拍首页| 丰乳肥臀在线| 亚洲精品国产电影| 九九热在线免费观看| 91蜜桃在线免费视频| 97成人在线观看视频| 免费看成人吃奶视频在线| 日韩美女激情视频| av网页在线| 欧美一区二区视频在线观看2020 | 一区二区三区网站| 国产经品一区二区| 日韩电影毛片| 亚洲一区二区黄| 国产又色又爽又黄又免费| 一区在线观看免费| 中文字幕天堂av| 久久精品成人| 中文字幕一区二区三区在线乱码 | 不卡一卡2卡3卡4卡精品在| www久久日com| 亚洲国产精品yw在线观看| 人妻丰满熟妇av无码区| 中文字幕欧美一| 99热超碰在线| 欧美a级理论片| 一级性生活视频| 婷婷成人综合| 国产欧洲精品视频| 青春草视频在线| 亚洲欧美另类人妖| 国产强伦人妻毛片| 丰满岳妇乱一区二区三区| 激情五月深爱五月| 成人性生交大片免费看视频在线| 成人综合视频在线| 91精品二区| 免费久久久一本精品久久区| 在线观看欧美| 91av网站在线播放| 蜜芽在线免费观看| 亚洲精品国产精品国自产观看浪潮 | 亚洲激情男女视频| 三上悠亚影音先锋| 国产成人av福利| 亚洲77777| 激情一区二区| 亚洲一区二区在线看| 红杏视频成人| 91美女福利视频高清| 最近高清中文在线字幕在线观看1| 久久久精品在线| 日本天堂影院在线视频| 日韩一级片网址| 久久精品99北条麻妃| 亚洲二区在线观看| 免费在线观看一级片| 国产日韩视频一区二区三区| 91人妻一区二区| 韩国精品免费视频| 能看的毛片网站| 中文在线不卡| 国产精品久久久久9999爆乳| 国产精品精品国产一区二区| 欧美人与物videos另类| 国产一区二区三区不卡av| 成人国产精品一区二区| 午夜av成人| 日韩美女主播视频| 国产高清自产拍av在线| 欧美成人免费一级人片100| 成年午夜在线| 亚洲人线精品午夜| 色综合888| 亚洲国产精品va在线看黑人| www.精品久久| 欧美一区二区视频观看视频| 中文字幕av久久爽| 一本到一区二区三区| 丰满少妇乱子伦精品看片| 亚洲精品视频免费观看| 精品国产视频在线观看| 国产精品视频第一区| 一区二区三区伦理片| 91看片淫黄大片一级| 成人免费av片| 2024国产精品| 亚洲人人夜夜澡人人爽| 91美女片黄在线观看| 久久久午夜精品福利内容| 成人在线综合网| 久久精品aⅴ无码中文字字幕重口| 国内精品久久久久影院薰衣草 | 亚洲第一精品在线观看| 午夜影院在线观看欧美| 久久久久久久久久久97| 亚洲高清免费视频| 亚洲一区欧美在线| 欧美日韩美女在线| 久久久精品福利| 色综合av在线| 中文字幕1区2区3区| 欧美日韩国产首页在线观看| 一级久久久久久久| 欧美一区二区私人影院日本| 精品久久久免费视频| 亚洲高清在线观看| 免费在线国产| 色青青草原桃花久久综合| 色多多视频在线观看| 欧美成aaa人片在线观看蜜臀| 超碰免费在线播放| 久久久久久久久久久91| 天堂在线中文网官网| 国产精品黄色av| 视频欧美精品| 国产精品久久久久久久小唯西川 | 国产精品麻豆免费版现看视频| 中文字幕一区三区| 久久久久久久国产视频| 欧美日韩国内自拍| 在线观看日批视频| 日韩欧美电影一二三| 色一情一乱一区二区三区| 亚洲美女自拍视频| 麻豆视频在线观看免费网站| 精品自在线视频| 理论片午夜视频在线观看| 国产成+人+综合+亚洲欧洲 | 香蕉久久国产| 狠狠干狠狠操视频| 成人黄色网址在线观看| 日韩人妻无码一区二区三区| 中文字幕一区二区三区精华液| 国产1区2区3区4区| 色综合久久久久久久久久久| 一卡二卡三卡在线| 亚洲福利在线观看| 幼a在线观看| 性欧美办公室18xxxxhd| 成人在线观看免费视频| 国产精品视频入口| 日产精品一区二区| 日韩欧美国产综合在线| 看电视剧不卡顿的网站| 给我免费观看片在线电影的| 国产精品激情偷乱一区二区∴| 日本少妇久久久| 欧美丰满美乳xxx高潮www| 天堂中文在线看| 另类美女黄大片| 亚洲精品在线影院| 成人免费看片网址| 99热国内精品永久免费观看| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 色综合久久中文字幕综合网| 99热这里只有精| 亚洲午夜久久久久久久| xxxx视频在线| 91亚洲精品在线| 欧美精品久久久久久| 每日在线观看av| 国内成人精品2018免费看| www.黄色在线| 欧美性猛交xxxxx免费看| 国产小视频免费观看| 粗暴蹂躏中文一区二区三区| 日韩欧美少妇| 久久艳妇乳肉豪妇荡乳av| 亚洲午夜伦理| 欧美专区第二页| 综合av第一页| 中文字幕人妻一区二区在线视频| 精品性高朝久久久久久久| 久久久123| 7777精品久久久大香线蕉小说| 青草国产精品| 超碰av在线免费观看| 91视频观看免费| 日韩精品无码一区二区| 日韩欧美中文一区| 尤物yw193can在线观看| 成人免费网站在线看| 欧美韩日一区| 九九精品久久久| 国产精品国产三级国产aⅴ原创| 久久久久久无码精品大片| 亚洲男人天堂2023| 欧美一级大黄| 神马影院一区二区三区| 日韩高清一区在线| 国产三级在线观看完整版| 欧美曰成人黄网| 欧美激情午夜| 亚洲free性xxxx护士白浆| 欧美不卡高清| 国产吃瓜黑料一区二区| 一区二区日韩电影| 丰满人妻妇伦又伦精品国产| 久久免费精品视频| 精品午夜电影| 成人久久久久久久久| 欧美极品美女视频| 国产又黄又爽视频| 久久99久久99精品中文字幕| 91夜夜蜜桃臀一区二区三区| 国产成人永久免费视频| av不卡在线观看| 老熟妇一区二区三区| 中文字幕亚洲一区二区三区五十路| 国产福利一区二区三区在线播放| 一区二区三区四区免费视频| 国内精品写真在线观看| 久久9999久久免费精品国产| 亚洲激情在线观看| 日韩在线免费| 黄色小视频大全| 92国产精品观看| 亚洲婷婷久久综合| 久久夜色精品国产欧美乱| 波多野结衣一区二区三区免费视频| 草草久久久无码国产专区| 国产农村妇女精品| 国产chinasex对白videos麻豆| 国内精品美女av在线播放| japanese国产精品| 中文字幕第10页| 色婷婷国产精品| 日本激情在线观看| 国产精品xxxx| 免费美女久久99| 久久久久久久9999| 亚洲天堂影视av| 91免费精品国偷自产在线在线| 丝袜老师办公室里做好紧好爽| 国产精品网站导航| 刘玥91精选国产在线观看| 国产精品久久99久久| 欧美精品国产一区二区| 亚洲一区视频在线播放| 日韩午夜在线影院| 88xx成人永久免费观看| 91亚洲精品国产| 中文字幕av在线一区二区三区| 韩国av电影在线观看| 国产欧美日韩免费|