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

Android徹底組件化方案實踐

移動開發 Android
項目發展到一定程度,隨著人員的增多,代碼越來越臃腫,這時候就必須進行模塊化的拆分。在我看來,模塊化是一種指導理念,其核心思想就是分而治之、降低耦合。而在 Android 工程中如何實施,目前有兩種途徑,也是兩大流派,一個是組件化,一個是插件化。

一、模塊化、組件化與插件化

項目發展到一定程度,隨著人員的增多,代碼越來越臃腫,這時候就必須進行模塊化的拆分。在我看來,模塊化是一種指導理念,其核心思想就是分而治之、降低耦合。而在 Android 工程中如何實施,目前有兩種途徑,也是兩大流派,一個是組件化,一個是插件化。

提起組件化和插件化的區別,有一個很形象的圖:

 

 

 

 

上面的圖看上去比較清晰,其實容易導致一些誤解,有下面幾個小問題,圖中可能說的不太清楚:

組件化是一個整體嗎?去了頭和胳膊還能存在嗎?左圖中,似乎組件化是一個有機的整體,需要所有器官都健在才可以存在。而實際上組件化的目標之一就是降低整體(app)與器官(組件)的依賴關系,缺少任何一個器官 app 都是可以存在并正常運行的。

頭和胳膊可以單獨存在嗎?左圖也沒有說明白,其實答案應該是肯定的。每個器官(組件)可以在補足一些基本功能之后都是可以獨立存活的。這個是組件化的第二個目標:組件可以單獨運行。

組件化和插件化可以都用右圖來表示嗎?如果上面兩個問題的答案都是 YES 的話,這個問題的答案自然也是 YES。每個組件都可以看成一個單獨的整體,可以按需的和其他組件(包括主項目)整合在一起,從而完成的形成一個 app。

右圖中的小機器人可以動態的添加和修改嗎?如果組件化和插件化都用右圖來表示,那么這個問題的答案就不一樣了。對于組件化來講,這個問題的答案是部分可以,也就是在編譯期可以動態的添加和修改,但是在運行時就沒法這么做了。而對于插件化,這個問題的答案很干脆,那就是完全可以,不論實在編譯期還是運行時!

本文主要集中講的是組件化的實現思路,對于插件化的技術細節不做討論,我們只是從上面的問答中總結出一個結論:組件化和插件化的***區別(應該也是唯一區別)就是組件化在運行時不具備動態添加和修改組件的功能,但是插件化是可以的。

暫且拋棄對插件化“道德”上的批判,我認為對于一個 Android 開發者來講,插件化的確是一個福音,這將使我們具備極大的靈活性。但是苦于目前還沒有一個完全合適、***兼容的插件化方案(RePlugin 的饑餓營銷做的很好,但還沒看到療效),特別是對于已經有幾十萬代碼量的一個成熟產品來講,套用任何一個插件化方案都是很危險的工作。所以我們決定先從組件化做起,本著做一個最徹底的組件化方案的思路去進行代碼的重構,下面是最近的思考結果,歡迎大家提出建議和意見。

二、如何實現組件化

要實現組件化,不論采用什么樣的技術路徑,需要考慮的問題主要包括下面幾個:

  • 代碼解耦。如何將一個龐大的工程拆分成有機的整體?
  • 組件單獨運行。上面也講到了,每個組件都是一個完整的整體,如何讓其單獨運行和調試呢?
  • 數據傳遞。因為每個組件都會給其他組件提供的服務,那么主項目(Host)與組件、組件與組件之間如何傳遞數據?
  • UI 跳轉。UI 跳轉可以認為是一種特殊的數據傳遞,在實現思路上有啥不同?
  • 組件的生命周期。我們的目標是可以做到對組件可以按需、動態的使用,因此就會涉及到組件加載、卸載和降維的生命周期。
  • 集成調試。在開發階段如何做到按需的編譯組件?一次調試中可能只有一兩個組件參與集成,這樣編譯的時間就會大大降低,提高開發效率。
  • 代碼隔離。組件之間的交互如果還是直接引用的話,那么組件之間根本沒有做到解耦,如何從根本上避免組件之間的直接引用呢?也就是如何從根本上杜絕耦合的產生呢?只有做到這一點才是徹底的組件化。

2.1 代碼解耦

把龐大的代碼進行拆分,Androidstudio 能夠提供很好的支持,使用 IDE 中的 multiple module 這個功能,我們很容易把代碼進行初步的拆分。在這里我們對兩種 module 進行區分:

  • 一種是基礎庫 library,這些代碼被其他組件直接引用。比如網絡庫 module 可以認為是一個 library。
  • 另一種我們稱之為 Component,這種 module 是一個完整的功能模塊。比如讀書或者分享 module 就是一個 Component。

為了方便,我們統一把 library 稱之為依賴庫,而把 Component 稱之為組件,我們所講的組件化也主要是針對 Component 這種類型。而負責拼裝這些組件以形成一個完成 app 的 module,一般我們稱之為主項目、主 module 或者 Host,方便起見我們也統一稱為主項目。

經過簡單的思考,我們可能就可以把代碼拆分成下面的結構:

 

 

組件化簡單拆分

 

 

這種拆分都是比較容易做到的,從圖上看,讀書、分享等都已經拆分組件,并共同依賴于公共的依賴庫(簡單起見只畫了一個),然后這些組件都被主項目所引用。讀書、分享等組件之間沒有直接的聯系,我們可以認為已經做到了組件之間的解耦。但是這個圖有幾個問題需要指出:

  • 從上面的圖中,我們似乎可以認為組件只有集成到主項目才可以使用,而實際上我們的希望是每個組件是個整體,可以獨立運行和調試,那么如何做到單獨的調試呢?
  • 主項目可以直接引用組件嗎?也就是說我們可以直接使用 compile project(:reader) 這種方式來引用組件嗎?如果是這樣的話,那么主項目和組件之間的耦合就沒有消除啊。我們上面講,組件是可以動態管理的,如果我們刪掉 reader(讀書)這個組件,那么主項目就不能編譯了啊,談何動態管理呢?所以主項目對組件的直接引用是不可以的,但是我們的讀書組件最終是要打到 apk 里面,不僅代碼要和并到 claases.dex 里面,資源也要經過 meage 操作合并到 apk 的資源里面,怎么避免這個矛盾呢?
  • 組件與組件之間真的沒有相互引用或者交互嗎?讀書組件也會調用分享模塊啊,而這在圖中根本沒有體現出來啊,那么組件與組件之間怎么交互呢?

這些問題我們后面一個個來解決,首先我們先看代碼解耦要做到什么效果,像上面的直接引用并使用其中的類肯定是不行的了。所以我們認為代碼解耦的首要目標就是組件之間的完全隔離,我們不僅不能直接使用其他組件中的類,***能根本不了解其中的實現細節。只有這種程度的解耦才是我們需要的。

2.2 組件的單獨調試

其實單獨調試比較簡單,只需要把 apply plugin: 'com.android.library'切換成 apply plugin: 'com.android.application'就可以,但是我們還需要修改一下 AndroidManifest 文件,因為一個單獨調試需要有一個入口的 actiivity。

我們可以設置一個變量 isRunAlone,標記當前是否需要單獨調試,根據 isRunAlone 的取值,使用不同的 gradle 插件和 AndroidManifest 文件,甚至可以添加 Application 等 Java 文件,以便可以做一下初始化的操作。

為了避免不同組件之間資源名重復,在每個組件的 build.gradle 中增加 resourcePrefix "xxx_",從而固定每個組件的資源前綴。下面是讀書組件的 build.gradle 的示例:

  1. if(isRunAlone.toBoolean()){     
  2. apply plugin: 'com.android.application' 
  3. }else{   
  4. apply plugin: 'com.android.library' 
  5. ..... 
  6.   resourcePrefix "readerbook_" 
  7.   sourceSets { 
  8.       main { 
  9.           if (isRunAlone.toBoolean()) { 
  10.               manifest.srcFile 'src/main/runalone/AndroidManifest.xml' 
  11.               java.srcDirs = ['src/main/java','src/main/runalone/java'
  12.               res.srcDirs = ['src/main/res','src/main/runalone/res'
  13.           } else { 
  14.               manifest.srcFile 'src/main/AndroidManifest.xml' 
  15.           } 
  16.       } 
  17.   } 

 

通過這些額外的代碼,我們給組件搭建了一個測試 Host,從而讓組件的代碼運行在其中,所以我們可以再優化一下我們上面的框架圖。

 

 

支持單獨調試的組件化

 

 

2.3 組件的數據傳輸

上面我們講到,主項目和組件、組件與組件之間不能直接使用類的相互引用來進行數據交互。那么如何做到這個隔離呢?在這里我們采用接口 + 實現的結構。每個組件聲明自己提供的服務 Service,這些 Service 都是一些抽象類或者接口,組件負責將這些 Service 實現并注冊到一個統一的路由 Router 中去。如果要使用某個組件的功能,只需要向 Router 請求這個 Service 的實現,具體的實現細節我們全然不關心,只要能返回我們需要的結果就可以了。這與 Binder 的 C/S 架構很相像。

因為我們組件之間的數據傳遞都是基于接口編程的,接口和實現是完全分離的,所以組件之間就可以做到解耦,我們可以對組件進行替換、刪除等動態管理。這里面有幾個小問題需要明確:

組件怎么暴露自己提供的服務呢?在項目中我們簡單起見,專門建立了一個 componentservice 的依賴庫,里面定義了每個組件向外提供的 service 和一些公共 model。將所有組件的 service 整合在一起,是為了在拆分初期操作更為簡單,后面需要改為自動化的方式來生成。這個依賴庫需要嚴格遵循開閉原則,以避免出現版本兼容等問題。

service 的具體實現是由所屬組件注冊到 Router 中的,那么是在什么時間注冊的呢?這個就涉及到組件的加載等生命周期,我們在后面專門介紹。

一個很容易犯的小錯誤就是通過持久化的方式來傳遞數據,例如 file、sharedpreference 等方式,這個是需要避免的。

下面就是加上數據傳輸功能之后的架構圖:

 

 

組件之間的數據傳輸

 

 

2.4 組件之間的 UI 跳轉

可以說 UI 的跳轉也是組件提供的一種特殊的服務,可以歸屬到上面的數據傳遞中去。不過一般 UI 的跳轉我們會單獨處理,一般通過短鏈的方式來跳轉到具體的 Activity。每個組件可以注冊自己所能處理的短鏈的 schme 和 host,并定義傳輸數據的格式。然后注冊到統一的 UIRouter 中,UIRouter 通過 schme 和 host 的匹配關系負責分發路由。

UI 跳轉部分的具體實現是通過在每個 Activity 上添加注解,然后通過 apt 形成具體的邏輯代碼。這個也是目前 Android 中 UI 路由的主流實現方式。

2.5 組件的生命周期

由于我們要動態的管理組件,所以給每個組件添加幾個生命周期狀態:加載、卸載和降維。為此我們給每個組件增加一個 ApplicationLike 類,里面定義了 onCreate 和 onStop 兩個生命周期函數。

加載:上面講了,每個組件負責將自己的服務實現注冊到 Router 中,其具體的實現代碼就寫在 onCreate 方法中。那么主項目調用這個 onCreate 方法就稱之為組件的加載,因為一旦 onCreate 方法執行完,組件就把自己的服務注冊到 Router 里面去了,其他組件就可以直接使用這個服務了。

卸載:卸載與加載基本一致,所不同的就是調用 ApplicationLike 的 onStop 方法,在這個方法中每個組件將自己的服務實現從 Router 中取消注冊。不過這種使用場景可能比較少,一般適用于一些只用一次的組件。

降維:降維使用的場景更為少見,比如一個組件出現了問題,我們想把這個組件從本地實現改為一個 wap 頁。降維一般需要后臺配置才生效,可以在 onCreate 對線上配置進行檢查,如果需要降維,則把所有的 UI 跳轉到配置的 wap 頁上面去。

一個小的細節是,主項目負責加載組件,由于主項目和組件之間是隔離的,那么主項目如何調用組件 ApplicationLike 的生命周期方法呢,目前我們采用的是基于編譯期字節碼插入的方式,掃描所有的 ApplicationLike 類(其有一個共同的父類),然后通過 javassisit 在主項目的 onCreate 中插入調用 ApplicationLike.onCreate 的代碼。

我們再優化一下組件化的架構圖:

 

 

 

 

組件的生命周期

2.6 集成調試

每個組件單獨調試通過并不意味著集成在一起沒有問題,因此在開發后期我們需要把幾個組件機集成到一個 app 里面去驗證。由于我們上面的機制保證了組件之間的隔離,所以我們可以任意選擇幾個組件參與集成。這種按需索取的加載機制可以保證在集成調試中有很大的靈活性,并且可以加大的加快編譯速度。

我們的做法是這樣的,每個組件開發完成之后,發布一個 relaese 的 aar 到一個公共倉庫,一般是本地的 maven 庫。然后主項目通過參數配置要集成的組件就可以了。所以我們再稍微改動一下組件與主項目之間的連接線,形成的最終組件化架構圖如下:

 

 

 

 

最終結構圖

2.7 代碼隔離

此時在回顧我們在剛開始拆分組件化是提出的三個問題,應該說都找到了解決方式,但是還有一個隱患沒有解決,那就是我們可以使用 compile project(xxx:reader.aar) 來引入組件嗎?雖然我們在數據傳輸章節使用了接口 + 實現的架構,組件之間必須針對接口編程,但是一旦我們引入了 reader.aar,那我們就完全可以直接使用到其中的實現類啊,這樣我們針對接口編程的規范就成了一紙空文。千里之堤毀于蟻穴,只要有代碼(不論是有意還是無意)是這么做了,我們前面的工作就白費了。

我們希望只在 assembleDebug 或者 assembleRelease 的時候把 aar 引入進來,而在開發階段,所有組件都是看不到的,這樣就從根本上杜絕了引用實現類的問題。我們把這個問題交給 gradle 來解決,我們創建一個 gradle 插件,然后每個組件都 apply 這個插件,插件的配置代碼也比較簡單:

  1. // 根據配置添加各種組件依賴,并且自動化生成組件加載代碼 
  2. if (project.android instanceof AppExtension) { 
  3.        AssembleTask assembleTask = getTaskInfo(project.gradle.startParameter.taskNames) 
  4.        if (assembleTask.isAssemble 
  5.                && (assembleTask.modules.contains("all") || assembleTask.modules.contains(module))) { 
  6.          // 添加組件依賴 
  7.           project.dependencies.add("compile","xxx:reader-release@aar"
  8.          // 字節碼插入的部分也在這里實現 
  9.        } 
  10.  
  11. private AssembleTask getTaskInfo(List<String> taskNames) { 
  12.    AssembleTask assembleTask = new AssembleTask(); 
  13.    for (String task : taskNames) { 
  14.        if (task.toUpperCase().contains("ASSEMBLE")) { 
  15.            assembleTask.isAssemble = true
  16.            String[] strs = task.split(":"
  17.            assembleTask.modules.add(strs.length > 1 ? strs[strs.length - 2] : "all"); 
  18.        } 
  19.    } 
  20.    return assembleTask 

 

三、組件化的拆分步驟和動態需求

3.1 拆分原則

組件化的拆分是個龐大的工程,特別是從幾十萬行代碼的大工程拆分出去,所要考慮的事情千頭萬緒。為此我覺得可以分成三步:

從產品需求到開發階段再到運營階段都有清晰邊界的功能開始拆分,比如讀書模塊、直播模塊等,這些開始分批先拆分出去

在拆分中,造成組件依賴主項目的依賴的模塊繼續拆出去,比如賬戶體系等

最終主項目就是一個 Host,包含很小的功能模塊(比如啟動圖)以及組件之間的拼接邏輯

3.2 組件化的動態需求

最開始我們講到,理想的代碼組織形式是插件化的方式,屆時就具備了完備的運行時動態化。在向插件化遷徙的過程中,我們可以通過下面的集中方式來實現編譯速度的提升和動態更新。

在快速編譯上,采用組件級別的增量編譯。在抽離組件之前可以使用代碼級別的增量編譯工具如 freeline(但 databinding 支持較差)、fastdex 等

動態更新方面,暫時不支持新增組件等大的功能改進。可以臨時采用方法級別的熱修復或者功能級別的 Tinker 等工具,Tinker 的接入成本較高。

四、總結

本文是筆者在設計“得到 app”的組件化中總結一些想法,在設計之初參考了目前已有的組件化和插件化方案,站在巨人的肩膀上又加了一點自己的想法,主要是組件化生命周期以及完全的代碼隔離方面。特別是***的代碼隔離,不僅要有規范上的約束(針對接口編程),更要有機制保證開發者不犯錯,我覺得只有做到這一點才能認為是一個徹底的組件化方案。 

責任編輯:龐桂玉 來源: 移動開發前線
相關推薦

2022-01-17 11:41:50

前端Vite組件

2017-01-19 18:58:11

iOS組件化方案

2022-08-03 09:58:03

跨端框架實踐

2021-09-16 18:44:05

京東云PaaS平臺Android

2017-05-18 11:43:41

Android模塊化軟件

2019-07-22 10:42:11

React組件前端

2020-03-03 14:15:49

Redis持久化數據庫

2020-12-29 08:04:16

可視化地圖組件日歷組件

2017-02-13 18:46:38

Android模塊化組件化

2021-05-13 08:55:33

Android架構功能

2017-05-17 15:50:34

開發前端react

2019-01-15 14:11:50

Android框架組件化

2018-05-04 14:00:24

2022-05-26 10:13:22

C/C++GCC插件單元測試

2015-12-16 13:34:27

斐訊

2019-02-19 10:12:41

Redis分片數據

2013-05-16 11:07:37

Android開發Android應用自動化測試

2018-03-28 09:53:50

Android架構演進

2023-11-16 11:34:05

BI大數據

2017-02-28 21:57:05

React組件
點贊
收藏

51CTO技術棧公眾號

日本人妻伦在线中文字幕| 国产精品香蕉在线观看| 四虎精品一区二区| 欧美性猛交xxx高清大费中文| 国产清纯白嫩初高生在线观看91| 成人激情视频免费在线| 日本免费在线播放| 精品国产午夜| 久久国产影院| 精品视频全国免费看| www.激情网| 国产高清视频在线播放| 国产精品中文字幕欧美| 午夜精品久久久久久久99热浪潮| 色欲狠狠躁天天躁无码中文字幕| 久久久久久亚洲精品美女| 欧美色播在线播放| 国产精品一二三在线观看| 欧美色视频免费| 国产精品一区2区| 国产suv精品一区二区| 欧美精品videos极品| 国产探花一区在线观看| 亚洲精品在线电影| 日韩av片免费观看| 3d性欧美动漫精品xxxx软件| 亚洲成人第一页| 免费在线精品视频| 免费在线国产| 成人v精品蜜桃久久一区| 国产精品影片在线观看| 欧美 日韩 精品| 韩日成人av| 久热精品在线视频| 精品熟妇无码av免费久久| 欧美亚洲国产日韩| 精品av久久707| 亚洲色图欧美自拍| 欧美少妇激情| 欧美亚洲高清一区二区三区不卡| 黄色一级视频片| 欧美大片黄色| 一区二区成人在线视频| 在线免费一区| 拍真实国产伦偷精品| 欧美激情在线看| 欧美日韩高清在线一区| 日韩毛片在线一区二区毛片| 成人黄色大片在线观看| 97超级碰碰| 精品国精品国产自在久不卡| 国产揄拍国内精品对白| 91综合免费在线| 国产精品无码久久av| 久久er精品视频| 国产精品视频公开费视频| 波多野结衣日韩| 日本亚洲最大的色成网站www| 日本精品视频在线| 波多野结衣人妻| 日韩高清中文字幕一区| 国产精品美女久久| 免费精品一区二区| 看电视剧不卡顿的网站| 国产视频观看一区| 国产精品视频无码| 国产成人精品免费在线| 国产精品久久国产三级国电话系列 | 日韩欧美不卡在线| wwww在线观看免费视频| 精品福利樱桃av导航| 日韩精品视频久久| 日韩成人亚洲| 欧美精品在线一区二区| 四川一级毛毛片| 加勒比色综合久久久久久久久| 日韩av在线网址| 中文字幕第4页| 99精品在线| 欧美高清自拍一区| 成人毛片18女人毛片| 日韩vs国产vs欧美| 国产有码一区二区| 亚洲精品人妻无码| 久久久夜色精品亚洲| 一本一道久久a久久综合精品| 成年人网站在线| 天天色 色综合| 精品亚洲一区二区三区四区| 亚洲专区**| 亚洲丝袜av一区| 999精品视频在线观看播放 | 国产一区二区三区精彩视频 | 91久久精品一区二区三区| 亚欧激情乱码久久久久久久久| 亚洲一区网址| 在线播放日韩精品| 久久久www成人免费毛片| 免费在线亚洲欧美| 成人精品aaaa网站| 三级网站免费观看| 欧美高清在线一区| 福利视频一二区| 国产精品原创视频| 亚洲国产91色在线| 99久久精品久久亚洲精品| 亚洲国产免费看| 成人国产亚洲精品a区天堂华泰| 香蕉人妻av久久久久天天| 国产精品久久久久久久久动漫| 五月丁香综合缴情六月小说| 免费成人高清在线视频| 日韩黄色av网站| 老女人性淫交视频| 老司机亚洲精品| 极品日韩久久| 97超碰资源站在线观看| 欧美日韩黄色一区二区| 人人妻人人澡人人爽人人精品 | 欧美国产极速在线| 在线免费看91| 久久久91精品国产一区二区三区| 国产成人一二三区| 国产精品18| 色偷偷av一区二区三区乱| 欧美a视频在线观看| 成人av在线电影| 一二三四中文字幕| av成人在线网站| 中文国产成人精品久久一| 欧美精品二区三区| www.日本不卡| 国产av麻豆mag剧集| 亚洲精品国产九九九| 久久av.com| 在线免费看av的网站| 欧美国产激情二区三区| 男人插女人下面免费视频| 色爱综合av| 97超级碰在线看视频免费在线看 | 国产美女www| 久久女同互慰一区二区三区| 国产深夜男女无套内射| 国产精品久久久网站| 欧美激情视频在线免费观看 欧美视频免费一 | 日韩精品资源| 欧美www.| 中文字幕亚洲综合久久筱田步美| 亚洲中文字幕无码爆乳av| 久久嫩草精品久久久精品一| 黄色片一级视频| 在线亚洲a色| 国产精品久久久久国产a级| 国产三级在线看| 91国偷自产一区二区三区观看| 可以直接看的无码av| 母乳一区在线观看| 亚欧洲精品在线视频免费观看| 国产成人午夜性a一级毛片| 色综久久综合桃花网| 一本一道精品欧美中文字幕| 亚洲欧洲成人精品av97| 奇米777在线| 亚洲午夜精品久久久久久app| 国产精品乱子乱xxxx| 国产污视频在线播放| 亚洲视频在线观看网站| 91精品国产色综合久久不8| 亚洲人精品午夜| 国产无套精品一区二区三区| 亚洲毛片在线| 日本午夜一区二区三区| 久久青草视频| 九九热精品视频国产| 五月天婷婷视频| 欧美在线|欧美| 黄色a级片在线观看| 国产成人精品免费看| 黄www在线观看| 婷婷精品进入| 国产福利不卡| 日韩av首页| 久久99国产精品自在自在app| 亚洲 美腿 欧美 偷拍| 欧美视频第二页| 国产一卡二卡在线| 日本一区二区免费在线观看视频| 国产探花在线观看视频| 亚洲在线日韩| 裸体裸乳免费看| 一区二区三区韩国免费中文网站| 91久久精品一区| 自由日本语热亚洲人| 久久精品成人动漫| 亚欧洲精品视频| 欧美一级专区免费大片| 男人天堂视频网| 亚洲国产一二三| 女教师淫辱の教室蜜臀av软件| 不卡的av电影| 久久精品视频在线观看免费| 国产亚洲一级| 99热这里只有精品免费| 成人毛片在线| 久久久福利视频| 国产色99精品9i| 国产精品美女主播在线观看纯欲| 黄色小说在线播放| 色多多国产成人永久免费网站| 人人妻人人澡人人爽人人欧美一区 | 日本少妇高潮喷水视频| 欧美一区二区三区久久精品茉莉花| 欧美日韩喷水| 开心激情综合| av资源站久久亚洲| 婷婷激情成人| 国产精品xxxxx| 亚洲人体视频| 国模gogo一区二区大胆私拍| 久久99精品久久久久久野外| 国产亚洲精品美女久久久| 天天操天天射天天| 欧美不卡视频一区| 精品久久久久久亚洲综合网站| 欧美日韩视频专区在线播放| 中文字幕高清在线免费播放| 一区二区三区精品视频在线| 国产3级在线观看| 中文字幕精品一区| 波多野结衣av在线观看| 久久亚洲综合av| 精品无码在线视频| 91麻豆免费观看| 国内精品久久99人妻无码| 99这里都是精品| 久久偷拍免费视频| 91亚洲男人天堂| 玖草视频在线观看| 91美女在线观看| 亚洲一区二区观看| 久久精品水蜜桃av综合天堂| 久久精品老司机| 91丨porny丨国产入口| 国产熟女高潮一区二区三区 | 日韩美女主播在线视频一区二区三区 | 黄色成人在线网| 久久久伊人日本| 国产盗摄在线视频网站| 欧美激情一区二区三区成人 | 天天综合日日夜夜精品| 国产精品男女视频| 色综合久久久久久久久久久| 无码人妻aⅴ一区二区三区有奶水| 色一区在线观看| 亚洲午夜无码久久久久| 欧美男女性生活在线直播观看| 国产乱淫av免费| 欧美r级电影在线观看| 人妻一区二区三区| 亚洲色图美腿丝袜| 香蕉视频在线看| 九九热精品在线| 一本大道色婷婷在线| 国产成人极品视频| 深夜日韩欧美| 国产精品免费区二区三区观看| 黄色欧美在线| 午夜视频久久久| 欧美一区91| 黄色影院一级片| 日本sm残虐另类| 国产精品igao网网址不卡| 国产91对白在线观看九色| 一本色道综合久久欧美日韩精品| 国产亚洲综合av| 国产午夜手机精彩视频| 亚洲成人精品影院| 中文字幕乱码中文字幕| 欧美大片在线观看| 国产三级在线| 欧美俄罗斯乱妇| 色综合一本到久久亚洲91| 成人h猎奇视频网站| 女同久久另类99精品国产| 日韩hmxxxx| 激情91久久| 天天操天天爽天天射| 韩国精品在线观看| 免费黄色三级网站| 国产精品网曝门| 久久久久97国产| 欧美日韩亚洲不卡| 少妇荡乳情欲办公室456视频| 夜夜嗨av色一区二区不卡| 波多野结衣在线高清| 国产精品视频一区国模私拍| 亚洲啊v在线免费视频| 日韩精品久久一区二区三区| 在线播放精品| 黄色一级片免费的| 2欧美一区二区三区在线观看视频| 久久免费看少妇高潮v片特黄| 一本久道久久综合中文字幕| 精品人妻无码一区二区三区蜜桃一| 亚洲人成77777在线观看网| 污视频在线看网站| 国产精品一区二区三区毛片淫片| 小嫩嫩12欧美| 中文精品无码中文字幕无码专区 | 无码国产精品一区二区免费式直播 | 在线观看福利一区| 久久视频一区| 国产精品久久久久久久无码| 综合激情成人伊人| 羞羞色院91蜜桃| 亚洲欧美中文日韩在线v日本| 高h视频在线播放| 18成人在线| 91精品国偷自产在线电影 | 久久久久黄色| 欧洲精品亚洲精品| 99re国产精品| 国产精品果冻传媒| 一区二区三区四区视频精品免费 | 日韩电影免费观看在线观看| 亚洲妇熟xxxx妇色黄| 91久久久久久久久久久| 成人精品久久| jizzzz日本| 国产精品第四页| 一本色道久久综合无码人妻| 国产亚洲xxx| 欧美影视资讯| 奇米精品在线| 老司机亚洲精品| 真实乱视频国产免费观看| 日韩欧美中文字幕在线播放| 天堂网www中文在线| 91精品国产高清自在线| 欧美高清视频看片在线观看| 黄色国产一级视频| 99久久亚洲一区二区三区青草 | 日本精品600av| 97超碰资源| 激情视频一区| 99久久人妻无码中文字幕系列| 亚洲国产精品久久艾草纯爱| 人妻偷人精品一区二区三区| 91sao在线观看国产| 亚洲伊人春色| 中文字幕乱码人妻综合二区三区| 久久麻豆一区二区| 波多野结衣一区二区在线| 在线性视频日韩欧美| 欧美一区二区三区婷婷| 日本女人高潮视频| 国产成人自拍网| 国产乡下妇女做爰| 日韩黄色高清视频| 精品欧美日韩精品| 99精品视频网站| 丁香婷婷综合激情五月色| 制服.丝袜.亚洲.中文.综合懂色| 亚洲色图偷窥自拍| 四虎视频在线精品免费网址| 青青在线视频免费观看| 91丨porny丨国产入口| 中文字幕 人妻熟女| 欧美成人免费在线视频| 高清一区二区三区| 日本va中文字幕| 日韩美女视频19| 色wwwwww| 国产免费成人av| 国产综合自拍| 91网站免费视频| 日韩一级免费一区| 91精品论坛| 天天综合中文字幕| 成人高清视频免费观看| 69亚洲精品久久久蜜桃小说| 日韩在线观看免费高清完整版| 一区二区三区在线免费看| 成人黄色片视频| 亚洲精品欧美二区三区中文字幕| 国产suv精品一区二区69| 欧美亚洲国产视频小说| 国产电影一区二区在线观看| 黄色av网址在线观看| 欧美在线你懂的| 久久99亚洲网美利坚合众国| 九九九九九九精品| 国内成人自拍视频| 黄色片中文字幕| 久久99国产综合精品女同| 黑人操亚洲人| 黄色av网址在线观看| 欧美一级免费观看| 日本综合视频| 日韩中文字幕三区|