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

Flutter實現原理及在馬蜂窩的跨平臺開發實踐

開發 開發工具
在馬蜂窩旅游 App 很多業務場景里,我們嘗試過一些主流的跨平臺開發解決方案, 比如WebView 和 React Native,來提升開發效率和用戶體驗。但這兩種方式也帶來了新的問題。

一直以來,跨平臺開發都是困擾移動客戶端開發的難題。

在馬蜂窩旅游 App 很多業務場景里,我們嘗試過一些主流的跨平臺開發解決方案, 比如WebView 和 React Native,來提升開發效率和用戶體驗。但這兩種方式也帶來了新的問題。

比如使用 WebView 跨平臺方式,優點確實非常明顯。基于 WebView 的框架集成了當下 Web 開發的諸多優勢:豐富的控件庫、動態化、良好的技術社區、測試自動化等等。但是缺點也同樣明顯:渲染效率和 JavaScript 的執行能力都比較差,使頁面的加載速度和用戶體驗都不盡如人意。

而使用以 React Native(簡稱 RN)為代表的框架時,維護又成了大難題。RN 使用類 HTML+JS 的 UI 創建邏輯,生成對應的原生頁面,將頁面的渲染工作交給了系統,所以渲染效率有很大的優勢。但由于 RN 代碼是通過 JS 橋接的方式轉換為原生的控件,所以受各個系統間的差異影響非常大,雖然可以開發一套代碼,但對各個平臺的適配卻非常的繁瑣和麻煩。

為什么是 Flutter

2018 年 12 月初,Google 正式發布了開源跨平臺 UI 框架 Flutter 1.0 Release 版本,馬蜂窩電商客戶端團隊進行了調研與實踐,發現Flutter能很好的幫助我們解決開發中遇到的問題。

  1. 跨平臺開發,針對 Android 與 iOS 的風格設計了兩套設計語言的控件實現(Material & Cupertino)。這樣不但能夠節約人力成本,而且在用戶體驗上更好的適配 App 運行的平臺。
  2. 重寫了一套跨平臺的 UI 框架,渲染引擎是依靠 Skia 圖形庫實現。Flutter 中的控件樹直接由渲染引擎和高性能本地 ARM 代碼直接繪制,不需要通過中間對象(Web 應用中的虛擬 DOM 和真實 DOM,原生 App 中的虛擬控件和平臺控件)來繪制,使它有接近原生頁面的性能,幫助我們提供更好的用戶體驗。
  3. 同時支持 JIT 和 AOT 編譯。JIT編譯方式使其在開發階段有個備受歡迎的功能——熱重載(HotReload),這樣在開發時可以省去構建的過程,提高開發效率。而在 Release 運行階段采用 AOT 的編譯方式,使執行效率非常高,讓 Release 版本發揮更好的性能。

于是,電商客戶端團隊決定探索 Flutter 在跨平臺開發中的新可能,并率先應用于商家端 App 中。在本文中,我們將結合 Flutter 在馬蜂窩商家端 App 中的應用實踐,探討 Flutter 架構的實現原理,有何優勢,以及如何幫助我們解決問題。

Flutter 架構和實現原理

Flutter 使用 Dart 語言開發,主要有以下幾點原因:

  • Dart 一般情況下是運行 DartVM 上,但是也可以編譯為 ARM 代碼直接運行在硬件上。
  • Dart 同時支持 AOT 和 JIT 兩種編譯方式,可以更好的提高開發以及 App 的執行效率。
  • Dart 可以利用獨特的隔離區(Isolate)實現多線程。而且不共享內存,可以實現無鎖快速分配。
  • 分代垃圾回收,非常適合 UI 框架中常見的大量 Widgets 對象創建和銷毀的優化。
  • 在為創建的對象分配內存時,Dart 是在現有的堆上移動指針,保證內存的增長是程線性的,于是就省了查找可用內存的過程。

Dart 主要由 Google 負責開發和維護。目前 Dart 新版本已經是 2.2,針對 App 和 Web 開發做了很多優化。并且對于大多數的開發者而言,Dart 的學習成本非常低。

Flutter 架構也是采用的分層設計。從下到上依次為:Embedder(嵌入器)、Engine、Framework。

圖1: Flutter 分層架構圖

Embedder 是嵌入層,做好這一層的適配 Flutter 基本可以嵌入到任何平臺上去;

Engine 層主要包含 Skia、Dart 和 Text。Skia 是開源的二位圖形庫;Dart 部分主要包括 runtime、Garbage Collection、編譯模式支持等;Text 是文本渲染。

Framework 在最上層。我們的應用圍繞 Framework 層來構建,因此也是本文要介紹的重點。

Framework

1.【Foundation】在底層,主要定義底層工具類和方法,以提供給其他層使用。

2.【Animation】是動畫相關的類,可以基于此創建補間動畫(Tween Animation)和物理原理動畫(Physics-based Animation),類似 Android 的 ValueAnimator 和 iOS 的 Core Animation。

3.【Painting】封裝了 Flutter Engine 提供的繪制接口,例如繪制縮放圖像、插值生成陰影、繪制盒模型邊框等。

4.【Gesture】提供處理手勢識別和交互的功能。

5.【Rendering】是框架中的渲染庫。控件的渲染主要包括三個階段:布局(Layout)、繪制(Paint)、合成(Composite)。

從下圖可以看到,Flutter 流水線包括 7 個步驟。

圖2: Flutter 流水線

首先是獲取到用戶的操作,然后你的應用會因此顯示一些動畫,接著 Flutter 開始構建 Widget 對象。

Widget 對象構建完成后進入渲染階段,這個階段主要包括三步:

  • 布局元素:決定頁面元素在屏幕上的位置和大小;
  • 繪制階段:將頁面元素繪制成它們應有的樣式;
  • 合成階段:按照繪制規則將之前兩個步驟的產物組合在一起。

末尾的光柵化由 Engine 層來完成。

在渲染階段,控件樹(widget)會轉換成對應的渲染對象(RenderObject)樹,在 Rendering 層進行布局和繪制。

在布局時 Flutter 深度優先遍歷渲染對象樹。數據流的傳遞方式是從上到下傳遞約束,從下到上傳遞大小。也就是說,父節點會將自己的約束傳遞給子節點,子節點根據接收到的約束來計算自己的大小,然后將自己的尺寸返回給父節點。整個過程中,位置信息由父節點來控制,子節點并不關心自己所在的位置,而父節點也不關心子節點具體長什么樣子。

圖3: 數據流傳遞方式

為了防止因子節點發生變化而導致的整個控件樹重繪,Flutter 加入了一個機制——Relayout Boundary,在一些特定的情形下Relayout Boundary會被自動創建,不需要開發者手動添加。

例如,控件被設置了固定大小(tight constraint)、控件忽略所有子視圖尺寸對自己的影響、控件自動占滿父控件所提供的空間等等。很好理解,就是控件大小不會影響其他控件時,就沒必要重新布局整個控件樹。有了這個機制后,無論子樹發生什么樣的變化,處理范圍都只在子樹上。

圖4: Relayout Boundary 機制

在確定每個空間的位置和大小之后,就進入繪制階段。繪制節點的時候也是深度遍歷繪制節點樹,然后把不同的 RenderObject 繪制到不同的圖層上。

這時有可能出現一種特殊情況,如下圖所示節點 2 在繪制子節點 4 時,由于其節點4需要單獨繪制到一個圖層上(如 video),因此綠色的圖層上面多了個黃顏色的圖層。之后再需要繪制其他內容(標記 5)就需要再增加一個圖層(紅色)。再接下來要繪制節點 1 的右子樹(標記 6),也會被繪制到紅色的圖層上。所以如果 2 號節點發生改變就會改變紅色的圖層上的內容,因此也影響到了毫不相干的 6 號節點。

圖5: 繪制節點與圖層的關系

為了避免這種情況,Flutter 的設計者這里基于 Relayout Boundary 的思想增加了 Repaint Boundary。在繪制頁面時候如果遇見 Repaint Boundary 就會強制切換圖層。

如下圖所示,在從上到下遍歷控件樹遇到 Repaint Boundary 會重新繪制到新的圖層(深藍色),在從下到上返回的時候又遇到 Repaint Boundary,于是又增加一個新的圖層(淺藍色)。

圖6: Repaint Boundary 機制

這樣,即使發生重繪也不會對其他子樹產生影響。比如在 Scrollview 上,當滾動的時候發生內容重繪,如果在 Scrollview 以外的地方不需要重繪就可以使用 Repaint Boundary。Repaint Boundary 并不會像 Relayout Boundary 一樣自動生成,而是需要我們自己來加入到控件樹中。

6.【Widget】控件層。所有控件的基類都是 Widget,Widget 的數據都是只讀的, 不能改變。所以每次需要更新頁面時都需要重新創建一個新的控件樹。每一個 Widget 會通過一個 RenderObjectElement 對應到一個渲染節點(RenderObject),可以簡單理解為 Widget 中只存儲了頁面元素的信息,而真正負責布局、渲染的是 RenderObject。

在頁面更新重新生成控件樹時,RenderObjectElement 樹會盡量保持重用。由于 RenderObjectElement 持有對應的 RenderObject,所有 RenderObject 樹也會盡可能的被重用。如圖所示就是三棵樹之間的關系。在這張圖里我們把形狀當做渲染節點的類型,顏色是它的屬性,即形狀不同就是不同的渲染節點,而顏色不同只是同一對象的屬性的不同。

圖7: Widget、Element 和 Render 之間的關系

如果想把方形的顏色換成黃顏色,將圓形的顏色變成紅色,由于控件是不能被修改的,需要重新生成兩個新的控件 Rectangle yellow 和 Circle red。由于只是修改了顏色屬性,所以 Element 和 RenderObject 都被重用,而之前的控件樹會被釋放回收。

圖8: 示例

那么如果把紅色圓形變成三角形又會怎樣呢?由于這里發生變化的是類型,所以對應的 Element 節點和 RenderObject 節點都需要重新創建。但是由于黃顏色方形沒有發生改變,所以其對應的 Element 節點和 RenderObject 節點沒有發生變化。

圖9: 示例

7. 然后是【Material】 & 【Cupertino】,這是在 Widget 層之上框架為開發者提供的基于兩套設計語言實現的 UI 控件,可以幫助我們的 App 在不同平臺上提供接近原生的用戶體驗。

Flutter 在馬蜂窩商家端

App 中的應用實踐

圖10: 馬蜂窩商家端使用 Flutter 開發的頁面

開發方式:Flutter + Native

由于商家端已經是一款成熟的 App,不可能創建一個新的 Flutter 工程全部重新開發,因此我們選擇 Native 與 Flutter 混編的方案來實現。

在了解 Native 與 Flutter 混編方案前,首先我們需要了解在 Flutter 工程中,通常有以下 4 種工程類型:

1. Flutter Application

標準的 Flutter App 工程,包含標準的 Dart 層與 Native 平臺層。

2. Flutter Module

Flutter 組件工程,僅包含 Dart 層實現,Native 平臺層子工程為通過 Flutter 自動生成的隱藏工程(.ios / .android)。

3. Flutter Plugin

Flutter 平臺插件工程,包含 Dart 層與 Native 平臺層的實現。

4. Flutter Package

Flutter 純 Dart 插件工程,僅包含 Dart 層的實現,往往定義一些公共 Widget。

了解了 Flutter 工程類型后,我們來看下官方提供的一種混編方案(https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps),即在現有工程下創建 Flutter Module 工程,以本地依賴的方式集成到現有的 Native 工程中。

官方集成方案(以 iOS 為例)

a. 在工程目錄創建 FlutterModule,創建后,工程目錄大致如下:

b. 在 Podfile 文件中添加以下代碼:

  1. flutter_application_path = '../flutter_Moudule/'  
  2. eval(File.read(File.join(flutter_application_path, '.ios''Flutter''podhelper.rb')), binding) 

該腳本主要負責:

  • pod 引入 Flutter.Framework 以及 FlutterPluginRegistrant 注冊入口
  • pod 引入 Flutter 第三方 plugin
  • 在每一個 pod 庫的配置文件中寫入對 Generated.xcconfig 文件的導入
  • 修改 pod 庫的 ENABLE_BITCODE = NO(因為 Flutter 現在不支持 bitcode)

c. 在 iOS 構建階段 Build Phases 中注入構建時需要執行的 xcode_backend.sh (位于 FlutterSDK/packages/flutter_tools/bin) 腳本:

  1. "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build 
  2. "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed 

該腳本主要負責:

  • 構建 App.framework 以及 Flutter.framework 產物
  • 根據編譯模式(debug/profile/release)導入對應的產物
  • 編譯 flutter_asset 資源
  • 把以上產物 copy 到對應的構建產物中

d. 與 Native 通信

  • 方案一:改造 AppDelegate 繼承自 FlutterAppDelegate
  • 方案二:AppDelegate 實現 FlutterAppLifeCycleProvider 協議,生命周期由 FlutterPluginAppLifeCycleDelegate 傳遞給 Flutter

以上就是官方提供的集成方案。我們最終沒有選擇此方案的原因,是它直接依賴于 FlutterModule 工程以及 Flutter 環境,使 Native 開發同學無法脫離 Flutter 環境開發,影響正常的開發流程,團隊合作成本較大;而且會影響正常的打包流程。(目前 Flutter 團隊正在重構嵌入 Native 工程的方式)

最終我們選擇另一種方案來解決以上的問題:遠端依賴產物。

圖11 :遠端依賴產物

iOS 集成方案

通過對官方混編方案的研究,我們了解到 iOS 工程最終依賴的其實是 FlutterModule 工程構建出的產物(Framework,Asset,Plugin),只需將產物導出并 push 到遠端倉庫,iOS 工程通過遠端依賴產物即可。

依賴產物目錄結構如下:

  • App.framework : Flutter 工程產物(包含 Flutter 工程的代碼,Debug 模式下它是個空殼,代碼在 flutter_assets 中)。
  • Flutter.framework: Flutter 引擎庫。與編譯模式(debug/profile/release)以及 CPU 架構(arm*, i386, x86_64)相匹配。
  • lib*.a & .h 頭文件 : FlutterPlugin 靜態庫(包含在 iOS 端的實現)。
  • flutter_assets: 包含 Flutter 工程字體,圖片等資源。在 Flutter1.2 版本中,被打包到 App.framework 中。

Android 集成方案

Android Nativite 集成是通過 Gradle 遠程依賴 Flutter 工程產物的方式完成的,以下是具體的集成流程。

a.創建 Flutter 標準工程

  1. $ flutter create flutter_demo 

默認使用 Java 代碼,如果增加 Kotlin 支持,使用如下命令:

  1. $ flutter create -a kotlin flutter_demo 

b. 修改工程的默認配置

  • 修改 app module 工程的 build.gradle 配置 apply plugin: 'com.android.application' => apply plugin: 'com.android.library',并移除 applicationId 配置
  • 修改 root 工程的 build.gradle 配置

在集成過程中 Flutter 依賴了三方 Plugins 后,遇到 Plugins 的代碼沒有被打進 Library 中的問題。通過以下配置解決(這種方式略顯粗暴,后續的優化方案正在調研)。

  1. subprojects { 
  2.    project.buildDir = "${rootProject.buildDir}/app" 
  • app module 增加 maven 打包配置

c. 生成 Android Flutter 產物

  1. $ cd android 
  2. $ ./gradlew uploadArchives 

官方默認的構建腳本在 Flutter 1.0.0 版本存在 Bug——最終的產物中會缺少 flutter_shared/icudtl.dat 文件,導致 App Crash。目前的解決方式是將這個文件復制到工程的 assets 下( 在 Flutter 最新 1.2.1 版本中這個 Bug 已被修復,但是 1.2.1 版本又出現了一個 UI 渲染的問題,所以只能繼續使用 1.0.0 版本)。

d. Android Native 平臺工程集成,增加下面依賴配置即可,不會影響 Native 平臺開發的同學

  1. implementation 'com.mfw.app:MerchantFlutter:0.0.5-beta' 

Flutter 和 iOS、Android 的交互

使用平臺通道(Platform Channels)在 Flutter 工程和宿主(Native 工程)之間傳遞消息,主要是通過 MethodChannel 進行方法的調用,如下圖所示:

圖12 :Flutter與iOS、Android交互

為了確保用戶界面不會掛起,消息和響應是異步傳遞的,需要用 async 修飾方法,await 修飾調用語句。Flutter 工程和宿主工程通過在 Channel 構造函數中傳遞 Channel 名稱進行關聯。單個應用中使用的所有 Channel 名稱必須是唯一的; 可以在 Channel 名稱前加一個唯一的「域名前綴」。

Flutter 與 Native 性能對比

我們分別使用 Native 和 Flutter 開發了兩個列表頁,以下是頁面效果和性能對比:

iOS 對比(機型 6P 系統 10.3.3):

Flutter 頁面:

iOS Native 頁面:

可以看到,從使用和直觀感受都沒有太大的差別。于是我們采集了一些其他方面的數據。

Flutter 頁面:

iOS Native 頁面:

另外我們還對比了商家端接入 Flutter 前后包體積的大小:39Mb → 44MB

在 iOS 機型上,流暢度上沒有什么差異。從數值上來看,Flutter 在 內存跟 GPU/CPU 使用率上比原生略高。 Demo 中并沒有對 Flutter 做更多的優化,可以看出 Flutter 整體來說還是可以做出接近于原生的頁面。

下面是 Flutter 與 Android 的性能對比。

Flutter 頁面:

Android Native 頁面:

從以上兩張對比圖可以看出,不考慮其他因素,單純從性能角度來說, 原生要優于 Flutter,但是差距并不大,而且 Flutter 具有的跨平臺開發和熱重載等特點極大地節省了開發效率。并且,未來的熱修復特性更是值得期待。

混合棧管理

首先先介紹下 Flutter 路由的管理:

  • Flutter 管理頁面有兩個概念:Route 和 Navigator。
  • Navigator 是一個路由管理的 Widget(Flutter 中萬物皆 Widget),它通過一個棧來管理一個路由 Widget 集合。通常當前屏幕顯示的頁面就是棧頂的路由。
  • 路由 (Route) 在移動開發中通常指頁面(Page),這跟 web 開發中單頁應用的 Route 概念意義是相同的,Route 在 Android 中通常指一個 Activity,在 iOS 中指一個 ViewController。所謂路由管理,就是管理頁面之間如何跳轉,通常也可被稱為導航管理。這和原生開發類似,無論是 Android 還是 iOS,導航管理都會維護一個路由棧,路由入棧 (push) 操作對應打開一個新頁面,路由出棧 (pop) 操作對應頁面關閉操作,而路由管理主要是指如何來管理路由棧。

圖14 :Flutter 路由管理

如果是純 Flutter 工程,頁面棧無需我們進行管理,但是引入到 Native 工程內,就需要考慮如何管理混合棧。并且需要解決以下幾個問題:

1. 保證 Flutter 頁面與 Native 頁面之間的跳轉從用戶體驗上沒有任何差異

2. 頁面資源化(馬蜂窩特有的業務邏輯)

3. 保證生命周期完整性,處理相關打點事件上報

4. 資源性能問題

參考了業界內的解決方法,以及項目自身的實際場景,我們選擇類似于 H5 在 Navite 中嵌入的方式,統一通過 openURL 跳轉到一個 Native 頁面(FlutterContainerVC),Native 頁面通過 addChildViewController 方式添加 FlutterViewController(負責 Flutter 頁面渲染),同時通過 channel 同步 Native 頁面與 Flutter 頁面。

  • 每一次的 push/pop 由 Native 發起,同時通過 channel 保持 Native 與 Flutter 頁面同步——在 Native 中跳轉 Flutter 頁面與跳轉原生無差異
  • 一個 Flutter 頁面對應一個 Native 頁面(FlutterContainerVC) ——解決頁面資源化
  • FlutterContainerVC 通過 addChildViewController 對單例 FlutterViewController 進行復用——保證生命周期完整性,處理相關打點事件上報
  • 由于每一個 FlutterViewController(提供 Flutter 視圖的實現)會啟動三個線程,分別是 UI 線程、GPU 線程和 IO 線程,使用單例 FlutterViewController 可以減少對資源的占用——解決資源性能問題

Flutter 應用總結

Flutter 一經發布就很受關注,除了 iOS 和 Android 的開發者,很多前端工程師也都非常看好 Flutter 未來的發展前景。相信也有很多公司的團隊已經投入到研究和實踐中了。不過 Flutter 也有很多不足的地方,值得我們注意:

  1. 雖然 1.2 版本已經發布,但是目前沒有達到完全穩定狀態,1.2 發布完了就出現了控件渲染的問題。加上 Dart 語言生態小,學習資料可能不夠豐富。
  2. 關于動態化的支持,目前 Flutter 還不支持線上動態性。如果要在 Android 上實現動態性相對容易些,iOS 由于審核原因要實現動態性可能成本很高。
  3. Flutter 中目前拿來就用的能力只有 UI 控件和 Dart 本身提供能力,對于平臺級別的能力還需要通過 channel 的方式來擴展。
  4. 已有工程遷移比較復雜,以前沉淀的 UI 控件,需要重新再實現一套。
  5. 還有一點比較有爭議,Flutter 不會從程序中拆分出額外的模板或布局語言,如 JSX 或 XM L,也不需要單獨的可視布局工具。有的人認為配合 HotReload 功能使用非常方便,但我們發現這樣代碼會有非常多的嵌套,閱讀起來有些吃力。

目前阿里的閑魚開發團隊已經將 Flutter 用于大型實踐,并應用在了比較重要的場景(如產品詳情頁),為后來者提供了良好的借鑒。馬蜂窩的移動客戶端團隊關于 Flutter 的探索才剛剛起步,前面還有很多的問題需要我們一點一點去解決。不過無論從 Google 對其的重視程度,還是我們從實踐中看到的這些優點,都讓我們對 Flutter 充滿信心,也希望在未來我們可以利用它創造更多的價值和奇跡。

路途雖遠,猶可期許。

參考文獻:

Flutter's Layered Design

https://www.youtube.com/watch?v=dkyY9WCGMi0

Flutter's Rendering Pipeline

https://www.youtube.com/watch?v=UUfXWzp0-DU&t=1955s

Flutter原理與美團的實踐https://juejin.im/post/5b6d59476fb9a04fe91aa778#comment

(題圖來源:網絡)

【本文是51CTO專欄作者馬蜂窩技術的原創文章,作者微信公眾號馬蜂窩技術(ID:mfwtech)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2019-02-18 15:23:21

馬蜂窩MESLambda

2020-01-03 09:53:36

Kafka集群優化

2020-03-22 15:49:27

Kafka馬蜂窩大數據平臺

2019-06-11 12:19:10

ABTest分流系統

2019-06-11 11:18:40

容災緩存設計

2019-02-19 15:20:12

消息總線架構異步

2019-04-12 14:22:40

馬蜂窩機票訂單

2019-04-26 15:16:02

馬蜂窩火車票系統

2022-06-20 09:00:00

深度學習人工智能研究

2019-02-27 15:24:54

馬蜂窩游搶單系統

2019-03-29 08:21:51

馬蜂窩Golang并發代理

2018-10-29 12:27:20

2020-02-21 16:20:37

系統驅動項目管理

2018-10-26 16:00:39

程序員爬蟲馬蜂窩

2023-12-13 13:15:13

平臺開發實踐

2024-04-02 08:45:08

ChatGPTAI會議人工智能

2019-12-17 14:59:27

數據中臺數據倉庫馬蜂窩

2023-02-09 07:15:52

開發FlutterReact

2018-08-15 08:52:49

爬蟲出行城市數據

2017-05-25 09:45:35

點贊
收藏

51CTO技術棧公眾號

久久99国产精品一区| 亚洲精品一区二区三区影院| 免费av一区二区三区| 无码人妻丰满熟妇区五十路| 97精品一区二区| 日韩午夜三级在线| 国产成人黄色片| 婷婷五月在线视频| 国产成人午夜片在线观看高清观看| 久久国产精品久久久| 800av在线播放| 成人黄色图片网站| 亚瑟在线精品视频| 亚洲mv在线看| 三级在线电影| 国产suv精品一区二区三区| 欧美在线视频观看| 日本老熟俱乐部h0930| 综合国产视频| 亚洲大胆美女视频| 国产精品嫩草影视| 亚洲mmav| 色悠悠亚洲一区二区| 成年人视频网站免费| 自拍视频在线播放| 久久亚洲捆绑美女| 国产 高清 精品 在线 a| 中文字幕在线观看高清| 在线亚洲国产精品网站| 欧美巨乳在线观看| 国产又色又爽又高潮免费| 香蕉久久夜色精品国产更新时间 | 午夜探花在线观看| 国产玉足榨精视频在线观看| av成人老司机| 成人羞羞视频免费| 国产精品羞羞答答在线| 男女男精品网站| 日韩免费不卡av| 国产情侣自拍av| 亚洲视频一二| 欧美精品videofree1080p| 黄色片子在线观看| 外国成人激情视频| 久久精品国产精品| 小嫩苞一区二区三区| 日韩激情一区| 色爱av美腿丝袜综合粉嫩av| 亚洲最大成人综合网| 久久综合亚洲| 亚洲人精品午夜在线观看| 狠狠人妻久久久久久综合蜜桃| 超碰97久久国产精品牛牛| 日韩欧美卡一卡二| 无码国产精品久久一区免费| 国产精品一区二区三区www| 久久视频在线观看免费| 欧美中文在线免费| 久久精品免费av| 欧美一区成人| 免费91在线视频| 26uuu亚洲国产精品| 久久免费在线观看视频| 天天干视频在线| 在线看片成人| 尤物tv国产一区| 欧美一区二区三区……| 国产又粗又猛又爽又黄的视频小说| 女人丝袜激情亚洲| 亚洲视频第一页| 国产一二三四区在线| 成人区精品一区二区婷婷| 在线免费观看羞羞视频一区二区| 调教驯服丰满美艳麻麻在线视频| 久久激情电影| 美女av一区二区三区| 真实国产乱子伦对白在线| 黑丝一区二区三区| 欧美亚洲第一区| 这里只有精品国产| 国产一区二区美女| 精品久久蜜桃| 国产黄色在线| 亚洲精品日日夜夜| 九九爱精品视频| 欧美日韩女优| 欧美成人三级在线| 国产毛片久久久久久久| 国产精品成人一区二区不卡| 久久99热这里只有精品国产| 毛片在线免费视频| 久久精品72免费观看| 成人黄动漫网站免费| 欧洲天堂在线观看| 亚洲欧洲国产日韩| 女人帮男人橹视频播放| 日本综合视频| 精品国产髙清在线看国产毛片| 日本黄色网址大全| 99久久99热这里只有精品| 久久久久久久91| 奴色虐av一区二区三区| 国产呦精品一区二区三区网站| 国产精品日韩高清| aaa在线免费观看| 亚洲午夜久久久久中文字幕久| 青青青国产在线视频| 视频精品二区| 最近中文字幕2019免费| 国产成人免费观看视频| 精品夜夜嗨av一区二区三区| 久久精品女人的天堂av| 麻豆av在线免费看| 色综合久久六月婷婷中文字幕| 亚洲高清在线不卡| 国产探花在线精品| 午夜精品久久久久久久久久久久| 一起草av在线| 国产无人区一区二区三区| 青青草国产免费| 国产不卡精品| 中文字幕日韩精品在线| 秋霞精品一区二区三区| 成人午夜大片免费观看| 国产日本欧美在线| 国产精品.xx视频.xxtv| 亚洲精品在线不卡| 日干夜干天天干| 国产成人av自拍| 妞干网这里只有精品| 日韩欧美2区| 日韩激情av在线免费观看| 久久免费视频播放| 国产成人综合精品三级| 欧美aaa在线观看| 亚洲成人毛片| 久久精品99久久久香蕉| 伊人网综合在线| 中文字幕av资源一区| 黄色国产小视频| 国产一区二区精品久| 欧美综合激情网| 网站黄在线观看| 精品国产电影一区| 捆绑凌虐一区二区三区| 香蕉亚洲视频| 乱色588欧美| 成人激情综合| 亚洲最新中文字幕| 天堂免费在线视频| 中日韩免费视频中文字幕| 天堂在线资源视频| 日韩欧美精品一区| 成人激情视频网| 黄色免费在线看| 91麻豆精品国产| 四虎永久免费在线| 国产成人精品亚洲午夜麻豆| 日本福利视频在线观看| 国产精品tv| 97视频色精品| 精品乱码一区二区三四区视频| 色婷婷综合在线| ass极品国模人体欣赏| 美女精品一区二区| 熟女熟妇伦久久影院毛片一区二区| 国产精品欧美一区二区三区不卡| 欧美日韩ab片| 四虎精品在线| 欧美系列亚洲系列| 国产av 一区二区三区| 国产成人在线电影| 青青青在线播放| 93在线视频精品免费观看| 91精品中国老女人| xxxx另类黑人| 亚洲午夜小视频| 国产美女免费看| 性久久久久久久久久久久| 六月婷婷七月丁香| 精品一区二区免费在线观看| 欧美久久在线观看| 国产伦精品一区二区三区千人斩| 成人激情视频网| 国产高清视频色在线www| 亚洲视频一区二区三区| 99热这里只有精品5| 午夜成人免费电影| www.99热| 成人美女视频在线观看18| www日韩视频| 欧美日韩亚洲一区| 欧美影视一区二区| 日韩在线视频一区二区三区| 4438全国成人免费| 岛国成人毛片| 亚洲人成在线观| 亚洲欧美激情在线观看| 欧美在线观看视频一区二区| 免费麻豆国产一区二区三区四区| 久久久99精品久久| 亚洲av无码成人精品区| 日产国产欧美视频一区精品| 久久久久久免费看| 国产精品久久久久9999赢消| 精品视频一区在线| 日韩成人在线看| 国产精品久久久久久久av电影| 成人福利影视| xxxxxxxxx欧美| 黄视频在线播放| 精品国产免费久久| 一级片一区二区三区| 欧美性xxxxxxxxx| 国产在线视频你懂的| 亚洲欧洲日产国产综合网| 日韩人妻无码精品综合区| 不卡视频一二三四| 天堂在线精品视频| 麻豆精品精品国产自在97香蕉| 日本www在线视频| 国内精品久久久久久久影视麻豆| 杨幂一区欧美专区| 国产一区日韩| 久久99影院| 国内毛片久久| aa成人免费视频| 成人日韩视频| 91精品国产综合久久男男| 性欧美videohd高精| 57pao精品| 女人让男人操自己视频在线观看| 欧美激情小视频| 天堂亚洲精品| 欧美成人在线影院| 97caopron在线视频| 色伦专区97中文字幕| 国产福利第一视频在线播放| 亚洲欧美精品伊人久久| 偷拍自拍在线| 国产午夜精品麻豆| 视频二区在线| 亚洲精品在线观看网站| 日韩一区免费视频| 亚洲国产精品久久久久久| 可以免费看毛片的网站| 欧美精品一区二区三区在线播放| 亚洲黄色小说网| 亚洲成人黄色网址| 性xxxx视频| 精品爽片免费看久久| 九色在线视频蝌蚪| 伊人久久久久久久久久| shkd中文字幕久久在线观看| 中文字幕精品久久久久| 美女羞羞视频在线观看| 久久久精品影院| 午夜影院免费在线| 国产69精品久久久| 校园春色亚洲| 国产精品福利在线观看| 日本成人一区二区| 99re视频在线| 久久香蕉精品香蕉| 任我爽在线视频精品一| 日韩欧美视频在线播放| 中国老女人av| 国产日韩欧美一区| 福利在线一区二区三区| 久久91精品久久久久久秒播| 国产人妻精品久久久久野外| 成人一区二区三区视频| 亚洲欧美色图视频| 国产精品看片你懂得| 日本a级片视频| 婷婷开心久久网| 在线免费一区二区| 日韩免费在线观看| 色在线免费视频| 日韩亚洲一区二区| 日本aa在线| 国产精品福利小视频| 欧美在线在线| 欧美日韩国产综合视频在线| 久久中文视频| 国产欧美日韩网站| 免费一级欧美片在线观看| 色诱av手机版| 久久精品男人天堂av| 手机在线免费看毛片| 精品久久中文字幕| 一区二区三区免费在线视频| 精品国产免费久久 | 精品美女在线观看| 深夜福利在线观看直播| www欧美日韩| 欧美aa在线| 亚洲aa中文字幕| 欧美禁忌电影网| 日韩精品免费一区| 视频一区国产视频| 99热超碰在线| 国产精品久久久久一区| 五月天婷婷久久| 91精品国产欧美一区二区| 九色在线视频| 久久久亚洲网站| 91亚洲精品在看在线观看高清| 久久久久久久久四区三区| 中文字幕日韩一区二区不卡| 超碰网在线观看| 成人黄色av网站在线| 情侣偷拍对白清晰饥渴难耐| 欧美日韩免费观看中文| 精品国产99久久久久久宅男i| 亚洲欧美一区二区三区久久| av在线理伦电影| 91久久精品美女| 色狮一区二区三区四区视频| 99re在线视频免费观看| 国产大陆精品国产| 久久国产波多野结衣| 欧美在线|欧美| 欧美捆绑视频| 国语自产偷拍精品视频偷 | 久久国产波多野结衣| 欧美专区日韩专区| 天堂av电影在线观看| 欧美精品videosex极品1| 日韩在线观看中文字幕| 裸体裸乳免费看| 精品系列免费在线观看| 99久久99久久精品免费看小说. | 亚洲av片在线观看| 久久免费视频这里只有精品| 婷婷综合国产| 8x8x华人在线| 国产一区二区三区四区五区美女 | 日韩欧美在线国产| 欧美一级在线免费观看| 久久久爽爽爽美女图片| av成人资源| 国产 日韩 欧美在线| 成人国产精品免费网站| 日本网站免费观看| 亚洲国产小视频在线观看| 黄色在线网站噜噜噜| 久久99精品久久久久久青青日本| 亚洲伦理一区| 亚洲国产欧美视频| 一本大道综合伊人精品热热| 久草福利在线| 成人av在线天堂| 亚洲精品国产偷自在线观看| 九色91porny| 亚洲国产精品久久人人爱蜜臀| www.综合色| 97香蕉久久夜色精品国产| 久久97精品| 久久精品网站视频| 国产精品青草综合久久久久99| 国产又粗又长又黄| 欧美理论片在线观看| 高清一区二区三区| 国产一区亚洲二区三区| 国产日韩欧美在线一区| 一区二区视频在线免费观看| 久久精品国亚洲| caoporn成人| 99热成人精品热久久66| 国产精品日韩成人| 国产富婆一级全黄大片| 午夜精品久久久久久久99热浪潮 | 自拍偷拍视频在线| 成a人片亚洲日本久久| 无码免费一区二区三区| 色偷偷9999www| 风间由美一区二区av101| www.com毛片| 中文字幕一区二区不卡| 国产77777| 国产精品久久久久久久久久新婚 | 国产又爽又黄又嫩又猛又粗| 欧美国产日韩一区二区| 偷拍自拍一区| 国产女同无遮挡互慰高潮91| 亚洲二区在线观看| 粉嫩av在线播放| 成人在线观看91| 日本午夜精品一区二区三区电影| 欧美国产日韩在线观看成人| 日韩精品中文字幕在线观看| 日本黄色成人| 免费欧美一级视频| 18成人在线视频| 欧洲天堂在线观看| caoporen国产精品| 久久精品久久99精品久久| 日本少妇xxxx动漫| 久久精品亚洲热|