1. 程式人生 > >build.gradle詳解

build.gradle詳解

簡述:

1 > java開發中有兩個大名鼎鼎的專案構建ANT、Maven
2 > Google推薦使用的Android Studio是採用Gradle來構建專案的。Gradle是一個非常先進的專案構建工具。

Gradle是用了一種基於Groovy的領域特定語言(DSL,Domain Specific Language)來宣告專案設定,摒棄了XML(如ANT和Maven)的各種繁瑣配置。

3 > 專案中一般會出現2個或者多個build.gradle檔案,一個在根目錄下,一個在app目錄下。

如果切換到Android模式下則全部在Gradle Scripts


系統:Windows 7 64bit

1、根目錄下的build.gradle

1 > repositories閉包,聲明瞭jcenter()的配置

2 > dependencies閉包,聲明瞭一個Gradle外掛

buildscript {
    
    repositories {  //repositories閉包
        google()
        jcenter() //程式碼託管庫:設定之後可以在專案中輕鬆引用jcenter上的開源專案
    }
    dependencies {  //dependencies閉包
        classpath 'com.android.tools.build:gradle:3.0.0' ////宣告gradle外掛,外掛版本號為3.0.0
        //gradle是一個強大的專案構建工具,不僅可以構建Android,還可以構建java,C++等
        //此處引用android的外掛
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter() //程式碼託管庫:設定之後可以在專案中輕鬆引用jcenter上的開源專案
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


2、app 目錄下的build.gradle

1 > apply plugin,宣告是Android應用程式還是庫模組

2 > android 閉包,配置專案構建的各種屬性,compileSdkVersion用於指定專案的編譯SDK版本,buildToolsVersion用於指定專案構建工具的版本。

defaultConfig閉包:預設配置,應用程式包名,最小 sdk 版本,目標 sdk 版本,版本號,版本名

buildTypes閉包:指定生成安裝檔案的配置,是否對程式碼進行混淆

signingConfigs 閉包:簽名信息配置

sourceSets 閉包:原始檔路徑配置

lintOptions 閉包:lint 配置

3 > dependencies 閉包,指定當前專案的所有依賴關係,本地依賴,庫依賴以及遠端依賴

4 > repositories閉包,倉庫配置

// 宣告是Android程式,
//com.android.application 表示這是一個應用程式模組,可直接執行
//com.android.library 標識這是一個庫模組,是依附別的應用程式執行
apply plugin: 'com.android.application'

android {
    //程式在編譯的時候會檢查lint,有任何錯誤提示會停止build,我們可以關閉這個開關
    lintOptions {
        //即使報錯也不會停止打包
        abortOnError false
        //打包release版本的時候是否進行檢測
        checkReleaseBuilds false
    }

    //編譯sdk的版本,也就是API Level,例如API-19、API-20、API-21等等。
    compileSdkVersion 26
    //build tools的版本,其中包括了打包工具aapt、dx等等。
    //這個工具的目錄位於你的sdk目錄/build-tools/下
    buildToolsVersion '26.0.2'

    //關閉Android Studio的PNG合法性檢查
    aaptOptions.cruncherEnabled = false
    aaptOptions.useNewCruncher = false

    defaultConfig {  //預設配置
        applicationId "com.hebbe.espressotest" //應用程式的包名
        minSdkVersion 22  //最小sdk版本,如果裝置小於這個版本或者大於maxSdkVersion將無法安裝這個應用
        targetSdkVersion 26 //目標sdk版本,充分測試過的版本(建議版本)
        versionCode 1  //版本號,第一版是1,之後每更新一次加1
        versionName "1.0" //版本名,顯示給使用者看到的版本號

        archivesBaseName = "weshare-$versionName" //指定打包成Jar檔案時候的檔名稱
        ndk {
            moduleName "hebbewifisafe"                   //設定庫(so)檔名稱
            ldLibs "log", "z", "m", "jnigraphics", "android"
            //引入庫,比如要用到的__android_log_print
            abiFilters "armeabi", "x86", "armeabi-v7a"      //, "x86"  顯示指定支援的ABIs
            cFlags "-std=c++11 -fexceptions"                // C++11
            stl "gnustl_static"
        }

        //當方法數超過65535(方法的索引使用的是一個short值,
        //而short最大值是65535)的時候允許打包成多個dex檔案,動態載入dex。這裡面坑很深啊
        multiDexEnabled true

        //Instrumentation單元測試
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    //預設的一些檔案路徑的配置
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'//指定清單檔案
            res.srcDirs = ['res']//指定res資源目錄
            assets.srcDirs = ['assets']    //asset資源目錄
            jni.srcDirs 'src/main/jni'     //jni程式碼目錄
            jniLibs.srcDir 'src/main/jniLibs' //jni庫目錄
            java.srcDirs = ['src']//指定java原始碼目錄
            resources.srcDirs = ['src']//指定resource目錄
            aidl.srcDirs = ['src']//指定aidl目錄
            renderscript.srcDirs = ['src']//指定source目錄
        }
        debug.setRoot('build-types/debug')//指定debug模式的路徑
        release.setRoot('build-types/release')//指定release模式的路徑
    }

    //multiDex的一些相關配置,這樣配置可以讓你的編譯速度更快
    dexOptions {
        //讓它不要對Lib做preDexing
        preDexLibraries = false
        //開啟incremental dexing,優化編譯效率,這個功能android studio預設是關閉的。
        incremental true
        javaMaxHeapSize "4g"     //增加java堆記憶體大小
    }

    signingConfigs {//簽名配置
        release {//釋出版簽名配置
            storeFile file("fk.keystore")//金鑰檔案路徑
            storePassword "123456"//金鑰檔案密碼
            keyAlias "fk"//key別名
            keyPassword "123456"//key密碼
        }
        debug {//debug版簽名配置
            storeFile file("fk.keystore")
            storePassword "123456"
            keyAlias "fk"
            keyPassword "123456"
        }
    }

    //指定生成安裝檔案的配置,常有兩個子包:release,debug,注:直接執行的都是debug安裝檔案
    buildTypes {
        //release版本的配置,即生成正式版安裝檔案的配置
        release {
            zipAlignEnabled true  //是否支援zip
            shrinkResources true  // 移除無用的resource檔案
            minifyEnabled false //是否對程式碼進行混淆,true表示混淆
            //指定混淆時使用的規則檔案;
            // proguard-android.txt指所有專案通用的混淆規則,proguard-rules.pro當前專案特有的混淆規則
            //release的Proguard預設為Module下的proguard-rules.pro檔案
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            debuggable false  //是否支援除錯
            //ndk的一些配置
            ndk {
                // cFlags "-std=c++11 -fexceptions -O3 -D__RELEASE__" // C++11
                // platformVersion  = "19"
                moduleName "hebbewifisafe" //設定庫(so)檔名稱
                ldLibs "log", "z", "m", "jnigraphics", "android"
                //引入庫,比如要用到的__android_log_print
                abiFilters "armeabi", "x86", "armeabi-v7a"//, "x86"
                cFlags "-std=c++11 -fexceptions" // C++11
                stl "gnustl_static"
            }
            //採用動態替換字串的方式生成不同的release.apk
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('release.apk')) {
                        def timeStamp = new Date().format('yyyyMMddHH');
                        def fileName = "WeShare-${defaultConfig.versionName}" + "-" + timeStamp + "-lj-" + ".apk";
                        output.outputFile = file("${outputFile.parent}/${fileName}")
                    }
                }
            }
            jniDebuggable false  //關閉jni除錯
        }
        debug {//debug版本的配置
            minifyEnabled false
            zipAlignEnabled true
            shrinkResources true // 移除無用的resource檔案
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            debuggable true
//          jniDebuggable true
            ndk {
                cFlags "-std=c++11 -fexceptions -g -D __DEBUG__" // C++11
            }
            jniDebuggable true
        }
    }

    packagingOptions
        {
            exclude 'META-INF/ASL2.0'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/MANIFEST.MF'
        }
    
    compileOptions {
        //在這裡你可以進行 Java 的版本配置,
        //以便使用對應版本的一些新特性
    }
    productFlavors {
        //在這裡你可以設定你的產品釋出的一些東西,
        //比如你現在一共軟體需要釋出到不同渠道,
        //且不同渠道中的包名不同,那麼可以在此進行配置;
        //甚至可以設定不同的 AndroidManifest.xml 檔案。
        hebbe {
        }
        googlePlay {
        }
        solo {
        }
    }
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
    //所謂ProductFlavors其實就是可定義的產品特性,
    //配合 manifest merger 使用的時候就可以達成在一次編譯
    //過程中產生多個具有自己特性配置的版本。

    //上面這個配置的作用就是,為每個渠道包產生不同的 UMENG_CHANNEL_VALUE 的值。
}

//指定當前專案的所有依賴關係:本地依賴、庫依賴、遠端依賴
//本地依賴:可以對本地Jar包或目錄新增依賴關係
//庫依賴:可以對專案中的庫模組新增依賴關係
//遠端依賴:可以對jcenter庫上的開源專案新增依賴
//標準的遠端依賴格式是 域名:組織名:版本號
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar']) //本地依賴
    //遠端依賴,com.android.support是域名部分,appcompat-v7是組名稱,26.1.0是版本號
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation project(':hello')//庫依賴
    testImplementation 'junit:junit:4.12' //宣告測試用列庫
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

//宣告是要使用谷歌服務框架
apply plugin: 'com.google.gms.google-services'

//第三方依賴庫的本地快取路徑
task showMeCache << {
    configurations.compile.each { println it }
}
//使用maven倉庫。android有兩個標準的library檔案伺服器,一個jcenter一個maven。兩者毫無關係。
//jcenter有的maven可能沒有,反之亦然。
//如果要使用jcenter的話就把mavenCentral()替換成jcenter()
repositories {
    mavenCentral()
}


簡單的例子:

// 宣告是Android程式,
//com.android.application 表示這是一個應用程式模組,可直接執行
//com.android.library 標識這是一個庫模組,是依附別的應用程式執行
apply plugin: 'com.android.application'

android {
    //編譯sdk的版本,也就是API Level,例如API-19、API-20、API-21等等。
    compileSdkVersion 26
    //build tools的版本,其中包括了打包工具aapt、dx等等。
    //這個工具的目錄位於你的sdk目錄/build-tools/下
    buildToolsVersion '26.0.2'

    //關閉Android Studio的PNG合法性檢查
    aaptOptions.cruncherEnabled = false
    aaptOptions.useNewCruncher = false

    defaultConfig {  //預設配置
        applicationId "com.hebbe.espressotest" //應用程式的包名
        minSdkVersion 22  //最小sdk版本,如果裝置小於這個版本或者大於maxSdkVersion將無法安裝這個應用
        targetSdkVersion 26 //目標sdk版本,充分測試過的版本(建議版本)
        versionCode 1  //版本號,第一版是1,之後每更新一次加1
        versionName "1.0" //版本名,顯示給使用者看到的版本號

        //Instrumentation單元測試
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes { //build配置
        release {
            minifyEnabled false //是否對程式碼進行混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//指定當前專案的所有依賴關係:本地依賴、庫依賴、遠端依賴
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar']) //本地依賴
    //遠端依賴,com.android.support是域名部分,appcompat-v7是組名稱,26.1.0是版本號
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12' //宣告測試用列庫
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}


3、聊聊Groovy

Gradle選擇了Groovy。Groovy基於Java並拓展了Java。 Java程式設計師可以無縫切換到使用Groovy開發程式。Groovy說白了就是把寫Java程式變得像寫指令碼一樣簡單。寫完就可以執行,Groovy內部會將其編譯成Javaclass然後啟動虛擬機器來執行。

Groovy是一種動態語言。Groovy對自己的定義是:Groovy是在java平臺上的、 具有像Python, Ruby 和 Smalltalk 語言特性的靈活動態語言, Groovy保證了這些特性像 Java語法一樣被 Java開發者使用。

相關推薦

app目錄下的build.gradle

主要參考自《第一行程式碼》 // 表示這是一個Android程式模組,如果是作為庫,就宣告為Library'com.android.library' apply plugin: 'com.androi

Android Studio中Module的build.gradle

Gradle版本 我們在進行採用AS進行安卓專案的開發時,就必須接觸gradle,它是目前最新潮的一個構建專案的一個系統,而google也與時俱進,用著最新的東西,順便說下,eclipse之前是用Ant來構建專案的,還有一個用的比較多的就是maven。而AS的

build.gradle

簡述: 1 > java開發中有兩個大名鼎鼎的專案構建ANT、Maven。 2 > Google推薦使用的Android Studio是採用Gradle來構建專案的。Gradle是一個非常先進的專案構建工具。 Gradle是用了一種基於Groovy的領域特

gradle中的build script

[toc] gradle中的build script詳解 # 簡介 build.gradle是gradle中非常重要的一個檔案,因為它描述了gradle中可以執行的任務,今天本文將會帶大家體驗一下如何建立一個build.gradle檔案和如何編寫其中的內容。 # project和task gradl

eclipse打包說明 Run as ---Maven build 命令

Goals: clean 清除編譯,compile 編譯,test 編譯並測試,install 打包併發送到本地倉庫,package 只是打成jar包,並不會傳送到本地倉庫 測試: run as maven build.. goals 輸入 clean test 打包: run as

Ubuntu 18.04/18.10上安裝Gradle

Gradle是一個主要用於Java專案的通用構建工具。它結合了Ant和Maven的最佳功能。與使用XML進行指令碼編寫的前輩不同,Gradle使用Groovy,這是一種動態的,面向物件的Java平臺程式語言,用於定義專案和構建指令碼。 前提條件 為了能夠在Ubuntu系統上安裝軟體包,您必須以具有sud

Gradle

先看下Gradle的定義: Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化構建開源工具。它使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定,拋棄了基於XML的各種繁瑣配置。 抽住定義中的核心就是DSL版本的編譯工具,解決XML版本編譯工具的

Ant之build.xml

Ant的概念 可能有些讀者並不連線什麼是Ant以及入可使用它,但只要使用通過Linux系統得讀者,應該知道make這個命令。當編譯Linux核心及一些軟體的源程式時,經常要用這個命令。Make命令其實就是一個專案管理工具,而Ant所實現功能與此類似。像make,gnumake

Android Gradle

瞭解Gradle配置對於我們日常開發太重要了,我們要知道為什麼要這樣配置,這樣配置的優缺點,不能盲目。 一,預設配置 1,defaultConfig是Android物件中預設配置,它是一個ProductFlavor。預設配置有包名,版本號,版本名稱等資訊 android{

Ant之build.xml(有例項)

Ant的概念  可能有些讀者並不連線什麼是Ant以及入可使用它,但只要使用通過Linux系統得讀者,應該知道make這個命令。當編譯Linux核心及一些軟體的源程式時,經常要用這個命令。Make命令其實就是一個專案管理工具,而Ant所實現功能與此類似。像make,gnumake和nmake這些編譯工具都有一

gradle ——你真的瞭解Gradle嗎?

前段時間忽然發現自己對於Android studio的Gradle打包並不瞭解,這篇部落格參考網上眾多教程,為大家詳細介紹Gradle。 Gradle簡介 We would like to intro

Ant之build.xml---可用

Ant的概念 :在Eclipse中使用Ant Ant是Java平臺下非常棒的批處理命令執行程式,能非常方便地自動完成編譯,測試,打包,部署等等一系列任務,大大提高開發效率。 Ant和make命令很像。當編譯Linux核心及一些軟體的源程式時,經常要用這個命令。Make命令其

docker build命令

docker build命令用於根據給定的Dockerfile和上下文以構建Docker映象。 docker build命令的使用格式:docker build [OPTIONS] <PATH | URL | -> 1. 常用選項說明--build-arg,設定

Gradle

Gradle是當前非常“勁爆”的構建工具。本篇文章就是專為講解Gradle而來。介紹Gradle之前,先說點題外話。 一、題外話 說實話,我在索尼工作的時候,就見過Gradle。但是當時我一直不知道這是什麼東西。而且索尼工具組的工程師還將其和And

深入理解Android(一):Gradle

作者 鄧凡平 編者按:隨著移動裝置硬體能力的提升,Android系統開放的特質開始顯現,各種開發的奇技淫巧、黑科技不斷湧現,InfoQ特聯合《深入理解Android》系列圖書作者鄧凡平,開設深入理解Android專欄,探索Android從框架到應用開

eclipse中java專案的build path

BuildPath中只支援加入jar檔案,具體方法如下: 在eclips裡在工程名上右鍵->build path->contigure bud path->java build path裡有個 libraries-> add external j

Android Gradle 2016 乾貨

為啥要說Gradle,因為這哥們是在是個坑啊,而且還是繞不開的坑啊。 就像我,上來就一心想著幹程式碼,完成專案,但是往往有的時候就會掉到這個坑裡而無法自拔。實在是恨死了啊。說多了都是眼淚,那麼直接上圖,從簡到難,深入淺出的來了解一下Gradle到底是個什麼東西

gradle ——你真的瞭解Gradle

前段時間忽然發現自己對於Android studio的Gradle打包並不瞭解,這篇部落格參考網上眾多教程,為大家詳細介紹Gradle。 Gradle簡介 We would like to introduce Gradle to you, a build system th

Gradle(二)——Gradle

1 Gradle概述 參考 配置環境 去gradle官網下載gradle程式的壓縮包,解壓到硬碟。 在解壓得到的目錄中找到“gradle.bat”檔案,將其所在路徑(如“E:\gradle-4.2.1\bin”)新增到Windows系統的PATH

build.gradle文件<三>

服務器 mea target rule ttr github -1 ply dot 參考:http://blog.csdn.net/baidu_31093133/article/details/51860637 build.gradle配置參數詳解 //聲