關于Android Studio項目的Gradle構建

wpnw3690 8年前發布 | 21K 次閱讀 Android Studio開發工具

來自: http://www.jcodecraeer.com//a/anzhuokaifa/Android_Studio/2016/0216/3969.html


Gradle構建腳本使用DSL(Domain Specific Language)來描述構建邏輯,使用的語言是Groovy。想了解Android Studio工程的Gradle構建系統,可以先從Project的settings.gradle、Project的build.gradle、Module的build.gradle、gradle/wrapper這些文件分析起。

1. Project的settings.gradle

這個文件描述的是Project里包含哪些module。

include ':app', ':lib'

2. Project的build.gradle

這個文件描述的是Gradle構建所引用的倉庫和最基礎的依賴。

buildscript {
   repositories {  //支持的倉庫包括jcenter, mavenCentral和Ivy
       jcenter()
   }
   dependencies {  //基礎依賴
       classpath 'com.android.tools.build:gradle:1.0.1'

    // NOTE: Do not place your application dependencies here: they belong
    // in the individual module build.gradle files
   }
}

allprojects {
   repositories {
       jcenter()
   }
}

3. Module的build.gradle

這個文件描述的是主Module的一些配置。

apply plugin: ‘com.android.application’ //添加用于Gradle構建過程的Android插件

android {   //所有android相關的構建參數
    compileSdkVersion 19  //編譯版本號
    buildToolsVersion “19.0.0”//構建工具版本號。需要大于或等于compileSdkVersion和targetSdkVersion

    defaultConfig { //AndroidManifest.xml相關參數配置的入口,允許覆蓋Manifest文件的配置
        applicationId “com.example.my.app” //不同package的唯一識別碼,僅存在于build.grade文件中
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {//構建和打包方式,默認含debug和release2種,其中debug包使用debug key簽名,release包默認無簽名
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro’//文件混淆。其中proguard-android.txt為默認的混淆配置,proguard-rules.pro為模塊額外的混淆配置

        }
    }
}

dependencies {  //模塊的依賴庫
    compile project(":lib”) //library module依賴
    compile 'com.android.support:appcompat-v7:19.0.1’//遠程庫依賴,格式為group:name:version
    compile fileTree(dir: 'libs', include: ['*.jar’]) //本地庫依賴,包含app/libs目錄下的所有jar文件。因此當module想引用某個jar時,只需將jar拷貝到<moduleName>/libs即可
}

applicationId也可以用于不同product flavour / build type使用不同applicationId的情況:

productFlavors {
    pro {
        applicationId = "com.example.my.pkg.pro"
    }
    free {
        applicationId = "com.example.my.pkg.free"
    }
}

buildTypes {
    debug {
        applicationIdSuffix ".debug” //applicationId后綴
    }
}
....

4. Gradle Wrapper

Gradle Wrapper字面理解即Gradle包裝,Android Studio使用Gradle Wrapper來完全嵌入Gradle的Android插件。我理解的是Android Studio不能直接使用Gradle的Android插件,需要再包一層引用。

gradle/wrapper屬于Project級別文件(NOTICE:需要添加到版本控制系統)。包含如下幾個文件:

  1. gradle-wrapper.jar文件

  2. gradle-wrapper.properties文件

  3. Windows平臺下的shell腳本(可選)

  4. Mac/Linux平臺下的shell腳本(可選)

Android Studio讀取properties文件的配置,且運行當前目錄下的wrapper文件。

gradle-wrapper.properties文件內容如下所示,若想使用指定的gradle,修改distributionUrl即可。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip

關于wrapper下的shell腳本,僅在命令行或非Android Studio環境下有效,Android Studio下不行。

5. 關于Build Variants

Build Variants我理解的是,基于同一份代碼所構建出的不同的APK。通常基于productFlavors和buildTypes兩個維度構建,當然也存在其他的維度(如CPU/ABI,可根據需要定義)。

若productFlavors含baidu和wandoujia兩種,buildTypes含release和debug兩種,則可構建出4個不同的包,分別為 baiduRelease, baiduDebug, wandoujiaRelease, wandoujiaDebug。

不同的包,若存在差異化功能,可能會出現形如這種風格的目錄src/main/,src/<buildType>/,src/<productFlavor>/。最終打包merge時優先級由高到低為src/<buildType>/ -> src/<productFlavor>/ -> src/main/ -> libraries/dependencies的src,并且高優先級會覆蓋低優先級內容。

6. Build Tasks

Android Studio構建系統定義了一系列構建Task,頂級Task包含:assemble, check, build, clean。

關于Task更詳細介紹可以研究下Gradle官方文檔。

7. 滿足不同構建包的差異化需求

這部分內容也是基于Build Variants。

通常做法為:

  1. 在build.gradle文件定義不同渠道的product flavors

  2. 對于存在差異化的product flavor,創建對應的source目錄src/<productFlavor>

  3. 在src/<productFlavor>下增加差異化代碼

  4. 以上操作同樣適用于buildTypes,如果有需要的話。實際開發中較少涉及,通常只存在productFlavors下加不同渠道的情況

假設baidu手機助手渠道包存在一些差異化功能:有2個頁面,FirstActivity跳轉到SecondActivity,其中FirstActivity相同,SecondActivity功能不同。

(1)首先在build.grade文件的productFlavors中添加baidu{},代表百度手機助手渠道包。

...
android {
    ...
    defaultConfig { ... }
    signingConfigs { ... }
    buildTypes { ... }
    productFlavors {
        baidu {
        }
        full {
        }
    }
}
...

(2)在app/src目錄下添加baidu包,baidu目錄結構和main保持一致,根據實際情況只添加差異化部分。此處在baidu包下添加SecondActivity.java文件并自定義實現即可。

(3)由于baidu和main目錄下的SecondActivity的package名稱相同,因此在main的FirstActivity啟動即可。

本文原文發自 某學姐

 

 本文由用戶 wpnw3690 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!