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

解讀京東零售云mPaaS中Flutter中熱重載原理

云計算 PaaS
熟悉JS的同學,可能會嗤之以鼻,在N年前就已經用上熱重載了,但是對客戶端開發人員來說,簡直是福音。

本文要點:

  • 了解京東零售云mPaaS中Flutter的熱重載原理,有利于日常開發中高效排查問題;
  • 掌握如何調試斷點Flutter工具鏈源碼;

一、前言

1.1 熱重載是什么?

熟悉JS的同學,可能會嗤之以鼻,在N年前就已經用上熱重載了,但是對客戶端開發人員來說,簡直是福音。

那先來看下Flutter官方的定義:

  • Flutter’s hot reload feature helps you quickly and easily experiment, build UIs, add features, and fix bugs. Hot reload works by injecting updated source code files into the running
  • Dart Virtual Machine (VM). After the VM updates classes with the new versions of fields and functions, the Flutter framework automatically rebuilds the widget tree,
  • allowing you to quickly view the effects of your changes.

簡單來說,就是通過將修改后的源代碼文件注入到正在運行的 Dart 虛擬機來實現,注入之后, Flutter 會自動重新構建 widget 樹。

1.2 為什么需要熱重載?

程序猿在刀耕火種的時代,開發調試是這樣子的:

當項目不大,人數不多的情況下,畫面是非常和諧的,效率也是毋庸置疑的高效。但現實是,在大公司,項目往往很大,編譯巨慢無比,同時開發人員眾多,有著非常嚴格的流程制度,導致看起來本沒有問題的開發調試流程,變得異常的痛苦,降低了個體的效率,這里強調下,指的是個體的效率,個人認為越是完善的流程體系,對個體的約束往往越強,但從團隊的角度去看待效率,一定是能 1+ 1 大于 2 的。

而此時的心情是這樣子的:

[[424264]]

而有了熱重載,開發調試是這樣子的:

心情也就成這樣子的:

[[424266]]

1.3 拋出問題

從熱重載定義來看,不少人腦子里蹦出不少跟我一樣的疑惑:

  • 怎么知道哪個文件被修改?
  • 修改的源代碼到底被轉成什么?
  • 修改的源代碼是怎么注入到Dart虛擬機的?
  • Flutter框架又是怎么觸發widget重繪的?

同時在日常使用熱重載的過程中,也會碰到不少這樣那樣的疑惑:

  • 為什么運行flutter attach后還需要手動輸入r來熱重載?
  • 手動敲r,這么無(gou)語(shi)的設計,我們能做成自動化嗎?

當你在網上看過大量熱重載文章后,又衍生了額外的問題:

  • 嘗試去探索源碼時,case太多,怎么能模擬真實環境?能否斷點調試Flutter源碼?
  • 熱重載看著跟動態化很像,那能否運用在動態化技術上?

不急,本文會對上述疑問進行一一解答。

二、dart的熱重載

由于Flutter采用dart作為開發語言,我們先從dart角度來驗證下熱重載。

2.1 編寫驗證demo

考慮到dart執行完會關閉當前進程,我們寫了個定時器來保證進程存活,同時能看到熱重載效果。

2.2 開啟VMService

終端下執行 dart --enable-vm-service main.dart,其中的main.dart為2.1中代碼文件:

可以看到終端會不斷輸出"Hello JDFlutter"的字符。

2.3 執行熱重載

我們將main.dart文件中打印日志修改為”Hello JD”,同時打開終端輸出的Observatory鏈接地址,如下:

找到我們main.dart的Isolate(讀者可以簡單理解為是dart中的線程,只不過Isolate沒有共享內存),圖中紅圈部分,進入后找到Reload Source:

點擊Reload Source后,終端開始輸出”Hello JD”的字符,完成了一次熱重載過程,如下圖:

2.4 自動化熱重載

還是以上面為例子基礎例子,我們加入文件監聽,并且通過發送消息給vm_service來實現熱重載,代碼如下:

直接運行 dart --enable-vm-service main.dart,期間修改”Hello JDFlutter”為”Hello JD”,運行結果如下:

可以看出,我們成功實現了自動化熱重載,上述代碼跟Dart虛擬機通信步驟如下:

  • 獲取Dart VM的websocket服務URI
  • 通過URI連接上Dart VM的service
  • 通過service獲取Dart VM
  • 通過Dart VM獲取isolateId
  • 通過service重載指定isolateId的任務

2.5 Dart虛擬機可做的事情

到這里,大家可以放飛自我,Dart Service提供了大量對外協議,包含斷點、獲取虛擬機狀態,性能等協議,可以參考:Dart虛擬機服務接口。

三、Flutter的熱重載

Flutter的熱重載,本質是在封裝dart熱重載并且對不同的設備啟動安裝加載等流程,接下來準備好在Flutter源碼世界里翱翔吧,以下分析基于v1.22.5分支的源碼。

俗話說,工欲善其事必先利其器,在源碼翱翔久了,容易迷茫,找不到東西南北,看到關鍵方法,又不知道是不是代碼真實的case,需要能驗證我們的想法,最簡單的辦法打斷點,有針對性的去看源碼。

3.1 IDE斷點

Flutter源碼的下載也很簡單,這里就不贅述了,大家可以上網搜下。Flutter工具鏈的源碼位于packages/flutter_tools下。

本文是通過Android Studio(比較熟)來配置和查看源碼,配置如下:

  • 第一步,先新建一個運行配置,選Dart Command Line App;
  • 第二步,找到Flutter源碼中工具鏈的入口文件,flutter_tools.dart;
  • 第三步,輸入想運行的命令;
  • 第四步,找到要調試的Flutter工程;

一頓配置下來,就可以用工具鏈完美的debug指定Flutter工程的源碼,接下來就是選好設備,點擊debug按鈕,如下圖:

3.2 整體流程

以下是Flutter熱重載流程圖:

簡述為:

  • 代碼改動:工具會掃描工程下的文件,通過修改時間來比對哪些文件被修改;
  • 首次編譯:第一次啟動會生成全量app.dill文件;
  • 增量編譯:對修改的文件編譯生成app.dill.incremental.dill增量文件;
  • 更新文件:將增量產物推送到設備中;
  • UI更新:DartVM收到增量文件后進行合并,并通知Flutter引擎更新UI

整個過程并沒有讓App重啟,從而達到高效開發調試效果。

3.3 源碼分析

3.3.1 run命令流程

我們從flutter run命令為入口分析,類位于packages/flutter_tools/lib/executable.dart中的main()方法,run命令最終實現類位于packages/flutter_tools/lib/src/commands/run.dart。

RunCommand在構造函數中默認開啟了hot標識,如果需要關閉,要新增入參--no-hot。

從run命令的流程,可以看出,主要是做了默認參數設置,參數校驗,flutter設備初始,模式判斷等,熱重載是從HotRunner.run中開始執行。

3.3.2 熱重載流程-首次啟動

在HotRunner中,流程也并不復雜:

可以看出,HotRunner做了三件事:

  • 對目標設備,編譯生成dill文件(有人叫kernel文件,本質是一種中間描述,后文會介紹);
  • 對目標設備,安裝運行App;
  • 對目標設備進行attach,從而開啟attach;

第二步會涉及到不同平臺不同做法,對iOS和Android來說,分別對應xcrun和adb,不是本文重點,流程也比較長,以后有機會再展開講,重點說第一步和第三步。

編譯生成dill文件

最終調用到_compile方法,代碼太過于繁瑣,我們直接斷點看,如下:

從斷點信息可以獲知,dart文件會被轉為kernel文件app.dill,以下截取部分app.dill內容,可以看出app.dill是一份完整的代碼文件,包含了main.dart的內容,右邊為main.dart源文件,左邊為app.dill文件內容:

 

生成的app.dill是一份全量的代碼,接下來編譯不同設備(Android、iOS)的安裝包,同時運行指定的包。

此時生成app.dill的進程,我們暫且稱為“編譯進程”,后續熱重載增量的dill,也是驅動該進程生成。

attach設備

在上述的第二步,設備在啟動運行App時,會打開App中DartVM的Observatory服務,本質是一個websocket服務,按照自定義的jsonrpc2.0協議進行通信,在attach時,會通過URI連接上設備服務,如下圖:

連上DartVM服務后,會注冊幾個熱重載事件:reloadSources,reloadMethod,hotRestart,這幾個事件并不是注冊到App中的Dart虛擬機,而是提供給flutter tool其他命令使用,如下圖:

同時通過DartVM服務,來初始設備中flutter產物,設備中產物路徑是臨時生成,用XXX代替,產物路徑為:

  • Android中為:file:///data/user/0/com.example.flutter_app/code_cache/XXX/flutter_app/
  • iOS模擬器中為:/Users/hexianting/資源庫/Developer/CoreSimulator/Devices/BC003085-8F19-4EF3-AB84-BD44282F79B7(模擬器設備ID)/data/Containers/Data/Application/745DE582-59F1-4193-9692-131E611A9359/tmp/XXX/flutter_app/

具體代碼如下:

3.3.3 觸發熱重載

下面分別從源碼角度,看看到底做了什么?

開發者在執行flutter run或者flutter attach后,在終端中輸入r,即可體驗到重載效果,如果在Android Studio和VSCode中,直接Ctrl+S或者Cmd+S即可。

對應到源碼入口:

不管是HotReload還是HotRestart,最終都是調用HotRunner.restart方法,一路跟進,最終會到某個具體設備update方法,并再次調用上述《熱重載流程-首次啟動》中的_compile方法,通知編譯進程生成增量的dill文件app.dill.incremental.dill。那這個增量文件到底是什么呢?demo中修改字符串"Flutter Demo Home Page"為"Flutter Demo Home Page2",來看看dill文件內容:

第一張圖為修改前,第二種為修改后,第三張為增量的dill內容。可以看出增量的dill文件僅包含改動的dart文件代碼。

生成增量的dill后,會通過_DevFSHttpWriter寫入設備,如下圖:

當同步完增量文件,最后還需要通知DartVM去刷新UI界面,這個步驟就跟我們上述的2.4節內容類似:

vmService.reloadSources最終調用了_call方法,這是一個dart官方庫,如下:

HotRestart與HotReload區別

Flutter官方提供兩種快速調試方法,一種是HotReload,另一種是HotRestart。前者無感知局部刷新,體驗最好,但是缺點也很明顯,適用比較局限,可以參考官網給出樣例:HotReload,主要有這幾種場景不適用:

  • enum改成class類;
  • 字體修改;
  • 泛類型修改;
  • Android和iOS原生修改;

而在HotRestart流程中,相比HotReload流程,增加了清除資源操作,同時不再生成增量的dill文件,每次改動都是生成全量的app.dill文件,該細節就不展開,感興趣讀者可以debug源碼看。

上述可以看出HotRestart額外處理了一些事情,包括殺掉非UI的isolate,重置UI的isolate等。

對于dill文件同步到設備中位置,不同設備不一樣:

  • Android:file:///data/user/0/com.example.flutter_app/code_cache/XXX/flutter_app/lib/
  • iOS模擬器:/Users/hexianting/Library/Developer/CoreSimulator/Devices/BC003085-8F19-4EF3-AB84-BD44282F79B7(模擬器設備ID)/data/Containers/Data/Application/9C8E4694-AC99-4A5C-BC46-63567F1C6FD9/tmp/XXX/flutter_app/lib/

至此,熱重載源碼就告一段落,很多奇技淫巧并不能一一展現,值得大家動手去看看。

四、總結

經過上述一頓探索,文章最早提出的幾個疑問,想必都有了答案。這里只是介紹了Flutter源碼的冰山一角,更多源碼還需要繼續探索,通過閱讀源碼,可做的事情很多:

  • 通過文件監聽+vm_service通信,干掉手動輸入r或者R的這種無(gou)語(shi)設計;
  • 源碼中并沒有限制多個設備,flutter run同時運行在多個模擬器中,并開啟熱重載;
  • iOS模擬器不重新安裝App的情況下,直接替換模擬器中的flutter產物,以達到快速調試手段;
  • debug狀態下的DartVM可以通過熱重載來動態化,但性能較低,與谷歌Flutter的高性能目標不符;

總之,可做的事情很多,那我們看源碼的意義就非常清晰:

  • 深入了解Flutter運行機制,去定制Flutter框架;
  • 通過研究這些頂級工程師的實現思路,去完善我們自己的邏輯體系,從而成為一個更加嚴謹的人。

五、參考資料

  • https://flutter.dev/docs/development/tools/hot-reload
  • http://gityuan.com/2019/09/07/flutter_run/
  • https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
  • http://static.kancloud.cn/alex_wsc/flutter_demo/1570089

 

責任編輯:未麗燕 來源: 京東零售云
相關推薦

2021-09-17 18:40:55

京東mPaaS移動端

2024-07-11 08:09:21

2019-03-21 19:19:35

新零售阿里云零售云

2021-09-16 18:44:05

京東云PaaS平臺Android

2018-01-22 10:33:01

云計算 新零售

2021-11-04 08:00:00

人工智能機器學習技術

2023-03-30 10:06:58

2016-10-19 18:31:13

云存儲

2023-05-11 08:00:30

2021-09-08 18:12:57

京東零售云

2018-03-20 09:56:50

新零售

2017-09-30 10:00:41

2018-06-06 17:39:03

2022-05-18 13:24:47

京東調優實踐

2022-06-28 13:41:43

京東數據處理

2019-07-17 05:33:33

零售物聯網IOT

2020-06-07 10:07:04

機器人零售業人工智能

2020-02-05 13:00:51

云計算數據開發
點贊
收藏

51CTO技術棧公眾號

成年人免费高清视频| 日本精品一级二级| 91精品国产综合久久精品性色| 国产视频一区二区三区四区| 日韩在线观看视频一区二区| 日韩久久一区二区三区| 亚洲黄色视屏| 欧美精品123区| 欧美人xxxxx| 日韩成人一区二区三区| 精品国产第一国产综合精品| 欧美韩日一区二区三区四区| 4438全国亚洲精品在线观看视频| 中文字幕一二三区| 美女羞羞视频在线观看| blacked蜜桃精品一区| 图片区小说区国产精品视频| 国产精华一区| 国产精品999久久久| 欧美日韩黄网站| 欧美日韩在线视频观看| 九九久久99| 老熟妇仑乱一区二区av| 日韩三级av| 色综合久久六月婷婷中文字幕| 精品国产乱码久久久久久蜜柚 | 久久一区二区三区四区| 欧美国产视频一区二区| 永久看看免费大片| 久久久人成影片一区二区三区在哪下载| 艳妇臀荡乳欲伦亚洲一区| 成人在线资源网址| 中文字幕无码乱码人妻日韩精品| 欧州一区二区| 日韩av网址在线观看| av免费观看网| 久久视频www| 日韩电影在线观看网站| 视频在线观看99| 成人亚洲免费视频| 色呦呦视频在线观看| 成人av在线影院| 91成人在线观看国产| 国产精品后入内射日本在线观看| 成人黄色网址| 成人高清视频免费观看| 亚洲综合国产精品| 免费毛片一区二区三区| 一本一道久久综合狠狠老| 欧美大片在线观看一区| 欧美大片在线播放| xxxxx日韩| 国产精品 日产精品 欧美精品| 久久青草精品视频免费观看| 免费人成又黄又爽又色| 国产精品亚洲一区二区在线观看| 亚洲电影一区二区三区| 色婷婷精品国产一区二区三区| 国产又粗又猛视频| 国产视频一区在线观看一区免费| 色噜噜狠狠狠综合曰曰曰 | 艳妇乳肉豪妇荡乳av无码福利| 禁断一区二区三区在线| 日韩视频中午一区| 97在线播放视频| 欧美激情黑人| 1区2区3区欧美| 久久99精品久久久久久久青青日本| 性一交一乱一乱一视频| 久久精品一区二区国产| 不卡av在线网站| 18禁裸乳无遮挡啪啪无码免费| 亚洲狼人综合| 欧美午夜www高清视频| 欧美h视频在线观看| 日本亚洲一区| 国产精品一区二区免费不卡 | 日韩久久免费视频| 中文字幕在线视频精品| 国产成人免费av一区二区午夜| 在线播放视频一区| 国产又大又硬又粗| 欧美大片免费高清观看| 一区二区三区久久久| 99久久免费观看| 色综合久久影院| 97超碰欧美中文字幕| 亚洲一区久久久| 亚洲精品成人电影| 久久在线免费观看| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 婷婷色在线观看| 国产一区二区日韩精品| 国产精品久久久久久久久久ktv | 国产永久免费高清在线观看| 国产黄人亚洲片| 精品国产二区在线| 日韩免费啪啪| 精品久久久久久久中文字幕| 少妇网站在线观看| 九色porny丨首页入口在线| 亚洲视频狠狠干| 丝袜足脚交91精品| 性欧美ⅴideo另类hd| 狠狠久久五月精品中文字幕| 亚洲精品久久久久久宅男| 激情都市亚洲| 欧美视频一二三| 亚洲天堂国产视频| 亚洲动漫在线观看| 日韩高清免费在线| 精品日韩在线视频| 日韩久久视频| 国产一区二区三区中文 | 伊人网av在线| 成人午夜精品一区二区三区| 亚洲xxxxx性| 四虎国产精品永远| 久久综合久久久久88| 91香蕉视频网址| 亚洲欧洲自拍| 日本黄色一区二区| 人妻换人妻a片爽麻豆| 成人爽a毛片| 亚洲高清久久久久久| 久久人妻一区二区| 天海翼精品一区二区三区| 欧美久久精品一级黑人c片| 中文字幕在线1| 亚洲大胆视频| 97婷婷涩涩精品一区| 天天操夜夜操视频| 日韩**一区毛片| 成人福利在线视频| www.国产精品视频| 99久久精品国产一区二区三区 | 日韩欧美在线免费| 久久精品aⅴ无码中文字字幕重口| 欧美高清一级片| 中文字幕日韩免费视频| 国产高潮流白浆| 日韩不卡一区二区三区| 欧美不卡在线一区二区三区| 成人动漫在线播放| 欧美日韩中文字幕日韩欧美| 中文字幕第3页| 国产精品嫩草影院在线看| 久久人人97超碰精品888| 国产成人三级一区二区在线观看一| 成人久久18免费网站麻豆 | 受虐m奴xxx在线观看| 国产成人精品三级高清久久91| 97久久国产精品| 亚洲精品国产手机| 亚洲一区二区精品视频| 国产特级黄色大片| 欧美1区二区| 色天天综合狠狠色| 伊人精品在线视频| 中文字幕一区二区视频| 日韩中字在线观看| 欧美videos粗暴| 亚洲国产精品99久久| 国产亚洲精品久久久久久打不开| 久久亚洲综合| 97久久天天综合色天天综合色hd | 亚洲精品视频在线播放| 日韩av电影网址| 91视频.com| 欧美 国产 精品| 国产精品迅雷| 一区三区二区视频| 国产一区二区在线视频观看| 亚洲精品免费电影| 亚洲高清在线免费观看| 高清一区二区三区| 久热精品在线视频| 亚洲精品无amm毛片| 亚洲成人av福利| 少妇按摩一区二区三区| 青青草成人在线观看| 不卡中文字幕在线| jizz国产精品| 国产mv久久久| 亚洲aⅴ在线观看| 一区二区三区中文字幕电影 | 国产免费区一区二区三视频免费 | 一区不卡字幕| 97色成人综合网站| 热99在线视频| 日本xxxx人| 亚洲精品乱码久久久久久黑人 | 国产午夜精品在线观看| 国产精品无码免费专区午夜| 秋霞影视一区二区三区| 国产精品美女主播| 男人的天堂在线| 91精品久久久久久久91蜜桃 | 色先锋aa成人| 国产在线观看免费视频软件| 久久国产直播| 综合操久久久| 先锋影音网一区二区| 国产亚洲视频在线| 亚洲 日本 欧美 中文幕| 99精品欧美一区| 日本高清久久久| 国产一区二区三区的电影| 在线视频精品一区| 亚洲国产精品嫩草影院久久av| 成人网在线免费看| 超碰国产一区| 久久久久国产一区二区三区| 亚洲国产成人在线观看| 91黄色免费看| 日本一级黄色大片| 亚洲日韩欧美一区二区在线| 免费毛片视频网站| 成人免费不卡视频| 欧美xxxxxbbbbb| 综合国产精品| 日韩欧美一区二区三区久久婷婷| 国产一区二区三区朝在线观看| 亚洲天堂第二页| 中文字幕免费高清在线观看| 欧美日韩精品在线| 九九热精品在线观看| 成人av在线网站| 成人黄色一级大片| 日韩高清不卡一区二区三区| 日韩欧美一区三区| 亚洲国产日本| 欧美日韩午夜爽爽| 9999国产精品| 97人摸人人澡人人人超一碰| 不卡亚洲精品| 欧美成aaa人片免费看| 成人综合影院| 亚洲情综合五月天| 瑟瑟在线观看| 日韩精品亚洲视频| 日本毛片在线观看| 亚洲成色www8888| 欧美一级在线免费观看| 欧美成人欧美edvon| 中文字幕亚洲高清| 亚洲电影一区二区| 精品少妇一二三区| 亚洲一区二区三区四区的| 少妇久久久久久被弄高潮| 97久久久精品综合88久久| 美女露出粉嫩尿囗让男人桶| 国产电影一区二区三区| 亚洲少妇中文字幕| 粉嫩蜜臀av国产精品网站| 国产精品97在线| 久久人人超碰| 国产精品天天av精麻传媒| 亚洲成人精品| 久久综合伊人77777麻豆| 亚洲高清极品| 色噜噜一区二区| 色狮一区二区三区四区视频| 亚洲一区精品视频| 亚洲五月综合| 欧美一级免费播放| 免费亚洲婷婷| 成人污网站在线观看| 久久不见久久见中文字幕免费 | 这里只有精品6| 欧美日韩国产综合视频在线观看中文| 日韩aaaaaa| 91久久精品一区二区三区| 亚洲网站免费观看| 欧美成人一区二区三区在线观看| 黄色小视频免费在线观看| 欧美午夜一区二区| 欧美三日本三级少妇99| 亚洲精品成a人| 日韩av在线播放观看| 欧美综合久久久| 日本特级黄色片| 欧美色爱综合网| 国产女同在线观看| 色综合久久久久久久久| 在线亚洲欧美日韩| 精品国产一区二区三区av性色| 国产又粗又猛视频| 日韩欧美999| 在线观看免费中文字幕| 欧美精品一区男女天堂| 国产人成在线观看| 精品一区二区三区电影| 日本不卡不卡| 97色在线观看| 成人影院在线免费观看| 91视频免费进入| 九色成人国产蝌蚪91| 国产日产欧美一区二区| 97久久视频| 国产精品久久中文字幕| 麻豆精品在线播放| 国产三级三级看三级| 蜜桃一区二区三区四区| caoporn超碰97| 国产99久久久国产精品| 国产美女免费网站| 亚洲一区电影777| 亚洲中文字幕在线观看| 日韩成人免费视频| 18av在线视频| 久久久久久久爱| 欧美黄页免费| 欧美精品一区在线| 欧美日韩国产探花| 欧美黄色免费网址| 蜜乳av一区二区| 久久精品国产亚洲av麻豆| 一区二区欧美国产| 国产精品呻吟久久| 尤物yw午夜国产精品视频明星| 久草在线资源福利站| www.成人三级视频| 久久97久久97精品免视看秋霞| 精品91免费| 欧美视频成人| 一级黄色片在线免费观看| 国产精品亚洲成人| 一本在线免费视频| 亚洲男同性恋视频| 在线免费观看毛片| 日韩一级视频免费观看在线| 91se在线| 欧美激情久久久| 精品视频成人| 欧美亚洲视频一区| 免费成人性网站| 久久久免费看片| 欧美视频一区在线观看| 成人在线观看黄色| 日本中文字幕不卡免费| 亚洲精品动态| 一本大道熟女人妻中文字幕在线 | 777视频在线| 国产午夜精品在线观看| 日韩久久久久久久久久| 亚洲视频精品在线| 日本在线中文字幕一区二区三区| 欧美日韩系列| 石原莉奈一区二区三区在线观看 | 亚洲系列另类av| 久久精品99国产| 久久久久久9999| 永久免费看mv网站入口| 欧美日韩你懂的| 黄色成人一级片| 欧美激情一区二区三区久久久| 亚洲一区 二区| 青娱乐一区二区| 欧美日韩伊人| 精品伦一区二区三区| 亚洲一区二区在线播放相泽| 欧美性猛交 xxxx| 2020久久国产精品| 精品久久久久久久久久久下田| 亚洲综合色在线观看| 最新热久久免费视频| 亚洲国产综合一区| 91国产视频在线| 精品成人影院| 樱花草www在线| 亚洲伊人色欲综合网| 色偷偷在线观看| 国产成人97精品免费看片| 荡女精品导航| 免费男同深夜夜行网站| www.久久精品| 欧美一区免费观看| 欧美在线观看视频一区二区三区 | 欧美黑人国产人伦爽爽爽| youjizz欧美| 人妻内射一区二区在线视频| 国产精品视频在线看| 日韩美一区二区| 日韩亚洲欧美中文高清在线| 性欧美1819sex性高清| 一本久久a久久精品vr综合 | 国内精品久久99人妻无码| 91福利在线播放| 在线看三级电影| 欧美亚洲免费高清在线观看| 韩国一区二区在线观看| 久久亚洲无码视频| 色综合色综合色综合色综合色综合 | 日韩av一二三| 激情小说中文字幕| 国产一区二区三区毛片| 成人线上播放| 777一区二区| 岛国av一区二区三区|