前言
Android Studio是采用gradle來構建項目的,gradle是基于groovy語言的,如果只是用它構建普通Android項目的話,是可以不去學groovy的。當我們創建一個Android項目時會包含兩個Android build.gradle配置詳解文件,如下圖:
一、Project的build.gradle文件:
對應的build.gradle代碼如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {//這里是gradle腳本執行所需依賴,分別是對應的maven庫和插件 repositories { google()//從Android Studio3.0后新增了google()配置,可以引用google上的開源項目 jcenter()//是一個類似于github的代碼托管倉庫,聲明了jcenter()配置,可以輕松引用 jcenter上的開源項目 } dependencies { classpath 'com.android.tools.build:gradle:3.0.0'////此處是android的插件gradle,gradle是一個強大的項目構建工具 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}allprojects {//這里是項目本身需要的依賴,比如項目所需的maven庫 repositories { google() jcenter() }}// 運行gradle clean時,執行此處定義的task任務。// 該任務繼承自Delete,刪除根目錄中的build目錄。// 相當于執行Delete.delete(rootProject.buildDir)。// gradle使用groovy語言,調用method時可以不用加()。task clean(type: Delete) { delete rootProject.buildDir}
repositories{}閉包:配置遠程倉庫
該閉包中聲明了jcenter()和google()的配置,其中jcenter是一個代碼托管倉庫,上面托管了很多Android開源項目,在這里配置了jcenter后我們可以在項目中方便引用jcenter上的開源項目,從Android Studio3.0后新增了google()配置,可以引用google上的開源項目。
dependencies{}閉包:配置構建工具
該閉包使用classpath聲明了一個Gradle插件,由于Gradle并不只是用來構建Android項目,因此此處引入相關插件來構建Android項目,其中'3.3.3'為該插件的版本號,可以根據最新的版本號來調整。
二、Module的build.gradle文件:
從文件內容可以看出,主要分為三大部分,如下圖所示:
1、apply plugin:
// 聲明是Android程序,//com.android.application 表示這是一個應用程序模塊//com.android.library 標識這是一個庫模塊//而這區別:前者可以直接運行,后著是依附別的應用程序運行apply plugin: 'com.android.application'
文件中第一行使用apply plugin表示應用了一個插件,該插件一般有兩種值可選:
2、android{}閉包:
這個閉包主要為了配置項目構建的各種屬性:
2.1、添加signingConfigs{}閉包:
signingConfigs {// 自動化打包配置 release {// 線上環境 keyAlias 'test' keyPassword '123456' storeFile file('test.keystore') storePassword '123456' } debug {// 開發環境 keyAlias 'test' keyPassword '123456' storeFile file('test.keystore') storePassword '123456' } }
可以手動添加簽名配置,也可以通過Project Structure 選中app,點擊Singing添加,具體步驟如下圖所示:
配置Singing.png
簽名配置完成后可以方便帶簽名打包,在module的Build Variants中有兩個Type,分別是debug和release,可以選擇任意一個類型進行打包,并且他們會利用各自配置的Key進行打包,執行 Run app或者Build->Build apk就會自動在module name/app/build/outputs/apk路徑下生成Apk文件。另一種打包方式是Build->Generate Signed APK填寫簽名信息生成Apk。
2.2、compileSdkVersion:設置編譯時用的Android版本
2.3、buildToolsVersion:設置編譯時使用的構建工具的版本,Android Studio3.0后去除此項配置
2.4、defaultConfig{}閉包:
compileSdkVersion 27//設置編譯時用的Android版本 defaultConfig { applicationId "com.billy.myapplication"//項目的包名 minSdkVersion 16//項目最低兼容的版本 targetSdkVersion 27//項目的目標版本 versionCode 1//版本號 versionName "1.0"//版本名稱 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"//表明要使用AndroidJUnitRunner進行單元測試 }
2.5、 buildTypes{}閉包:
這個閉包主要指定生成安裝文件的主要配置,一般包含兩個子閉包,一個是debug閉包,用于指定生成測試版安裝文件的配置,可以忽略不寫;另一個是release閉包,用于指定生成正式版安裝文件的配置。兩者能配置的參數相同,最大的區別默認屬性配置不一樣,兩種模式支持的屬性配置如下圖:
buildTypes配置.png
buildTypes {// 生產/測試環境配置 release {// 生產環境 buildConfigField("boolean", "LOG_DEBUG", "false")//配置Log日志 buildConfigField("String", "URL_PERFIX", "/"https://release.cn//"")// 配置URL前綴 minifyEnabled false//是否對代碼進行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規則文件 signingConfig signingConfigs.release//設置簽名信息 pseudoLocalesEnabled false//是否在APK中生成偽語言環境,幫助國際化的東西,一般使用的不多 zipAlignEnabled true//是否對APK包執行ZIP對齊優化,減小zip體積,增加運行效率 applicationIdSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 } debug {// 測試環境 buildConfigField("boolean", "LOG_DEBUG", "true")//配置Log日志 buildConfigField("String", "URL_PERFIX", "/"https://test.com//"")// 配置URL前綴 minifyEnabled false//是否對代碼進行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規則文件 signingConfig signingConfigs.debug//設置簽名信息 debuggable false//是否支持斷點調試 jniDebuggable false//是否可以調試NDK代碼 renderscriptDebuggable false//是否開啟渲染腳本就是一些c寫的渲染方法 zipAlignEnabled true//是否對APK包執行ZIP對齊優化,減小zip體積,增加運行效率 pseudoLocalesEnabled false//是否在APK中生成偽語言環境,幫助國際化的東西,一般使用的不多 applicationIdSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 } }
release{}閉包和debug{}閉包兩者能配置的參數相同,最大的區別默認屬性配置不一樣:
2.6、sourceSets{}閉包:配置目錄指向
sourceSets {//目錄指向配置 main { jniLibs.srcDirs = ['libs']//指定lib庫目錄 } }
配置 jniLibs.srcDirs = ['libs'],可以在Android studio的Android視圖下生成jniLibs文件夾,可以方便我們存放jar包和庫文件,其中Android視圖下的jniLibs和project視圖下的libs指向同一文件夾(app→libs),如下圖所示:
2.7、packagingOptions{}閉包:打包時的相關配置
當項目中依賴的第三方庫越來越多時,有可能會出現兩個依賴庫中存在同一個(名稱)文件。如果這樣,Gradle在打包時就會提示錯誤(警告)。那么就可以根據提示,然后使用以下方法將重復的文件剔除,比較常用的是通過exclude去除重復的文件,例如:
packagingOptions{ //pickFirsts做用是 當有重復文件時 打包會報錯 這樣配置會使用第一個匹配的文件打包進入apk // 表示當apk中有重復的META-INF目錄下有重復的LICENSE文件時 只用第一個 這樣打包就不會報錯 pickFirsts = ['META-INF/LICENSE'] //merges何必 當出現重復文件時 合并重復的文件 然后打包入apk //這個是有默認值得 merges = [] 這樣會把默默認值去掉 所以我們用下面這種方式 在默認值后添加 merge 'META-INF/LICENSE' //這個是在同時使用butterknife、dagger2做的一個處理。同理,遇到類似的問題,只要根據gradle的提示,做類似處理即可。 exclude 'META-INF/services/javax.annotation.processing.Processor' }
2.8、productFlavors{}閉包:多個渠道配置
這個配置是經常會使用到的,通常在適配多個渠道的時候,需要為特定的渠道做部分特殊的處理,比如設置不同的包名、應用名等。場景:當我們使用友盟統計時,通常需要設置一個渠道ID,那么我們就可以利用productFlavors來生成對應渠道信息的包,如:
android { productFlavors { wandoujia { //豌豆莢渠道包配置 manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] //manifestPlaceholders的使用在后續章節(AndroidManifest里的占位符)中介紹 } xiaomi { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] applicationId "com.wiky.gradle.xiaomi" //配置包名 } _360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"] } //... } }
當然也有更簡潔的方式:
android { productFlavors { wandoujia {} xiaomi {} _360 {} //... } productFlavors.all { //批量修改,類似一個循序遍歷 flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }}
配置完之后,在命令行窗口中(Terminal)中輸入gradlew assembleRelease(windows)即可開始打包,在Mac系統中對應指令應該是./gradlew assembleRelease。當然,如果想要debug版本的包,將指令中assembleRelease改為assembleDebug即可。最后生成的包還是在app/build/outputs/apk中,默認命名格式如app-wandoujia-release-unsigned.apk,在module的Build Variants中可以選擇相應的渠道。
注:Android Studio3.0需在主app的build.gradle里面的
defaultConfig {targetSdkVersion:***minSdkVersion :***versionCode:***versionName :***//版本名后面添加一句話,意思就是flavor dimension 它的維度就是該版本號,這樣維度就是都是統一的了flavorDimensions "versionCode"}
2.9、lintOptions{}閉包:代碼掃描分析
Lint 是Android Studio 提供的 代碼掃描分析工具,它可以幫助我們發現代碼結構/質量問題,同時提供一些解決方案,而且這個過程不需要我們手寫測試用例。
Lint 發現的每個問題都有描述信息和等級(和測試發現 bug 很相似),我們可以很方便地定位問題,同時按照嚴重程度進行解決。
//程序在編譯的時候會檢查lint,有任何錯誤提示會停止build,我們可以關閉這個開關 lintOptions { abortOnError false //即使報錯也不會停止打包 checkReleaseBuilds false //打包release版本的時候進行檢測 }
3、dependencies{}閉包:
該閉包定義了項目的依賴關系,一般項目都有三種依賴方式:本地依賴、庫依賴和遠程依賴。本地依賴可以對本地的jar包或目錄添加依賴關系,庫依賴可以對項目中的庫模塊添加依賴關系,遠程依賴可以對jcener庫上的開源項目添加依賴關系。從Android Studio3.0后compile引入庫不在使用,而是通過api和implementation,api完全等同于以前的compile,用api引入的庫整個項目都可以使用,用implementation引入的庫只有對應的Module能使用,其他Module不能使用,由于之前的項目統一用compile依賴,導致的情況就是模塊耦合性太高,不利于項目拆解,使用implementation之后雖然使用起來復雜了但是做到降低偶合興提高安全性。
dependencies {//項目的依賴關系 implementation fileTree(include: ['*.jar'], dir: 'libs')//本地jar包依賴 implementation 'com.android.support:appcompat-v7:27.1.1'//遠程依賴 implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12'//聲明測試用例庫 androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'}
Module完整的build.gradle配置如下:
// 聲明是Android程序,//com.android.application 表示這是一個應用程序模塊//com.android.library 標識這是一個庫模塊//而這區別:前者可以直接運行,后著是依附別的應用程序運行apply plugin: 'com.android.application'android { signingConfigs {// 自動化打包配置 release {// 線上環境 keyAlias 'test' keyPassword '123456' storeFile file('test.jks') storePassword '123456' } debug {// 開發環境 keyAlias 'test' keyPassword '123456' storeFile file('test.jks') storePassword '123456' } } compileSdkVersion 27//設置編譯時用的Android版本 defaultConfig { applicationId "com.billy.myapplication"//項目的包名 minSdkVersion 16//項目最低兼容的版本 targetSdkVersion 27//項目的目標版本 versionCode 1//版本號 versionName "1.0"//版本名稱 flavorDimensions "versionCode" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"//表明要使用AndroidJUnitRunner進行單元測試 } buildTypes {// 生產/測試環境配置 release {// 生產環境 buildConfigField("boolean", "LOG_DEBUG", "false")//配置Log日志 buildConfigField("String", "URL_PERFIX", "/"https://release.cn//"")// 配置URL前綴 minifyEnabled false//是否對代碼進行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規則文件 signingConfig signingConfigs.release//設置簽名信息 pseudoLocalesEnabled false//是否在APK中生成偽語言環境,幫助國際化的東西,一般使用的不多 zipAlignEnabled true//是否對APK包執行ZIP對齊優化,減小zip體積,增加運行效率 applicationIdSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 } debug {// 測試環境 buildConfigField("boolean", "LOG_DEBUG", "true")//配置Log日志 buildConfigField("String", "URL_PERFIX", "/"https://test.com//"")// 配置URL前綴 minifyEnabled false//是否對代碼進行混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的規則文件 signingConfig signingConfigs.debug//設置簽名信息 debuggable false//是否支持斷點調試 jniDebuggable false//是否可以調試NDK代碼 renderscriptDebuggable false//是否開啟渲染腳本就是一些c寫的渲染方法 zipAlignEnabled true//是否對APK包執行ZIP對齊優化,減小zip體積,增加運行效率 pseudoLocalesEnabled false//是否在APK中生成偽語言環境,幫助國際化的東西,一般使用的不多 applicationIdSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 versionNameSuffix 'test'//在applicationId 中添加了一個后綴,一般使用的不多 } } sourceSets {//目錄指向配置 main { jniLibs.srcDirs = ['libs']//指定lib庫目錄 } } packagingOptions{//打包時的相關配置 //pickFirsts做用是 當有重復文件時 打包會報錯 這樣配置會使用第一個匹配的文件打包進入apk // 表示當apk中有重復的META-INF目錄下有重復的LICENSE文件時 只用第一個 這樣打包就不會報錯 pickFirsts = ['META-INF/LICENSE'] //merges何必 當出現重復文件時 合并重復的文件 然后打包入apk //這個是有默認值得 merges = [] 這樣會把默默認值去掉 所以我們用下面這種方式 在默認值后添加 merge 'META-INF/LICENSE' //這個是在同時使用butterknife、dagger2做的一個處理。同理,遇到類似的問題,只要根據gradle的提示,做類似處理即可。 exclude 'META-INF/services/javax.annotation.processing.Processor' } productFlavors { wandoujia {} xiaomi {} _360 {} } productFlavors.all { //批量修改,類似一個循序遍歷 flavor -> flavor.manifestPlaceholders = [IFLYTEK_CHANNEL: name] } //程序在編譯的時候會檢查lint,有任何錯誤提示會停止build,我們可以關閉這個開關 lintOptions { abortOnError false //即使報錯也不會停止打包 checkReleaseBuilds false //打包release版本的時候進行檢測 }}dependencies { //項目的依賴關系 implementation fileTree(include: ['*.jar'], dir: 'libs') //本地jar包依賴 implementation 'com.android.support:appcompat-v7:27.1.1' //遠程依賴 implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' //聲明測試用例庫 androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答