精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产高潮在线观看| 国产性生活大片| 桃花岛成人影院| 国产精品福利电影一区二区三区四区| 51国偷自产一区二区三区 | 亲子伦视频一区二区三区| 色婷婷综合在线| 影音先锋成人资源网站| 午夜视频在线免费播放| 另类人妖一区二区av| 欧美精品福利视频| 免费一级特黄3大片视频| 深夜激情久久| 欧美午夜不卡在线观看免费| 国产精品videossex国产高清| 麻豆影视在线| 国产成人精品影院| 国产精品视频一区国模私拍 | 色婷婷激情一区二区三区| 麻豆md0077饥渴少妇| 人成免费电影一二三区在线观看| 国产美女精品在线| 国产成人亚洲综合青青| 久久婷婷一区二区| 99久久综合狠狠综合久久aⅴ| 亚洲激情久久久| 91丨porny丨九色| 成人四虎影院| 色综合夜色一区| heyzo亚洲| 免费污视频在线| 亚洲精品中文字幕在线观看| 小说区图片区图片区另类灬| 欧美孕妇性xxxⅹ精品hd| 国产99久久久国产精品免费看 | 中文一区二区三区四区| 欧美性感一类影片在线播放| www.com毛片| xxx.xxx欧美| 一区二区三区在线视频播放 | 在线国产日韩| 欧美国产日韩精品| 国产成人综合在线视频| 婷婷久久综合| www.xxxx精品| 国产91在线播放九色| av亚洲在线观看| 一区二区亚洲欧洲国产日韩| mm131丰满少妇人体欣赏图| 天天久久夜夜| 日韩精品欧美激情| 免费无码一区二区三区| 久久a爱视频| 亚洲第一偷拍网| 一区二区免费在线观看视频| 欧美电影在线观看完整版| 亚洲激情电影中文字幕| aa片在线观看视频在线播放| 色综合久久中文| 亚洲欧美第一页| 色欲av无码一区二区三区| 嫩草影视亚洲| 在线不卡国产精品| 精品一区二区三区蜜桃在线| av一区二区高清| 日韩在线中文视频| 亚洲综合网在线| 欧美精品入口| 97碰在线观看| 久久久久久亚洲av无码专区| 美女一区二区视频| 亚洲va电影大全| 丁香六月色婷婷| 91在线视频在线| 日韩久久在线| 成人短视频在线观看| 亚洲国产成人av网| 成熟老妇女视频| 成人四虎影院| 欧美r级电影在线观看| 一边摸一边做爽的视频17国产| 日本天堂一区| 久久精品99国产精品酒店日本| 久久久久香蕉视频| 久久国产精品亚洲77777| 国产精品视频1区| 国精产品一品二品国精品69xx| 91蜜桃婷婷狠狠久久综合9色| 日韩在线第一区| 日本孕妇大胆孕交无码| 色噜噜狠狠成人中文综合| 在线观看国产一级片| 国产厕拍一区| 中文字幕欧美精品在线| 九九在线观看视频| 日韩中文欧美在线| 电影午夜精品一区二区三区| 国产一区二区影视| 亚洲综合成人在线| 欧美自拍小视频| jazzjazz国产精品久久| 一区二区欧美亚洲| 国产无套内射又大又猛又粗又爽| 日本一区中文字幕| 国产精品视频福利| 日本中文字幕伦在线观看| 午夜精品福利视频网站| 天堂av8在线| 亚洲国产欧美日韩在线观看第一区 | 特级西西人体4444xxxx| 国产精品91一区二区三区| 97精品国产97久久久久久| 91丨porny丨在线中文 | 成人无码精品1区2区3区免费看 | 国产成人极品视频| 亚洲国产精品成人久久蜜臀| 国产精品麻豆一区二区| 国产福利视频在线播放| 高清一区二区三区| 欧美老少做受xxxx高潮| 在线观看日批视频| 久久久噜噜噜久噜久久综合| 精品视频在线观看一区| 精品国产欧美| 日韩中文字幕免费视频| 国产精品自拍第一页| 97国产一区二区| 97免费视频观看| 欧美高清hd| 久久精品一本久久99精品| 小泽玛利亚一区二区三区视频| 97国产一区二区| aa视频在线播放| jizz18欧美18| 欧美二区乱c黑人| 国产熟女精品视频| 亚洲天堂久久久久久久| 日本特黄a级片| 欧州一区二区| 国产精品十八以下禁看| av在线中文| 欧美色综合天天久久综合精品| 久久精品—区二区三区舞蹈| 免播放器亚洲| 日本亚洲自拍| 精品日本视频| 中文字幕在线观看日韩| 中文字幕制服诱惑| 国产精品久久久久久久久搜平片| 另类小说第一页| 欧美jizz| 91成人伦理在线电影| 天堂成人av| 精品成人私密视频| 成年人午夜视频| 91丨porny丨中文| 免费裸体美女网站| 日韩大片在线观看| 91欧美精品午夜性色福利在线| 超碰个人在线| 精品国产一区二区亚洲人成毛片| 日韩免费av片| 久久久综合九色合综国产精品| 日韩欧美xxxx| 欧美3p视频| 国产精品18毛片一区二区| av3级在线| 亚洲欧美日韩区| 在线观看日韩一区二区| 亚洲欧美激情一区二区| 尤物网站在线观看| 视频在线观看91| 国产又黄又爽免费视频| 动漫视频在线一区| 国产激情久久久久| 免费的黄网站在线观看| 亚洲第一天堂av| 中日精品一色哟哟| 亚洲一二三四久久| 欧美特黄一区二区三区| 精品无人码麻豆乱码1区2区| 日韩av新片网| 成人国产精品一级毛片视频| 91在线短视频| 手机在线观看av| 日韩在线观看免费高清完整版| 亚洲精品视频91| 欧美羞羞免费网站| 国产真实的和子乱拍在线观看| 国产三级精品视频| 丰满饥渴老女人hd| 久久五月激情| 免费高清一区二区三区| 日韩欧美不卡| 精品国产乱码久久久久久丨区2区| 欧美日韩尤物久久| 97久久超碰福利国产精品…| 五月婷婷在线观看| 日韩精品在线观看一区| 99在线精品视频免费观看软件| 欧美日韩国产一区中文午夜| 久久福利免费视频| 久久影音资源网| 老女人性生活视频| 青青草国产精品亚洲专区无| 69sex久久精品国产麻豆| 欧美色图一区| 精品一区2区三区| 欧美午夜在线播放| 国产不卡av在线| segui88久久综合9999| 久久久精品国产亚洲| 国产区在线视频| 亚洲韩国欧洲国产日产av | 日韩精品高清在线观看| 精品国产九九九| 欧美精品久久久久久久多人混战 | 91视频一区二区| 亚洲av无码久久精品色欲| 蜜桃精品视频在线观看| 女人天堂av手机在线| 午夜精品视频| 自拍偷拍一区二区三区| 波多野结衣在线播放一区| 久久久久久久久久久一区 | 亚洲成色777777在线观看影院| 国产乱码精品一区二区三区精东 | 亚洲不卡免费视频| 欧美丰满一区二区免费视频| 中文字幕第99页| 欧美亚洲愉拍一区二区| 老熟妇一区二区三区| 精品久久久久久亚洲国产300| 69精品久久久| 亚洲成年人网站在线观看| 久久久久久久蜜桃| 一区二区三区产品免费精品久久75| 男人晚上看的视频| 国产精品欧美一级免费| 人成免费在线视频| 国产喷白浆一区二区三区| 老熟妇一区二区| 国产偷v国产偷v亚洲高清| b站大片免费直播| 久久久久久一二三区| 永久免费成人代码| 久久久精品2019中文字幕之3| 麻豆精品免费视频| 国产欧美中文在线| 自拍偷拍你懂的| 中文字幕乱码亚洲精品一区| 日本在线观看网址| 成人欧美一区二区三区白人| 911国产在线| 亚洲美女屁股眼交| 国产亚洲第一页| 午夜精品久久久久久久久| 中文字幕亚洲高清| 色哟哟日韩精品| 一卡二卡三卡在线观看| 欧美一区二区三区系列电影| 国产黄色一区二区| 亚洲精品久久久久久久久久久久久| 手机看片1024国产| 亚洲日本成人网| 日本www在线| 欧美激情视频一区二区| 夜鲁夜鲁夜鲁视频在线播放| 国产不卡av在线| 韩国一区二区三区视频| 国产精品国产精品国产专区蜜臀ah| 国产三级精品三级在线观看国产| 久久国产主播精品| japanese国产精品| 超碰97在线看| 亚洲一区久久| 国产色视频在线播放| 不卡视频一二三| 手机看片日韩av| 亚洲在线免费播放| 黄色免费av网站| 69av一区二区三区| 色视频免费在线观看| 丝袜亚洲另类欧美重口| av中文在线资源库| 国产精品网站入口| 第四色在线一区二区| 日韩中文一区二区三区| 欧美日韩一卡| 日韩中文字幕免费在线| 国产福利一区二区三区视频在线| 欧美多人猛交狂配| 亚洲已满18点击进入久久| 波多野结衣绝顶大高潮| 欧美成人video| 137大胆人体在线观看| 97超级碰碰碰| 日韩精品一区二区三区中文| 欧美一区二区三区成人久久片| 欧美日韩在线大尺度| 国产精品视频分类| 国产99久久久国产精品潘金 | 91免费国产网站| 九九久久电影| 国产深夜男女无套内射| 国产在线一区二区| 亚洲一区二区三区日韩| 亚洲成人中文在线| 国产麻豆精品一区| 一区二区成人精品| 中文字幕在线视频网站| 国产91在线免费观看| 欧美三级小说| 不卡的av中文字幕| 97久久精品人人爽人人爽蜜臀| www欧美com| 欧美日韩免费在线视频| 三级做a全过程在线观看| 久久亚洲精品一区| 91久久久久久白丝白浆欲热蜜臀| 鲁丝一区二区三区免费| 亚洲成人直播| 国产黑丝在线视频| 国产精品白丝在线| 成年人视频免费| 亚洲欧洲激情在线| 中老年在线免费视频| 国产亚洲一区在线播放| 黄色成人精品网站| 国产精品久久久久久久99| 国产精品妹子av| 欧美亚洲另类小说| 亚洲人精品午夜在线观看| 乡村艳史在线观看| 久久久久高清| 亚洲视频播放| 欧美成人三级伦在线观看| 亚洲国产视频a| 好吊视频一区二区三区| 欧美激情三级免费| 成人av地址| 国产精品裸体瑜伽视频| www.66久久| 天堂中文在线网| 国产视频久久久久久久| av日韩亚洲| 日本中文不卡| 日本va欧美va精品发布| 正在播放国产对白害羞| 欧美夫妻性生活| 中文字幕在线观看网站| wwwxx欧美| 日韩午夜av在线| 玖玖爱在线观看| 日本久久一区二区三区| 在线免费av电影| 91免费在线观看网站| 黄色成人在线网站| 久久人人爽人人爽人人片| 日韩欧美精品网址| 69视频在线| 99中文视频在线| 国产精品婷婷| 国产123在线| 91精品国产综合久久福利软件| 午夜羞羞小视频在线观看| 国外成人在线视频网站| 视频在线观看国产精品| 91传媒免费观看| 亚洲精品一区二区三区精华液| 亚洲私拍视频| 正在播放国产精品| 99热99精品| 黄色一区二区视频| 欧美成人亚洲成人日韩成人| 农村少妇一区二区三区四区五区| 天天天干夜夜夜操| 亚洲精品久久7777| 视频在线观看你懂的| 国产精品一区=区| 激情综合电影网| 人妻精品久久久久中文| 日韩写真欧美这视频| 国产精品yjizz视频网| 亚洲a∨一区二区三区| 国产91精品免费| 婷婷激情五月综合| 色综合久综合久久综合久鬼88| 西野翔中文久久精品字幕| caoporm在线视频| 精品久久久香蕉免费精品视频| 日本中文字幕伦在线观看| 国产在线一区二| 黄网站免费久久| 久久夜色精品国产噜噜亚洲av| 欧美男插女视频| av伊人久久| www.自拍偷拍| 日韩女优毛片在线| 成人18视频在线观看|