Gradle for Android 使用之旅之gradle配置進階

Gradle Build Files in Android 第三章

了解Build TypesFlavors

3.1 了解Build Types

  • debugrelease

    Gradle Android 插件提供了兩種build類型,debugrelease,他們兩者都可以在buildTypes節(jié)點中配置。例如默認配置:

      buildTypes {
          release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
      }
    

    同樣可以直接加入debugtype ,兩者配置都可以一樣,這是用來區(qū)分打包類型。并且debug 默認 debuggable 為true。

  • minifyEnabled,shrinkResources

    開發(fā)很久的項目中通常會存在很多已經不再使用的資源文件,但是人工去刪除又比較麻煩,可以使用這兩個幫助刪除不再使用的資源文件。

      android {
          buildTypes {
              release {
              minifyEnabled true
              shrinkResources true
              proguardFiles getDefaultProguardFile('proguard-android.txt'),
                Turn on code shrinking
              'proguard-rules.pro'
              } }
      }
    

    這兩個屬性已經要同時設置才能生效。

  • 設置后綴的屬性

    為了方便辨別打包后的包是release或debug,可以根據(jù)不同的打包類型設置區(qū)分。如修改版本名稱,修改包名。

      android {
      // ... other properties ... buildTypes {
              debug {
                  applicationIDsuffix '.debug'
                  versionNameSuffix '-debug'
      }
      // .. other build types ...
      } }
    

    這樣配置后打包的debug包的包名會在后面增加.debug,版本名后也會相應的增加-debug,這樣一個手機上可以很方便安裝多個包。

3.2 Flavors and Variants

問題

如何做到不同一次build同一個APP不同版本功能的包。

解決方法

productFlavors用于build不同版本的包,他可能用于免費版,收費版,但是基于代碼是一樣的,只是有個別屬性是不一樣的。

例如

productFlavors {
        baidu {
          applicationId 'com.branch.www.gradledemo.baidu'
        }
        meizu {
          applicationId 'com.branch.www.gradledemo.meizu'
        }
        wandoujia {
          applicationId 'com.branch.www.gradledemo.wandoujia'
    }

然后在build apk時可以選擇需要的構建

productFlavors_1.png
productFlavors_1.png
  • 每一個構建中可以定義自己的屬性,所有的屬性基于defaultConfig

    • applicationId
    • minSdkVersion
    • targetSdkVersion
    • versionCode
    • versionName
    • signingConfig
  • 每一個構建都可以有他自己的sourceresource,如下:

    • app/src/baidu/java
    • app/src/meizu/java
    • app/src/wandoujia/java

    • app/src/baidu/res
    • app/src/meizu/res/layout
    • app/src/wandoujia/res/values

    如:

    productFlavors_2.png
    productFlavors_2.png

    或 不共用源碼

    productFlavors_3.png
    productFlavors_3.png
  • 使用manifestPlaceholders

    同時我們在常用的不同渠道號的apk中有渠道區(qū)分或者其他需要在AndroidManifest.xml中設置的。

      defaultConfig {
          applicationId "com.branch.www.gradledemo"
          minSdkVersion 18
          targetSdkVersion 24
          versionCode versionCodes
          versionName versionNames
          manifestPlaceholders = [BaiduMobAd_CHANNEL: "common", xxx: "xx"]
        }
    
      flavorDimensions 'one', 'two'
    
      productFlavors {
          baidu {
            manifestPlaceholders = [BaiduMobAd_CHANNEL: "baidu", xxx: "xx"]
            dimension "one"
      //      applicationId 'com.branch.www.gradledemo.baidu'
          }
      meizu {
            manifestPlaceholders = [BaiduMobAd_CHANNEL: "meizu", xxx: "xx"]
            resValue "string", "app_name", "魅族"
            dimension "one"
            applicationId 'com.branch.www.gradledemo.meizu'
          }
    

    則可以這樣使用它

      <meta-data android:name="BaiduMobAd_CHANNEL" android:value="${BaiduMobAd_CHANNEL}" />
    
  • 使用resValue

      meizu {
          resValue "string", "xxx_name", "魅族"
          dimension "one"
          applicationId 'com.branch.www.gradledemo.meizu'
      }
    

    使用時同樣也是R.string.app_xxx_name,跟在string.xml中定義是一樣的。

3.3 Merging Resources

問題

想要根據(jù)不同構建設置不懂的text,image等

解決方法

參照 3.2 ,每個構建都可以有自己的sourceresource,則可以很方面的設置,這里就不再重復驗證。

3.4 Flavor Dimensions 的使用

問題

或許 3.2 Flavors還不夠用,還可以增加,或有太多相同的可以合并。

解決方法

使用 ?flavor dimensions 合并baidu,meizu,wandoujia ,如:

  flavorDimensions 'one', 'two'

  productFlavors {
    baidu {
      dimension "one"
//      applicationId 'com.branch.www.gradledemo.baidu'
    }
    meizu {
      dimension "one"
      applicationId 'com.branch.www.gradledemo.meizu'
    }
    wandoujia {
      dimension "two"
      applicationId 'com.branch.www.gradledemo.wandoujia'
    }

    one {
      dimension "two"
    }

    two {
      dimension "two"
    }

然后build是就有1x3+1x3=6個包可以選擇。

flavorDimensions_1.png
flavorDimensions_1.png

定義了flavorDimensions后每一個構建都需要加上dimension否則報錯

flavorDimensions_error_1.png
flavorDimensions_error_1.png

與3.2 一樣,可以設置屬性,同樣可以合并相同的。

3.5 Merging Java Sources Across Flavors

問題

怎么改變源碼或其他java類

解決方法

在3.2中創(chuàng)建不同構建對應的文件夾

resources可以自動覆蓋,并且可以有相同或不相同的而java類有點不一樣,java類不能有和main中存在一樣的,并且需要從main跳轉的在每一個構建中都要存在,但是他們每一個的實現(xiàn)可以不一樣。

例如:

mering_java_class_1.png
mering_java_class_1.png

可以看到one,two是組合構建

mering_java_class_2.png
mering_java_class_2.png

所以不所有包中都會有一個OtherActivity,并且他們的實現(xiàn)方式不一樣。從main中的MainActivity 實現(xiàn)startActivity時,不同構建跳轉到對應的構建。應該在每一個構建中自己的實現(xiàn)也就實現(xiàn)完全不一樣。

[第一章:gradle的基礎](Gradle Build Files in Android_1.md)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉載注明出處:http://www.itdecent.cn/p/5255b100930e 0. 前言 完全由個人翻...
    王三的貓阿德閱讀 2,730評論 0 4
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項,請點擊這里進行查閱:DSL參考 1.1新構建系統(tǒng)...
    Chuckiefan閱讀 12,355評論 8 72
  • 當你在開發(fā)一個app,通常你會有幾個版本。大多數(shù)情況是你需要一個開發(fā)版本,用來測試app和弄清它的質量,然后還需要...
    雪殘閱讀 429評論 0 0
  • 當你在開發(fā)一個app,通常你會有幾個版本。大多數(shù)情況是你需要一個開發(fā)版本,用來測試app和弄清它的質量,然后還需要...
    justCode_閱讀 523評論 0 2
  • 第四篇( 構建變體 ) 當你在開發(fā)一個app,通常你會有幾個版本。大多數(shù)情況是你需要一個開發(fā)版本,用來測試app和...
    一劍飛鴻閱讀 781評論 0 0

友情鏈接更多精彩內容