日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
GradleforAndroid第四篇(構(gòu)建變體)

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

創(chuàng)新互聯(lián)公司長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為浮梁企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè),浮梁網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

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

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

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

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

構(gòu)建版本

在Gradle的Android插件中,一個構(gòu)建版本意味著定義一個app或者依賴庫如何被構(gòu)建。每個構(gòu)建版本都要特殊的一面,比如是否需要debug,application id是什么,是否不需要的資源被刪除等等。你可以定義一個構(gòu)建版本通過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版本不是唯一的構(gòu)建版本,默認(rèn)情況下,還有個debug版本。Android studio把它視為默認(rèn)構(gòu)建版本。

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

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

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

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

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

這意味著你可以在你的設(shè)備上安裝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.         }

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

Source sets

當(dāng)你創(chuàng)建了一個新的構(gòu)建版本,Gradle也創(chuàng)建了新的source set。默認(rèn)情況下,該文件夾不會自動為你創(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 

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

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

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

 
 
 
 
  1.        TypesAndFlavors
  2.        Hello world!
  3.  

當(dāng)你在你的staing版本也添加了rings.xml:

 
 
 
 
  1.        TypesAndFlavors STAGING
  2.  

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

 
 
 
 
  1.        TypesAndFlavors STAGING
  2.        Hello world!
  3.  

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

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

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

依賴包

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

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

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

product flavors

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

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

創(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.     }

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

Source sets

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

多個flavors構(gòu)建變體

在一些例子中,你可能需要創(chuàng)建一些product flavors的合并版本。舉個例子,client A和client B可能都想要一個free和paid的版本,而他們又都是基于一樣的代碼,但是有不一樣的顏色等。創(chuàng)建四個不同的flavors意味著有重復(fù)的配置。合并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.        }
  17. }

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

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

構(gòu)建變體

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

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

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

tasks

android插件回味每一個變體創(chuàng)建不同的配置。一個新的Android項目會有debug和release版本,所有你可以使用assembleDebug和assembleRelease,當(dāng)然當(dāng)你使用assemble命令,會二者都執(zhí)行。當(dāng)你添加了一個新的構(gòu)建版本,新的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

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

資源文件和manifest的合并

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

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

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

創(chuàng)建構(gòu)建變體

gradle讓處理構(gòu)建變體變得容易。

  1. android {
  2.        buildTypes {
  3.            debug {
  4.                buildConfigField "String", "API_URL",
  5.                "\"http://test.cdxwcx.com/api\""
  6.         }
  7.            staging.initWith(android.buildTypes.debug)
  8.            staging {
  9.                buildConfigField "String", "API_URL",
  10.                  "\"http://staging.cdxwcx.com/api\""
  11.                applicationIdSuffix ".staging"
  12.            }
  13.        }
  14.        productFlavors {
  15.            red {
  16.                applicationId "com.gradleforandroid.red"
  17.                resValue "color", "flavor_color", "#ff0000"

  18. 網(wǎng)頁題目:GradleforAndroid第四篇(構(gòu)建變體)
    當(dāng)前鏈接:http://www.5511xx.com/article/dpigpcj.html