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

Gradle for Android 第四篇( 構建變體 )

移動開發(fā) Android
這一章我們將學習構建版本,它能使得開發(fā)更有效率,并且學習如何使用它們。然后我們會討論構建版本和生產版本的不同,以及如何將其合并。我們會探討簽名機制,如何針對不同的變種簽名等。

當你在開發(fā)一個app,通常你會有幾個版本。大多數(shù)情況是你需要一個開發(fā)版本,用來測試app和弄清它的質量,然后還需要一個生產版本。這些版本通常有不同的設置,例如不同的URL地址。更可能的是你可能需要一個免費版和收費版本。基于上述情況,你需要處理不同的版本:開發(fā)免費版,開發(fā)付費版本,生產免費版,生產付費版,而針對不同的版本不同的配置,這極大增加的管理難度。

Gradle有一些方便的方法來管理這些問題。我們很早之前談過debug和release版本,現(xiàn)在我們談到另外一個概念,不同的產品版本。構建版本和生產版本通常可以合并,構建版本和生產版本的合并版叫做構建變種。

這一章我們將學習構建版本,它能使得開發(fā)更有效率,并且學習如何使用它們。然后我們會討論構建版本和生產版本的不同,以及如何將其合并。我們會探討簽名機制,如何針對不同的變種簽名等。

在這一章,我們遵循如下規(guī)則:

  • Build types
  • Product flavors
  • Build variants
  • Signing configurations

構建版本

在Gradle的Android插件中,一個構建版本意味著定義一個app或者依賴庫如何被構建。每個構建版本都要特殊的一面,比如是否需要debug,application id是什么,是否不需要的資源被刪除等等。你可以定義一個構建版本通過buildTypes方法。例如:

  1. android { 
  2.        buildTypes { 
  3.            release { 
  4.                minifyEnabled false 
  5.                proguardFiles getDefaultProguardFile 
  6.                  ('proguard-android.txt'), 'proguard-rules.pro' 
  7.            } 
  8.         } 
  9.  }  

這個文件定義了該模塊是release版本,然后定義了proguard的位置。該release版本不是唯一的構建版本,默認情況下,還有個debug版本。Android studio把它視為默認構建版本。

創(chuàng)建自己的構建版本

當默認的構建版本不夠用的時候,創(chuàng)建版本也是很容易的一件事,創(chuàng)建構建版本你只需要在buildTypes寫入自己的版本。如下所示:

  1. android { 
  2.     buildTypes { 
  3.         staging { 
  4.             applicationIdSuffix ".staging" 
  5.             versionNameSuffix "-staging" 
  6.             buildConfigField "String""API_URL"
  7.             "\"http://staging.example.com/api\"" 
  8.          } 
  9.     } 
  10.  

我們定義了一個staging版本,該版本定義了一個新的application id,這讓其與debug和release版本的applicationID不同。假設你使用了默認的配置,那么applicationID將會是這樣的:

  • Debug: com.package
  • Release: com.package
  • Staging: com.package.staging

這意味著你可以在你的設備上安裝staging版本和release版本。staging版本也有自己的版本號。buildConfigField定義了一個新的URL地址。你不必事事都去創(chuàng)建,所以最可能的方式是去繼承已有的版本。 

  1. android { 
  2.        buildTypes { 
  3.            staging.initWith(buildTypes.debug) 
  4.            staging { 
  5.                applicationIdSuffix ".staging" 
  6.                versionNameSuffix "-staging" 
  7.                debuggable = false 
  8.            }  
  9.         } 
  10.  

initWith()方法創(chuàng)建了一個新的版本的同時,復制所有存在的構建版本,類似繼承。我們也可以復寫該存在版本的所有屬性。

Source sets

當你創(chuàng)建了一個新的構建版本,Gradle也創(chuàng)建了新的source set。默認情況下,該文件夾不會自動為你創(chuàng)建,所有你需要手工創(chuàng)建。

  1. app 
  2. └── src 
  3. ├── debug 
  4. │ ├── java 
  5.        │   │   └── com.package 
  6.  │ │ 
  7. │ ├── res 
  8. │ │ └── layout 
  9. │   │       └── activity_main.xml 
  10. │   └── AndroidManifest.xml 
  11. ├── main 
  12. │ ├── java 
  13. │   │   └── com.package 
  14. │ │ 
  15. │ ├── res 
  16. └── MainActivity.java 
  17. └── Constants.java 
  18. │ │ 
  19. │ │ 
  20. │ │ 
  21. │   └── AndroidManifest.xml 
  22. ├── staging 
  23. │ ├── java 
  24. │   │   └── com.package 
  25. ├── drawable 
  26. └── layout 
  27. └── activity_main.xml 
  28. │ │ 
  29. │ ├── res 
  30. │ │ └── layout 
  31. │   │       └── activity_main.xml 
  32. │   └── AndroidManifest.xml 
  33. └── release 
  34.     ├── java 
  35.     │   └── com.package 
  36.     │       └── Constants.java 
  37.     └── AndroidManifest.xml  

注意:當你添加一個Java類的時候,你需要知道以下過程,當你添加了CustomLogic.java到staging版本,你可以添加相同的類到debug和release版本,但是不能添加到main版本。如果你添加了,會拋出異常。

當使用不同的source sets的時候,資源文件的處理需要特殊的方式。Drawables和layout文件將會復寫在main中的重名文件,但是values文件下的資源不會。gradle將會把這些資源連同main里面的資源一起合并。

舉個例子,當你在main中創(chuàng)建了一個srings.xml的時候:

  1. <resources> 
  2.        <string name="app_name">TypesAndFlavors</string> 
  3.        <string name="hello_world">Hello world!</string> 
  4. </resources>  

當你在你的staing版本也添加了rings.xml:

  1. <resources> 
  2.        <string name="app_name">TypesAndFlavors STAGING</string> 
  3. </resources>  

然后合并的strings.xml將會是這樣的:

  1. <resources> 
  2.        <string name="app_name">TypesAndFlavors STAGING</string> 
  3.        <string name="hello_world">Hello world!</string> 
  4. </resources>  

當你創(chuàng)建一個新的構建版本而不是staging,最終的strings.xml將會是main目錄下的strings.xml。

manifest也和value文件下的文件一樣。如果你為你的構建版本創(chuàng)建了一個manifest文件,那么你不必要去拷貝在main文件下的manifest文件,你需要做的是添加標簽。Android插件將會為你合并它們。

我們將在會之后的章節(jié)講到合并的更多細節(jié)。

依賴包

每一個構建版本都有自己的依賴包,gradle自動為每一個構建的版本創(chuàng)建不同的依賴配置。如果你想為debug版本添加一個logging框架,你可以這么做:

  1. dependencies { 
  2.  
  3.    compile fileTree(dir: 'libs', include: ['*.jar']) 
  4.    compile 'com.android.support:appcompat-v7:22.2.0' 
  5.    debugCompile 'de.mindpipe.android:android-logging-log4j:1.0.3' 
  6.  

你可以結合不同的構建版本著不同的構建配置,就像這種方式,這讓你的不同版本的不同依賴包成為可能。

product flavors

和構建版本不同,product flavors用來為一個app創(chuàng)建不同版本。典型的例子是,一個app有付費和免費版。product flavors極大簡化了基于相同的代碼構建不同版本的app。

如果你不確定你是否需要一個新的構建版本或者product flavors,你應該問你自己,你是否需要內部使用和外部使用的apk。如果你需要一個完全新的app去發(fā)布,和之前的版本完全隔離開,那么你需要product flavors。否則你只是需要構建版本。

創(chuàng)建product flavors

創(chuàng)建product flavors非常的容易。你可以在productFlavors中添加代碼:

  1. android { 
  2.     productFlavors { 
  3.         red { 
  4.              applicationId 'com.gradleforandroid.red' 
  5.              versionCode 3 
  6.         } 
  7.         blue { 
  8.              applicationId 'com.gradleforandroid.blue' 
  9.              minSdkVersion 14 
  10.              versionCode 4 
  11.         } 
  12.     } 
  13.  

product flavors和構建版本的配置不同。因為product flavors有自己的ProductFlavor類,就像defaultConfig,這意味著你的所有productFlavors都分享一樣的屬性。

Source sets

就像構建版本一樣,product Flavors也有自己的代碼文件夾。創(chuàng)建一個特殊的版本就像創(chuàng)建一個文件夾那么簡單。舉個例子,當你有的生產版本的blue flavors有一個不同的app圖標,該文件夾需要被叫做blueRelease。

多個flavors構建變體

在一些例子中,你可能需要創(chuàng)建一些product flavors的合并版本。舉個例子,client A和client B可能都想要一個free和paid的版本,而他們又都是基于一樣的代碼,但是有不一樣的顏色等。創(chuàng)建四個不同的flavors意味著有重復的配置。合并flavors最簡單的做法可能是使用flavor dimensions,就像這樣:

  1.  android { 
  2.        flavorDimensions "color""price" 
  3.        productFlavors { 
  4.            red { 
  5.                flavorDimension "color" 
  6.            } 
  7.            blue { 
  8.                flavorDimension "color" 
  9.            } 
  10.            free { 
  11.                flavorDimension "price" 
  12.            } 
  13.            paid { 
  14.                flavorDimension "price" 
  15.            } 
  16.        } 

當你添加了flavor dimensions,你就需要為每個flavor添加flavorDimension,否則會提示錯誤。flavorDimensions定義了不同的dimensions,當然其順序也很重要。當你合并二個不同的flavors時,他們可能有一樣的配置和資源。例如上例:

  • blueFreeDebug and blueFreeRelease
  • bluePaidDebug and bluePaidRelease
  • redFreeDebug and redFreeRelease
  • redPaidDebug and redPaidRelease

構建變體

構建變體是構建版本和生產版本的結合體。當你創(chuàng)建了一個構建版本或者生產版本,同樣的,新的變體也會被創(chuàng)建。舉個例子,當你有debug和release版本,你創(chuàng)建了red和blue的生產版本,那么變體將會有四個: 

 

 

 

你可以在Android studio的左下角找到它,或者通過VIEW|Tool Windows|Build Variants打開它。該視圖列出了所有的變體,并且允許你去切換它們。改變他們將會影響到你按Run按鈕。

如果你沒有product flavors,那么變體只是簡單的包含構建版本,就算你沒有定義任何構建版本,Android studio也會默認為你創(chuàng)建debug版本的。

tasks

android插件回味每一個變體創(chuàng)建不同的配置。一個新的Android項目會有debug和release版本,所有你可以使用assembleDebug和assembleRelease,當然當你使用assemble命令,會二者都執(zhí)行。當你添加了一個新的構建版本,新的task也會被創(chuàng)建。例如:

  • assembleBlue uses the blue flavor configuration and assembles both BlueRelease and BlueDebug.
  • assembleBlueDebug combines the flavor configuration with the build type configuration, and the flavor settings override the build type settings.

Source sets

構建變體也可以有自己的資源文件夾,舉個例子,你可以有src/blueFreeDebug/java/。

資源文件和manifest的合并

在打包app之前,Android插件會合并main中的代碼和構建的代碼。當然,依賴項目也可以提供額外的資源,它們也會被合并。你可能需要額外的Android權限針對debug變體。舉個例子,你不想在main中申明這個權限,因為這可能導致一些問題,所以你可以添加一個額外的mainfest文件在debug的文件夾中,申明額外的權限。

資源和mainfests的優(yōu)先級是這樣的: 

 

 

 

如果一個資源在main中和在flavor中定義了,那么那個在flavor中的資源有更高的優(yōu)先級。這樣那個在flavor文件夾中的資源將會被打包到apk。而在依賴項目申明的資源總是擁有***優(yōu)先級。

創(chuàng)建構建變體

gradle讓處理構建變體變得容易。

  1. android { 
  2.        buildTypes { 
  3.            debug { 
  4.                buildConfigField "String""API_URL"
  5.                "\"http://test.example.com/api\"" 
  6.         } 
  7.            staging.initWith(android.buildTypes.debug) 
  8.            staging { 
  9.                buildConfigField "String""API_URL"
  10.                  "\"http://staging.example.com/api\"" 
  11.                applicationIdSuffix ".staging" 
  12.            } 
  13.        } 
  14.        productFlavors { 
  15.            red { 
  16.                applicationId "com.gradleforandroid.red" 
  17.                resValue "color""flavor_color""#ff0000" 
  18.            } 
  19.            blue { 
  20.                applicationId "com.gradleforandroid.blue" 
  21.                resValue "color""flavor_color""#0000ff" 
  22.            }  
  23.      } 
  24.  

在這個例子中,我們創(chuàng)建了4個變體,分別是blueDebug,blueStaging,redDebug,redStaging。每一個變體都有其不同的api url以及顏色。例如: 

 

 

 

 

 

 

 

變體過濾器

忽略某個變體也是可行的。這樣你可以加速你的構建當使用assemble的時候,這樣你列出的tasks將不會執(zhí)行那么你不需要的變體。你可以使用過濾器,在build.gradle中添加代碼如下所示:

  1. android.variantFilter { variant -> 
  2.        if(variant.buildType.name.equals('release')) { 
  3.            variant.getFlavors().each() { flavor -> 
  4.                if (flavor.name.equals('blue')) { variant.setIgnore(true); 
  5.             } 
  6.         } 
  7.     } 
  8.  

在這個例子中,我們檢查下: 

 

 

 

你可以看到blueFreeRelease和bluePaidRelease被排除在外,如果你運行gradlew tasks,你會發(fā)現(xiàn)所有的關于上述變體的tasks不再存在。

簽名配置

在你發(fā)布你的應用之前,你需要為你的app私鑰簽名。如果你有付費版和免費版,你需要有不同的key去簽名不同的變體。這就是配置簽名的好處。配置簽名可以這樣定義:

  1.  android { 
  2.        signingConfigs { 
  3.            staging.initWith(signingConfigs.debug) 
  4.            release { 
  5.                storeFile file("release.keystore"
  6.                storePassword"secretpassword" 
  7.                keyAlias "gradleforandroid" 
  8.                keyPassword "secretpassword" 
  9.            } 
  10.       } 
  11.  

在這個例子中,我們創(chuàng)建了2個不同的簽名配置。debug配置是as默認的,其使用了公共的keystore和password,所以沒有必要為debug版本創(chuàng)建簽名配置了。staging配置使用了initWith()方法,其會復制其他的簽名配置。這意味著staging和debug的key是一樣的。

release配置使用了storeFile,定義了key alias和密碼。當然這不是一個好的選擇,你需要在 Gradle properties文件中配置。

當你定義了簽名配置后,你需要應用它們。構建版本都有一個屬性叫做signingConfig,你可以這么干:

  1. android { 
  2.        buildTypes { 
  3.            release { 
  4.                signingConfig signingConfigs.release 
  5.            }  
  6.        } 
  7.  

上例使用了buildTypes,但是你可能需要對每個版本生成不同的驗證,你可以這么定義:

  1. android { 
  2.        productFlavors { 
  3.            blue { 
  4.                signingConfig signingConfigs.release 
  5.            } 
  6.        } 
  7.  

當然,你在flavor中定義這些,***會被重寫,所以***的做法是:

  1. android { 
  2.        buildTypes { 
  3.            release { 
  4.                productFlavors.red.signingConfig signingConfigs.red 
  5.                productFlavors.blue.signingConfig signingConfigs.blue 
  6.            } 
  7.        } 
  8.  

總結

在這一章,我們討論了構建版本和生產版本,以及如何結合它們。這將會是非常有用的工具,當你需要不同的url以及不同的keys,而你們有相同的代碼和資源文件,但是有不同的類型以及版本,構建版本和生產版本將會讓你的生活更美好。

我們也談論了簽名配置以及如何使用他們。

下一章,你將會學習到多模塊構建,因為當你想把你的代碼分成一個依賴包或者依賴項目的時候,或者你想把Android wear模塊放在你的應用的時候,這將非常重要。 

責任編輯:龐桂玉 來源: Android開發(fā)中文站
相關推薦

2014-03-28 14:13:31

Android開源項目測試工具

2011-06-23 10:25:38

Oracle

2013-05-07 09:31:14

Hyper-V災難恢復

2017-04-13 14:55:07

AndroidGradle多模塊構建

2013-07-18 17:00:12

Gradle構建AndAndroid開發(fā)Android學習

2011-05-16 14:12:30

QuickWidgetQML

2020-11-19 07:51:06

StringJoine分隔符使用

2023-05-23 18:11:12

Rust數(shù)組元組

2017-04-10 14:46:29

AndroidGradleBuild.gradl

2013-10-23 13:25:28

AngularJS應用

2017-04-10 13:43:34

AndroidGradleAS

2012-04-25 16:51:21

2011-08-29 13:52:15

李洋Android應用

2017-04-10 17:35:54

AndroidGradle依賴管理

2012-06-12 10:43:20

Windows Pho

2023-12-19 13:13:16

人工智能

2011-06-22 15:04:28

JAVA

2011-04-13 13:38:57

選項APIBlackBerry

2015-03-20 10:01:50

Android StuGradle

2010-06-08 08:41:08

.NET 4并行編程
點贊
收藏

51CTO技術棧公眾號

国产在线精品一区二区三区》| 在线播放精品一区二区三区| 久久国产精品视频在线观看| 视频福利在线| 伊人国产精品| 亚洲色图另类专区| 国产一区二区视频在线免费观看 | 亚洲国产一区二区三区青草影视| 欧美又大又硬又粗bbbbb| ass精品国模裸体欣赏pics| 成人在线免费| 午夜精品123| 亚洲字幕一区二区| 在线观看精品国产| 99久久国产综合精品成人影院| 欧美成人精品高清在线播放| 国内外成人免费激情视频| 国产白浆在线观看| 国产又粗又猛又黄视频| 黄色大片在线免费观看| 久久99精品国产麻豆婷婷| 性欧美暴力猛交69hd| 变态另类ts人妖一区二区| 日本高清久久| 精品视频在线免费观看| 国产精品12345| 国产在线一区二区视频| 久久久久久久久久久99999| 亚洲一区二区久久久久久| www.色国产| 亚洲第一毛片| 欧美成人亚洲成人| 国产视频123区| 天美av一区二区三区久久| 欧美精品久久99| 激情内射人妻1区2区3区 | 欧美激情在线狂野欧美精品| 欧美丰满美乳xxⅹ高潮www| 国产精品x8x8一区二区| 56国语精品自产拍在线观看| 黄色一级免费大片| 天堂中文最新版在线中文| 亚洲一区二区精品久久av| 在线国产99| 在线免费黄色| 国产精品理论片在线观看| 蜜桃久久影院| 少妇av一区二区| wwwww亚洲| 国产一区二区三区91| 精品久久久久久综合日本欧美 | 国产67194| 日韩av有码| 伊人久久久久久久久久| 欧美日韩高清丝袜| 国产毛片一区二区三区| 亚洲精品成人久久电影| 欧美日韩一区二区三区四区五区六区| 亚洲精品乱码日韩| 欧美日韩成人激情| 99日在线视频| 玖玖玖视频精品| 欧美大黄免费观看| 99久久久无码国产精品性波多| 天堂va在线高清一区| 日韩一区二区三区视频| 人妻巨大乳一二三区| 免费av不卡在线观看| 99国产精品国产精品久久| 国产精品中出一区二区三区| 黄色一级大片在线免费看国产一 | 色综合久久天天综合网| 国产成人久久婷婷精品流白浆| zzzwww在线看片免费| 亚洲国产wwwccc36天堂| 奇米影视亚洲色图| 在线看片福利| 欧美偷拍一区二区| 中文字幕在线视频精品| 亚洲开心激情| 国产丝袜一区二区| 日韩av自拍偷拍| 成人污版视频| 91成人看片片| 午夜免费日韩视频| 成人性做爰片免费视频| www在线免费观看视频| 夜夜精品视频一区二区 | a在线免费观看| 亚洲成人资源网| caoporn超碰97| 日本超碰一区二区| 亚洲美女av电影| 亚洲天堂伊人网| 一区二区三区免费在线看| 亚洲精品videossex少妇| 日本一区二区视频在线播放| 91成人网在线观看| 2020欧美日韩在线视频| 国产精品久久久久久69| 波多野结衣中文一区| 日韩av影视| 欧美xxxbbb| 在线观看免费亚洲| 四虎精品一区二区| 日本不卡二三区| 97精品在线观看| 911美女片黄在线观看游戏| 成人午夜激情片| 欧美极品色图| 国产乱妇乱子在线播视频播放网站| 欧美视频免费在线| 野花视频免费在线观看| 国产精品免费大片| 国产+人+亚洲| 国产精品无码久久av| 久久这里只有精品视频网| 中文字幕一区综合| 主播大秀视频在线观看一区二区| 日韩欧美123| 婷婷国产成人精品视频| 9国产精品视频| 91免费观看| 麻豆影视在线观看_| 亚洲国产电影在线观看| 国产一线二线三线女| av超碰免费在线| 在线观看一区不卡| 香蕉视频黄色在线观看| 免费在线毛片| 日韩有码中文字幕在线| www日韩欧美| 成人毛片一区二区三区| www..com久久爱| www.欧美黄色| 亚洲啊v在线免费视频| 中文字幕一区电影| 午夜剧场免费在线观看| 久久最新视频| 欧美aaaaa喷水| 多野结衣av一区| 欧美tk—视频vk| 五月婷婷一区二区| 激情文学综合插| 一区二区精品在线| 99热播精品免费| 夜夜嗨av色一区二区不卡| 丁香六月婷婷综合| 三级欧美韩日大片在线看| www.欧美亚洲| 成人动漫在线观看视频| 国产传媒在线播放| 91精品视频网| 久久久综合久久| 成人动漫视频在线| 黄页免费在线观看视频| 红杏aⅴ成人免费视频| 欧美激情网友自拍| 人妻精品一区一区三区蜜桃91| 亚洲一线二线三线久久久| 蜜桃色一区二区三区| 黄色日韩在线| 日本三级韩国三级久久| 欧美成人一区二区视频| 国产精品一区二区黑丝| 中文字幕乱码免费| 99这里只有精品视频| 欧美激情网友自拍| 青青国产在线| 欧美日韩一二三区| 2021亚洲天堂| 99久久伊人久久99| 91淫黄看大片| 综合一区av| 精品国产乱码久久久久软件| 黑人巨大精品| 久久精品中文字幕电影| 久久久久久久久久影院| 26uuu亚洲综合色| 亚洲精品怡红院| 国产精品色呦| 清纯唯美亚洲激情| 日本中文在线观看| 精品国产一二三| www毛片com| 亚洲欧洲成人自拍| 在线中文字日产幕| 视频一区中文字幕| 国产精品一二三在线观看| 欧美中文一区| 成人黄色大片在线免费观看| 日产精品久久久久久久性色| 欧美在线免费视屏| 麻豆chinese极品少妇| 91在线观看一区二区| www.99在线| 91久久夜色精品国产九色| 日韩精品一区二区三区丰满| 国产精品色婷婷在线观看| 69视频在线播放| 成人三级网址| 亚洲欧洲一区二区三区久久| 国产日韩一级片| 国产精品久久精品日日| 国产极品美女高潮无套久久久| 大片网站久久| 国产偷国产偷亚洲高清97cao| 亚洲www啪成人一区二区| 色综合视频网站| 国产在线三区| 精品久久国产字幕高潮| 成人一级免费视频| 性感美女久久精品| 蜜桃av.com| 久久久99精品免费观看不卡| 四虎国产精品免费| 美女视频网站黄色亚洲| 久久视频这里有精品| 亚洲天堂免费| 在线成人av电影| 免费观看久久av| 国产日韩一区欧美| 日本精品视频| 成人黄色免费在线观看| 美女18一级毛片一品久道久久综合| 久久99久久99精品免观看粉嫩| av在线日韩国产精品| 日韩精品在线观看一区| 免费看黄色一级视频| 91精品国产欧美日韩| 在线播放亚洲精品| 日本高清不卡视频| 99精品人妻国产毛片| 污片在线观看一区二区| 久久久久久欧美精品se一二三四| 中文字幕一区二区不卡| 老头老太做爰xxx视频| 久久精品免视看| 三级视频中文字幕| 久久久久99| 免费无码av片在线观看| 亚洲国产精品第一区二区三区| 成年人视频大全| 91精品亚洲| 欧美与动交zoz0z| 91精品国偷自产在线电影| 中文精品视频一区二区在线观看| 欧美三级伦理在线| 亚洲看片网站| 欧美www视频在线观看| 中文字幕一区二区三区5566| 999成人网| 黄色网络在线观看| 欧美日韩视频一区二区三区| 男人天堂av片| 亚洲一区激情| 青青青国产在线视频| 日韩电影免费在线| 精品久久久99| 国产激情一区二区三区| 丰满人妻中伦妇伦精品app| 亚洲一区亚洲| 天天操天天爽天天射| 蜜桃视频在线观看一区| 天堂av2020| 高清在线不卡av| 色婷婷综合久久久久中文字幕| 久久xxxx| www.国产视频.com| 国产福利一区二区| 久久人人爽人人人人片| 久久蜜桃av一区二区天堂 | 国产喂奶挤奶一区二区三区| 亚洲欧美va天堂人熟伦| 亚洲欧洲av另类| 国产一级淫片免费| 色激情天天射综合网| 一级特黄aaaaaa大片| 欧美成人欧美edvon| 三级av在线| 久久韩国免费视频| 丰满大乳少妇在线观看网站 | 日韩精品久久久久久久| 一本到不卡精品视频在线观看| 91丨九色丨海角社区| 91精品国产欧美一区二区成人| 少妇无码一区二区三区| 在线观看不卡av| 黄色成人在线网| 国产精品久久久久久久久久久久久久| 国产高清日韩| 欧美动漫一区二区| 中文字幕日韩欧美精品高清在线| 免费av手机在线观看| 麻豆精品一区二区av白丝在线 | 久久综合丝袜日本网| 成人一级黄色大片| 黑人精品xxx一区| av中文在线观看| 亚洲毛片在线免费观看| 在线免费观看a视频| 日本在线精品视频| a级日韩大片| 亚洲人成77777| 国产精品日韩久久久| 毛片毛片毛片毛| 久久精品视频免费观看| 久久久久久国产精品视频| 黑人巨大精品欧美一区| 国产精品三级在线| 国产精品自在| 三上悠亚免费在线观看| 六月婷婷一区| 中文字幕a在线观看| 国产精品日韩成人| 毛片在线免费视频| 精品国一区二区三区| 日本在线免费中文字幕| 国产成人久久久| 激情av综合| 日本xxxxx18| 久久成人久久爱| 精品无码人妻一区二区免费蜜桃| 午夜久久久久久久久| 国产熟女精品视频| 中文字幕亚洲天堂| 日本在线精品| 欧美精品一区在线发布| 在线看片成人| 中文字幕人妻熟女在线| 一区二区三区精品在线| 国产美女明星三级做爰| 神马久久桃色视频| 日韩中文影院| 日本视频一区二区不卡| 欧美亚洲三级| 亚洲综合网在线观看| 欧美日韩中文字幕日韩欧美| 男人天堂手机在线观看| 色综合久久中文字幕综合网小说| 91成人小视频| 福利在线小视频| 国产精品一区在线| 免费麻豆国产一区二区三区四区| 在线不卡中文字幕| 久草免费在线观看| 国产精品视频内| 亚洲第一二区| 男女爱爱视频网站| 国产精品18久久久久久vr| 国产女人被狂躁到高潮小说| 7777精品伊人久久久大香线蕉完整版 | 免费欧美一区| 欧美亚洲一二三区| 欧美高清在线一区| 久久久久久亚洲av无码专区| 亚洲国产欧美一区二区三区同亚洲| 色婷婷av在线| 147欧美人体大胆444| 激情欧美日韩| jjzz黄色片| 天天亚洲美女在线视频| 色婷婷综合视频| 国产aⅴ夜夜欢一区二区三区 | 综合久久精品| 韩国一区二区在线播放| 一区二区三区日本| 亚洲第九十九页| 亚洲精品久久久久中文字幕二区| 日本资源在线| 99热在线播放| 亚洲日韩成人| 三上悠亚ssⅰn939无码播放| 日本久久电影网| av亚洲在线| 国产成人av一区二区三区| 好吊一区二区三区| 伊人网在线视频观看| 精品视频资源站| 黄色在线观看视频网站| 久久66热这里只有精品| 麻豆一区二区三区| 精品视频在线观看免费| 亚洲美女av在线| 久久国产三级| 一级黄色免费在线观看| 国产高清不卡一区| 尤物视频在线观看国产| 在线观看视频99| 日韩中文字幕| 久久久久免费看黄a片app| 国产精品国产三级国产普通话三级| 国产模特av私拍大尺度 | 醉酒壮男gay强迫野外xx| 日韩欧美成人网| 在线播放日本| 精品欧美国产| 毛片不卡一区二区| 日本熟妇色xxxxx日本免费看| 日韩在线免费av|