總結(jié):Android之Gradle總結(jié)

本文主要總結(jié)的內(nèi)容如下:

  • Groovy介紹

  • 一、Gradle簡介(定義與特性)

  • 二、Gradle使用

    • 1、Multi-Projects Build
    • 2、gradle命令
    • 3、gradle的工作流程
    • 4、Gradle編程模型
  • 三、Android中使用Gradle

    • 1、相關(guān)文件
    • 2、Android tasks
    • 3、相關(guān)配置
    • 4、Gradle模板舉例

0、Groovy介紹:

Gradle 選擇了Groovy。Groovy基于Java并拓展了Java。

Gradle選擇了Groovy的原因:
Groovy基于Java并拓展了Java。 Java程序員可以無縫切換到使用Groovy開發(fā)程序。Groovy說白了就是把寫Java程序變得像寫腳本一樣簡單。寫完就可以執(zhí)行,Groovy內(nèi)部會將其編譯成Javaclass然后啟動虛擬機(jī)來執(zhí)行。

  • 1、定義:Groovy是在 java平臺上的、 具有像Python,RubySmalltalk語言特性的靈活動態(tài)語言, Groovy保證了這些特性像 Java語法一樣被 Java開發(fā)者使用。

  • 2、Groovy是一種動態(tài)語言。

  • 3、Groovy與Java的關(guān)系:
    當(dāng)我執(zhí)行Groovy腳本時,Groovy會先將其編譯成Java類字節(jié)碼,然后通過Jvm來執(zhí)行這個Java類。


    Java、Groovy和Jvm的關(guān)系示意圖
  • 4、特性:

    • Groovy注釋標(biāo)記和Java一樣,支持//或者/**/
    • Groovy語句可以不用分號結(jié)尾。
    • Groovy中支持動態(tài)類型,即定義變量的時候可以不指定其類型。Groovy中,變量定義可以使用關(guān)鍵字def。注意,雖然def不是必須的,但是為了代碼清晰,建議還是使用def關(guān)鍵字。
    • 函數(shù)定義時,參數(shù)的類型也可以不指定。
    • 除了變量定義可以不指定類型外,Groovy中函數(shù)的返回值也可以是無類型的
         //無類型的函數(shù)定義,必須使用def關(guān)鍵字
         def  nonReturnTypeFunc(){
             last_line   //最后一行代碼的執(zhí)行結(jié)果就是本函數(shù)的返回值
         }
         //如果指定了函數(shù)返回類型,則可不必加def關(guān)鍵字來定義函數(shù)
         String getString(){
            return"I am a string"
         }
      

快速學(xué)習(xí)攻略:Groovy腳本基礎(chǔ)全攻略

一、Gradle簡介

1、定義

  • 1、Gradle是一個工具,同時它也是一個編程框架。

  • 2、Gradle中,每一個待編譯的工程都叫一個Project。
    每一個Project在構(gòu)建的時候都包含一系列的Task。
    比如一個Android APK的編譯可能包含:Java源碼編譯Task、資源編譯Task、JNI編譯Task、lint檢查Task、打包生成APK的Task、簽名Task等。

  • 3、Gradle是一個框架,作為框架,它負(fù)責(zé)定義流程和規(guī)則。而具體的編譯工作則是通過插件的方式來完成的。比如編譯Java有Java插件,編譯Groovy有Groovy插件,編譯Android APP有Android APP插件,編譯Android Library有Android Library插件。

2、特性:

  • 使用靈活的語言來寫構(gòu)建規(guī)則。
  • Gradle是一種DSL,即Domain Specific Language,領(lǐng)域相關(guān)語言。

二、Gradle使用

1、Multi-Projects Build

將多個Project進(jìn)行統(tǒng)一編譯,類似這種操作,在Gradle中,可以稱之為Multi-Projects Build

1.1、使用方式:
  • 1、在工程根目錄(如圖中g(shù)radleProjects)下添加一個build.gradle文件(用于配置其他子Project的)

  • 2、在工程根目錄(如圖中g(shù)radleProjects)下添加一個settings.gradle文件(名稱必須為settings.gradle用于告知Gradle包含多少個子Project)。

    Multi-Projects Build 文件夾示意圖
1.2、.gradle 內(nèi)容:
  • 1、build.gralde:
    為子Project添加一些屬性。這個build.gradle有沒有都無所屬。

  • 2、settings.gradle

       #settings.gradle
       include 'project1',
               'project2',
               'project3',
               'project4'
    

2、gradle命令:

2.1、查看工程信息:
  • 命令:gradle projects
    在根目錄(如gradleProjects)下打開終端,執(zhí)行此命令
  • 結(jié)果:顯示有多少個project
gradle projects命令
2.2、查看任務(wù)信息:
  • 命令:gradleproject-path:tasks
    在子目錄(如project1)下打開終端,執(zhí)行此命令。若不在子目錄中則需要加上project-path
  • 結(jié)果:顯示當(dāng)前項(xiàng)目的任務(wù)信息
    由于我這個子目錄下什么也沒有,所以顯示的信息是這個樣子。
gradle:tasks命令
2.3、執(zhí)行任務(wù)(task)
  • 命令:gradle task-name
    task-name為指定任務(wù)的名稱,如clean清理任務(wù)
  • 示例:
    • gradle clean是執(zhí)行清理任務(wù),和make clean類似。
    • gradle properites 用來查看所有屬性信息。

3、gradle的工作流程:

gradle工作流程

包含三個階段:

  • 1、首先是初始化階段(Initiliazation phase)。
    對我們前面的multi-project build而言,就是執(zhí)行settings.gradle。

  • 2、Configration階段的目標(biāo)是解析每個project中的build.gradle。

    • 比如multi-project build例子中,解析每個子目錄中的build.gradle。在這兩個階段之間,我們可以加一些定制化的Hook。這當(dāng)然是通過API來添加的。

    • Configuration 階段完了后,整個build的project以及內(nèi)部的Task關(guān)系就確定了。一個Project包含很多Task,每個Task之間有依賴關(guān)系。Configuration會建立一個有向圖來描述Task之間的依賴關(guān)系。所以,我們可以添加一個HOOK,即當(dāng)Task關(guān)系圖建立好后,執(zhí)行一些操作。

  • 3、最后一個階段就是執(zhí)行任務(wù)了。
    你在gradle xxx中指定什么任務(wù),gradle就會將這個xxx任務(wù)鏈上的所有任務(wù)全部按依賴順序執(zhí)行一遍!
    任務(wù)執(zhí)行完后,我們還可以加Hook。

4、Gradle編程模型

Gradle基于Groovy,Groovy又基于Java。所以,Gradle執(zhí)行的時候和Groovy一樣,會把腳本轉(zhuǎn)換成Java對象。

Gradle主要有三種對象,這三種對象和三種不同的腳本文件對應(yīng),在gradle執(zhí)行的時候,會將腳本轉(zhuǎn)換成對應(yīng)的對端:

  • Gradle對象
    當(dāng)我們執(zhí)行gradle xxx或者什么的時候,gradle會從默認(rèn)的配置腳本中構(gòu)造出一個Gradle對象。在整個執(zhí)行過程中,只有這么一個對象。Gradle對象的數(shù)據(jù)類型就是Gradle。
    我們一般很少去定制這個默認(rèn)的配置腳本。

  • Project對象:
    每一個build.gradle會轉(zhuǎn)換成一個Project對象。

  • Settings對象:
    每一個settings.gradle都會轉(zhuǎn)換成一個Settings對象。

各種類型Gradle對應(yīng)的對象類型:

腳本類型 關(guān)聯(lián)對象類型
Build script Project
Init script Gradle
Settings script Settings
4.1、Gradle對象:

gradle對象的屬性如圖,其中的幾個屬性說明如下:

  • hashCode()
    在settings.gradle和build.gradle中,gradle實(shí)例對象的hashCode是一樣的
  • HomeDir
    是指在哪個目錄存儲的gradle可執(zhí)行程序
  • User Home Dir
    gradle自己設(shè)置的目錄,里邊存儲了一些配置文件,以及編譯過程中的緩存文件,生成的類文件,編譯中依賴的插件等等。
Gradle對象屬性
4.2、Project對象:
  • 1、每一個build.gradle文件都會轉(zhuǎn)換成一個Project對象。在Gradle術(shù)語中,Project對象對應(yīng)的是BuildScript。

  • 2、Project包含若干Tasks。由于Project對應(yīng)具體的工程,所以需要為Project加載所需要的插件,比如為Java工程加載Java插件。其實(shí),一個Project包含多少Task往往是插件決定的。

  • 3、一個項(xiàng)目在構(gòu)建時都具備如下流程:

    • 為當(dāng)前項(xiàng)目創(chuàng)建一個Settings類型的實(shí)例。
    • 如果當(dāng)前項(xiàng)目存在settings.gradle文件,則通過該文件配置剛才創(chuàng)建的Settings實(shí)例。
    • 通過Settings實(shí)例的配置創(chuàng)建項(xiàng)目層級結(jié)構(gòu)的Project對象實(shí)例。
    • 最后通過上面創(chuàng)建的項(xiàng)目層級結(jié)構(gòu)Project對象實(shí)例去執(zhí)行每個Project對應(yīng)的build.gradle 腳本。
  • 4、在Project中,需要:

    • 加載插件(調(diào)用apply函數(shù)):
       //二進(jìn)制插件(如jar包)
       //Android中的build.gradle
       apply plugin: 'com.android.library'    <==如果是編譯Library,則加載此插件
       apply plugin: 'com.android.application'  <==如果是編譯Android APP,則加載此插件
      
        //加載一個gradle文件
        apply from: rootProject.getRootDir().getAbsolutePath() + "/utils.gradle"
      
    • 不同插件有不同的配置。在Project中配置后,插件就知道從何處讀取源文件
    • 設(shè)置屬性:
      單個腳本,不需要考慮屬性的跨腳本傳播。
      extra property(額外屬性):通過ext前綴標(biāo)示是一個額外屬性。定義好之后,后面的存取就不需要ext前綴了。ext屬性支持Project和Gradle對象。即Project和Gradle對象都可以設(shè)置ext屬性:
          //第一次定義或者設(shè)置它的時候需要ext前綴
          gradle.ext.api =properties.getProperty('sdk.api')
          println gradle.api  //再次存取api的時候,就不需要ext前綴了
      

三、Android中的Gradle

Android自己定義了好多Script Block。Android定義的DSL參考文檔在
https://developer.android.com/tools/building/plugin-for-gradle.html下載。

Android的DSL參考信息

1、相關(guān)文件

  • Android中g(shù)radle項(xiàng)目基本的目錄結(jié)構(gòu):
     demoApp
        |-- build.gradle
        |-- settings.gradle
        |-- app
            |-- build.gradle
        |-- gradlew
        |-- gradlew.bat
        |-- gradle
            |-- wrapper
                |-- gradle-wrapper.jar
                |-- gradle-wrapper.properties
        |-- gradle.properties
        |-- local.properties
    
1.1、local.properties

對于Android來說,local.properties 是必須的,下面兩個配置sdk.dir和ndk.dir是Android Gradle必須要指定的。

   #設(shè)置sdk目錄
   sdk.dir=xxx
   #設(shè)置ndk目錄
   ndk.dir=yyy
1.2、項(xiàng)目根目錄(頂層)的build.gradle

一般情況下,這個build.gradle 是做一些全局配置,其配置最終會被應(yīng)用到所有項(xiàng)目中。它典型的配置如下:

   apply from: 'dependencies.gradle'
   
   buildscript {
       repositories {
           jcenter()
           mavenCentral()
       }
       dependencies {
           classpath 'com.android.tools.build:gradle:3.2.1'
       }
   }
   
   allprojects {
       repositories {
           jcenter()
           google()
       }
   }
   
   task clean(type: Delete) {
       delete rootProject.buildDir
   }
  • buildscript:定義了 Android 編譯工具的類路徑。repositories 中的 jCentermavenCentral` 是兩個倉庫。

  • allprojects:中定義的屬性會被應(yīng)用到所有 module 中,但是為了保證每個項(xiàng)目的獨(dú)立性,我們一般不會在這里面操作太多共有的東西。(一般外部依賴庫都在其中,gradle會通過查找在這里配置的倉庫來比編譯指定的依賴庫?)

1.3、每個子項(xiàng)目中的build.gradle

針對每個module 的配置,如果其build.gradle中定義的選項(xiàng)和頂層build.gradle定義的相同,則頂層中的配置會被覆蓋。典型的配置內(nèi)容如下:

      apply plugin: 'com.android.application'
      
      android {
          compileSdkVersion 28
          buildToolsVersion "28.0.3"
      
          defaultConfig {
              applicationId "com.demo.testapp"
              minSdkVersion 14
              targetSdkVersion 28
      
              versionCode 1.1.1
              versionName "111"
          }
      
          signingConfigs {
              debug {
                  storeFile file("../debug.jks")
      
                  storePassword "123456"
                  keyAlias "haha"
                  keyPassword "123456"
              }
      
              release {
                  storeFile file("../release.jks")
      
                  storePassword "123456"
                  keyAlias "haha"
                  keyPassword "123456"
              }
          }
      
          buildTypes {
              debug {
                  minifyEnabled false      //是否混淆
                  shrinkResources false    //去除沒有用到的資源文件
              }
      
              release {
                  minifyEnabled true
                  shrinkResources true
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro"
                  signingConfig signingConfigs.release
              }
          }
      
          repositories {
              //添加aar
              flatDir {
                  dirs 'libs'
              }
          }
      
      }
      
      dependencies {
          api fileTree(include: ['*.jar'], dir: 'libs')
          api "com.android.support:appcompat-v7:27.1.1"
      }
  • apply plugin:gradle插件,作為Android 的應(yīng)用程序,這一步是必須的,因?yàn)閜lugin中提供了Android 編譯、測試、打包等等的所有task。

  • android:關(guān)于android 的所有特殊配置都在這個代碼塊中,這就是由上面聲明的 plugin 提供的。

    • defaultConfig:程序的默認(rèn)配置;這里配置的相關(guān)屬性會覆蓋AndroidManifest.xml 中定義的屬性(如versionName)
    • applicationId:定義了APP的包名,不同于AndroidManifest.xml中的package屬性。
  • buildTypes:定義了編譯類型,針對每個類型我們可以有不同的編譯配置,不同的編譯配置對應(yīng)的有不同的編譯命令。默認(rèn)的有debug、release 的類型。

  • dependencies:gradle 的依賴配置。它定義了當(dāng)前項(xiàng)目需要依賴的其他庫。

1.4、Gradle Wrapper

gradle wrapper 是針對gradle新版本對舊版本的向后兼容性問題而使用的。

gradlw wrapper 包含一些腳本文件和針對不同系統(tǒng)下面的運(yùn)行文件。wrapper 有版本區(qū)分,但是并不需要你手動去下載,當(dāng)你運(yùn)行腳本的時候,如果本地沒有會自動下載對應(yīng)版本文件。

在不同操作系統(tǒng)下面執(zhí)行的腳本不同,在 Mac 系統(tǒng)下執(zhí)行./gradlew ...,在windows 下執(zhí)行g(shù)radle.bat進(jìn)行編譯。

  • gradle wrapper目錄結(jié)構(gòu):
     demoApp
        |-- gradlew
        |-- gradlew.bat
        |-- gradle
            |-- wrapper
                |-- gradle-wrapper.jar
                |-- gradle-wrapper.properties
    

2、Android tasks

2.1、基本的tasks:
  • assemble:對buildType 下的所有配置類型生成相應(yīng)的apk包
  • clean:移除所有編譯輸出的文件,如apk
  • check:執(zhí)行lint檢測編譯
  • build:同時執(zhí)行assemblecheck

這些基本的task,在實(shí)際項(xiàng)目中會根據(jù)不同的配置,會對這些task 設(shè)置不同的依賴。如默認(rèn)的 assmeble 會依賴 assembleDebugassembleRelease,如果直接執(zhí)行assmeble,最后會編譯debugrelease 的所有版本出來。如果我們只需要編譯debug 版本,我們可以運(yùn)行assembleDebug。

2.2、新增task:
  • install,會將編譯后的apk 安裝到連接的設(shè)備。

3、相關(guān)配置

3.1、BuildConfig

這個類是由gradle根據(jù)配置文件生成的,通過配置一些key-value 的鍵值對,可以用BuildConfig獲取相應(yīng)的字段。例如:

    //module下的build.gradle
    buildTypes {
        debug {
            //配置網(wǎng)絡(luò)請求根地址
            buildConfigField 'String', 'API_URL', '"http://test.com/api/debug/"'
            //配置app名稱
            resValue "string", "app_name", "測試版"
        }

        release {
            //配置網(wǎng)絡(luò)請求根地址
            buildConfigField 'String', 'API_URL', '"http://test.com/api/release/"'
            //配置app名稱
            resValue "string", "app_name", "上線版"
        }
    }

在使用時,只需要調(diào)用BuildConfig.API_URL,就能獲得當(dāng)前環(huán)境(debug或release)下的值。
而用resValue配置的,則不需要再strings.xml中配置相應(yīng)名稱的值,否則會報(bào)錯。

3.2、Repositories

repositories中配置的是代碼倉庫。在dependencies 中配置的一些依賴庫都是從這里下載的。
Gradle 支持三種類型的倉庫:Maven、Ivy和一些靜態(tài)文件或者文件夾。在編譯的執(zhí)行階段,gradle 將會從倉庫中取出對應(yīng)需要的依賴文件,當(dāng)然,gradle 本地也會有自己的緩存,不會每次都去取這些依賴。

  • gradle 支持多種 Maven 倉庫,一般常用的是jCenter。

     //項(xiàng)目根目錄下的build.gradle
     repositories {
         jcenter()
         google()
     }
    
  • 有一些項(xiàng)目,可能是一些公司私有的倉庫中的,這時候需要手動加入倉庫連接,而有的需要用戶名和密碼,

     //項(xiàng)目根目錄下的build.gradle
     repositories {
        maven {
            url 'https://jitpack.io'
            credentials {
               username 'xxx'
               password 'yyy'
            }
        }
      }
    
  • 可以使用相對路徑配置本地倉庫,通過配置項(xiàng)目中存在的靜態(tài)文件夾作為本地倉庫:

       //module下的build.gradle
       android {
         ......
         repositories {
            flatDir {
                dirs 'libs'
            }
          }
       }
    
3.3、Dependencies

依賴庫的配置。

  • File dependencies
    通過files()方法可以添加文件依賴,如果有很多jar文件,我們也可以通過fileTree()方法添加一個文件夾,除此之外,我們還可以通過通配符的方式添加,如下:
   //module下的build.gradle
   dependencies {
       api fileTree(include: ['*.jar'], dir: 'libs')
   }
  • aar dependencies
    可以將項(xiàng)目打包成aar 文件,通過文件的形式來引用:
   //module下的build.gradle
   //其中的aarname是打包的aar文件的名稱,后面的ext是固定的
   dependencies {
       api(name: 'aarname', ext: 'aar')
   }
3.4、Source sets

封裝所有變體的源集配置。

  • 1、Native libraries
    配置本地 .so庫。在配置文件中做如下配置,然后在對應(yīng)位置建立文件夾,加入對應(yīng)平臺的.so文件。
   //方式一:
    android {
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs', , 'src/main/jni']
            }
        }
    }

    //方式二
    android {
        sourceSets.main {
            jni.srcDirs 'libs'
        }
    }
jni目錄示意圖
  • 2、配置源集:
        sourceSets {
            main {
                //更改Java源的目錄。默認(rèn)目錄是:'src/main/java'。
                java.srcDirs = ['other/java']
                // 默認(rèn)目錄是'src/main/res'
                res.srcDirs = [ 'other/res1', 'other/res2' ]
                //設(shè)置清單。默認(rèn)目錄是:src/main/AndroidManifest.xml
                manifest.srcFile 'other/AndroidManifest.xml'
                ...
            }
            //創(chuàng)建其他塊以配置其他源集。
            androidTest {
                setRoot 'src/tests'
                ...
            }
        }
    
    • main中的res.srcDirs如果列出多個目錄,Gradle將使用它們來收集源。由于Gradle為這些目錄提供了相同的優(yōu)先級,如果在多個目錄中定義相同的資源,則在合并資源時會出現(xiàn)錯誤。

    • 對于每個源集,只能指定一個AndroidManifest.xml。

    • 如果源集的所有文件都位于單個根目錄下,則可以使用setRoot屬性指定該目錄。收集源集的源時,Gradle僅在相對于您指定的根目錄的位置中查找。例如,在將配置應(yīng)用于androidTest源集之后,Gradle僅在src/tests/java/ 目錄中查找Java源。

3.5、Product flavors:

關(guān)于構(gòu)建不同的Product flavors,可以參考如下:
Build Variants
技術(shù):Android打包簽名總結(jié)

4、Gradle模板舉例

  • 4.1、Project的build.gradle

       // Top-level build file where you can add configuration options common to all sub-projects/modules.
       //全局引入gradle文件
       apply from: 'dependencies.gradle'
       
       //gradle腳本執(zhí)行所需依賴,包含依賴倉庫和插件
       buildscript {
       
           //配置遠(yuǎn)程倉庫
           repositories {
               //從Android Studio3.0后新增了google()配置,可以引用google上的開源項(xiàng)目
               google()
               //一個類似于github的代碼托管倉庫,聲明了jcenter()配置,可以輕松引用 jcenter上的開源項(xiàng)目
               jcenter()
       
               //本地倉庫
               mavenLocal()
               //maven中央倉庫
               mavenCentral()
               //指定maven倉庫
               maven { url "https://jitpack.io" }
               maven { url 'https://maven.google.com' }
           }
       
           //配置插件
           dependencies {
               //此處是android的插件gradle,gradle是一個強(qiáng)大的項(xiàng)目構(gòu)建工具
               classpath 'com.android.tools.build:gradle:3.2.1'
               //其他插件,這里是數(shù)據(jù)庫greendao的插件
               classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
           }
       }
       
       //項(xiàng)目本身需要的依賴,比如項(xiàng)目所需的maven庫
       allprojects {
           repositories {
               jcenter()
               google()
               maven { url 'https://jitpack.io' }
               maven { url 'https://maven.google.com' }
           }
       }
       
       //清除任務(wù)
       task clean(type: Delete) {
           delete rootProject.buildDir
       }
    
  • 4.2、Module的build.gradle

       //app應(yīng)用插件,聲明為Android應(yīng)用程序
       apply plugin: 'com.android.application' //表示是一個應(yīng)用程序模塊,直接運(yùn)行
       //apply plugin: 'com.android.library'   //表示是一個庫模塊,被其他module依賴
       
       apply plugin: 'walle'   //其他插件,這里是打包插件
       
       //定義變量
       def versionConfigs = rootProject.extensions.getByName("ext")
       
       android {
           //編譯時用的Android版本
           compileSdkVersion versionConfigs.androidCompileSdkVersion
           //構(gòu)建工具的版本
           buildToolsVersion versionConfigs.androidBuildToolsVersion
       
           //默認(rèn)配置,會被下面的相同的配置覆蓋
           defaultConfig {
               //項(xiàng)目包名,唯一標(biāo)識,和AndroidManifest.xml中的package(Java文件包名)不同
               applicationId "com.example.app"
               //程序最低兼容的運(yùn)行版本,低于此版本無法安裝
               minSdkVersion versionConfigs.androidMinSdkVersion
               //項(xiàng)目的目標(biāo)版本
               targetSdkVersion versionConfigs.androidTargetSdkVersion
       
               //版本號
               versionCode VERSION_CODE as int
               //版本名稱,給用戶看的
               versionName VERSION_NAME
       
               //支持multidex
       //        multiDexEnabled true
       
               //表明要使用AndroidJUnitRunner進(jìn)行單元測試
               testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
           }
       
           //程序在編譯的時候會檢查lint,有任何錯誤提示會停止build,我們可以關(guān)閉這個開關(guān)
           lintOptions {
               //打包release版本的時候進(jìn)行檢測
               checkReleaseBuilds false
               //即使報(bào)錯也不會停止打包
               abortOnError false
               //屏蔽translate引起的warning
               disable "MissingTranslation"
           }
       
           //自動化打包配置,可以自定義配置多種打包配置
           signingConfigs {
               //測試配置
               debug {
                   //debug簽名文件路徑
                   storeFile file("../debug.jks")
       
                   //簽名相關(guān)信息,配置在了gradle.properties中了
                   storePassword SIGNINGCONFIGS_PSW
                   keyAlias SIGNINGCONFIGS_KEYALIAS
                   keyPassword SIGNINGCONFIGS_PSW
               }
       
               //上線配置
               release {
                   //release簽名文件路徑
                   storeFile file("../release.jks")
       
                   //簽名相關(guān)信息,配置在了gradle.properties中了
                   storePassword SIGNINGCONFIGS_PSW
                   keyAlias SIGNINGCONFIGS_KEYALIAS
                   keyPassword SIGNINGCONFIGS_PSW
               }
           }
       
           //構(gòu)建類型,可自定義多種類型
           buildTypes {
               debug {
                   minifyEnabled false      //是否混淆
                   shrinkResources false    //去除沒有用到的資源文件
               }
       
               release {
                   minifyEnabled true
                   shrinkResources true
                   proguardFiles getDefaultProguardFile('proguard-android.txt'), "$rootDir/ModuleLibs/config/proguard-rules.pro"
                   signingConfig signingConfigs.release
               }
           }
       
           repositories {
               //添加本地aar目錄
               flatDir {
                   dirs 'libs'
               }
           }
       
           //配置源集
           sourceSets {//目錄指向配置
               main {
                   jniLibs.srcDirs = ['libs']//指定lib庫目錄
               }
           }
       
       }
       
       //依賴
       dependencies {
           //本地文件依賴
           api fileTree(include: ['*.jar'], dir: 'libs')
       
           //測試用例庫
           testImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
               exclude group: 'com.android.support', module: 'support-annotations'
           })
       
           //依賴corelib的module
           api project(':corelib')
           
           //定義外部變量的引用
           def andlibs = rootProject.ext.andlibs
           def libs = rootProject.ext.libs
           api andlibs.appcompat_v7
       }
    

相關(guān)鏈接:
Android Plugin DSL Reference
Gradle Android插件用戶指南翻譯

深入理解Android之Gradle
史上最全Android build.gradle配置詳解
Gradle 完整指南(Android)
Gradle 提速:每天為你省下一杯喝咖啡的時間

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

相關(guān)閱讀更多精彩內(nèi)容

  • 在 Android Studio 構(gòu)建的項(xiàng)目中,基于 Gradle 進(jìn)行項(xiàng)目的構(gòu)建,同時使用 Android DS...
    Ant_way閱讀 7,581評論 0 16
  • 是什么? 在語法上是基于Groovy語言的(Groovy 是一種基于JVM的敏捷開發(fā)語言,可以簡單的理解為強(qiáng)類型語...
    千山萬水迷了鹿閱讀 99,969評論 4 122
  • Gradle是一款非常優(yōu)秀的構(gòu)建系統(tǒng)工具,它的DSL基于Groovy實(shí)現(xiàn),可以讓你很方便的通過代碼控制這些DSL來...
    飛雪無情flysnow_org閱讀 3,656評論 0 35
  • 說明 本文主要介紹和Gradle關(guān)系密切、相對不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    搬磚的小明閱讀 16,141評論 1 62
  • 今天上午兒子在家把妹妹的紅雨鞋復(fù)習(xí)完了一遍,I0點(diǎn)后去上英語課,在英語課上,兒子表現(xiàn)積極,得了最高分,6個...
    鈞宇閱讀 301評論 0 0

友情鏈接更多精彩內(nèi)容