Android 中
build.gradle
文件是兩個
app/build.gradle
project/build.gradle
app/build.gradle
app/build.gradle
* 上圖① ② ③ ④ ⑤分別為:項目類型(應用或者是一個libary)风范、Android編譯版本、manifest上的基本配置届腐、創(chuàng)建類型嵌莉、外部依賴
詳細介紹:
apply plugin: 'com.android.application'// 聲明是Android程序
android {
//版本配置
compileSdkVersion 26//是你SDK的版本號蚁孔。
buildToolsVersion "26.0.2"http://是你構建工具的版本袱讹,其中包括了打包工具aapt矩屁、dx等等
defaultConfig {
//應用的包名在安卓設備和商店中是作為應用的唯一標識纪隙,所以遍膜,一旦發(fā)布了應用程序碗硬,就不應該再修改,否則將被視為完全不同的應用
applicationId "com.suchengkeji.andeoid.gradlerdemo"
//SDK配置
minSdkVersion 21//app運行所需的最低sdk版本.低于minSdkVersion的手機將無法安裝
targetSdkVersion 26 //應用的兼容模式
versionCode 1//整數值瓢颅,代表應用程序代碼的相對版本恩尾,也就是版本更新過多少次。
versionName "1.0"http://字符串值挽懦,代表應用程序的版本信息翰意,需要顯示給用戶。
// dex突破65535的限制
multiDexEnabled true//下面有介紹
}
buildTypes {
release {
// 是否進行混淆(設置是否使用優(yōu)化打包)
minifyEnabled false
//設置為true后信柿,生成的APK會去掉未使用的資源冀偶,減少APK的體積
shrinkResources true
//是否啟動zipAlign優(yōu)化
zipAlignEnabled false
// 混淆文件的位置(設置proguard文件(用于混淆代碼))
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// 編譯libs目錄下的所有jar包
compile fileTree(dir: 'libs', include: ['*.jar'])
//編譯所添加的外部依賴庫
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
// 編譯libray模塊
compile project(':libray')
// 編譯extras目錄下的librayTwo模塊(如果模塊在某(extras)目錄下)
compile project(':extras:librayTwo')
}
要點:
- Android程序聲明處:
apply plugin: 'com.android.application'
是最新的寫法,以前的寫法是apply plugin: 'android'
-
compileSdkVersion
:是你SDK的版本號渔嚷。告訴Gradle用哪個AndroidSDK版本編譯你的應用进鸠。使用任何新添加的 API 就需要使用對應版本的 Android SDK。- 修改 compileSdkVersio不會改變運行時的行為形病。當你修改了compileSdkVersion的時候客年,可能會出現(xiàn)新的編譯警告、編譯錯誤漠吻,但新的compileSdkVersion不會被包含到APK 中:它純粹只是在編譯的時候使用量瓜。
-
buildToolsVersion
:是你構建工具的版本,其中包括了打包工具aapt侥猩、dx等等榔至。這個需要你本地安裝該版本才行,很多人導入新的第三方庫欺劳,失敗的原因之一是buildversion的版本不對,這個可以手動更改成你本地已有的版本或者打開SDKManager去下載對應版本 -
minSdkVersion
:應用可以運行的最低要求,低于minSdkVersion的手機將無法安裝铅鲤。在開發(fā)時minSdkVersion也起到一個重要角色:lint 默認會在項目中運行划提,它在你使用了高于 minSdkVersion的API 時會警告你,幫你避免調用不存在的 API 的運行時問題(比如 minSdkVersion9但你使用了 sdkVersion 10 才有的API就會警告 )邢享。- 如果只在較高版本的系統(tǒng)上才使用某些API鹏往,通常使用運行時檢查系統(tǒng)版本的方式解決。 比如這樣
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //...... } if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT&&Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //....... }
-
applicationId
:應用的包名在安卓設備和商店中是作為應用的唯一標識骇塘,所以伊履,一旦發(fā)布了應用程序韩容,就不應該再修改applicationId,否則將被視為完全不同的應用- application ID以前直接綁定到包名稱; 因此一些Android API在其方法名稱和參數名稱中使用術語“包名稱”唐瀑,但這實際上是application ID群凶。 例如,Context.getPackageName()方法返回application ID哄辣。 沒有必要在app代碼之外分享代碼的真實包名请梢。
- 如果您正在使用WebView,請考慮在application ID中使用您的程序包名稱作為前綴; 否則您可能會遇到問題
applicationIdSuffix breaks some WebView use cases in apps
的問題力穗。
*targetSdkVersion
:是Android提供向前兼容的主要依據毅弧,在應用的targetSdkVersion沒有更新之前系統(tǒng)不會應用最新的行為變化。 - 隨著 Android 系統(tǒng)的升級当窗,某個系統(tǒng)的API或者模塊的行為可能會發(fā)生改變够坐,但是為了保證老 APK 的行為還是和以前兼容。只要APK的targetSdkVersion不變崖面,即使這個APK安裝在新Android系統(tǒng)上咆霜,其行為還是保持老的系統(tǒng)上的行為,這樣就保證了系統(tǒng)對老應用的前向兼容性嘶朱。
*versionCode
:整數值蛾坯,代表應用程序代碼的相對版本,也就是版本更新過多少次 - 整數值有利于其它程序比較疏遏,檢查是升級還是降級脉课。你可以把這個值設定為任何想設的值,但是财异,你必須保證后續(xù)更新版的值要比這個大倘零。系統(tǒng)不會強制要求這一行為,但是隨著版本更新值也增加是正常的行為戳寸。
- 一般來說呈驶,你發(fā)布的第一版程序的versionCode設定為1,然后每次發(fā)布都會相應增加袖瞻,不管發(fā)布的內容是較大還是較小的聋迎。這意味著android:versionCode不像應用程序的發(fā)布版本(android:versionName)那樣顯示給用戶霉晕。應用程序和發(fā)布的服務不應該顯示這個版本值給用戶。
-
versionName
:字符串值拄轻,代表應用程序的版本信息恨搓,需要顯示給用戶奶卓。- 與android:versionCode一樣夺姑,系統(tǒng)不會為了任何內部的目的使用這個值盏浙,除了顯示給用戶外荔茬。發(fā)布的服務也需要提取這個值來顯示給用戶。
buildTypes
:構建類型丐黄,一般可以分為debug(主要用于開發(fā)階段)和release(生產發(fā)布階段)
buildTypes {
release {
//是否進行混淆(設置是否使用優(yōu)化打包)
minifyEnabled </strong> false
//設置為true后孔飒,生成的APK會去掉未使用的資源,減少APK的體積
shrinkResources true
//是否啟動zipAlign優(yōu)化
zipAlignEnabled false
// 混淆文件的位置(設置proguard文件(用于混淆代碼))
proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'</strong>
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
-
zipAlignEnabled
:AndroidSDK中包含一個“zipalign”的工具桂对,它能夠對打包的應用程序進行優(yōu)化蕉斜。在你的應用程序上運行zipalign缀棍,使得在運行時Android與應用程序間的交互更加有效率睦柴。因此坦敌,這種方式能夠讓應用程序和整個系統(tǒng)運行得更快狱窘。
配置多渠道打包(風格定制 )
android{
//配置多渠道打包(項目風格)
productFlavors {
huawei {
applicationId "com.suchengkeji.andeoid.gradlerdemo.huawei"
}
wandoujia {
applicationId "com.suchengkeji.andeoid.gradlerdemo.wandoujia"
}
}
}
配置打包簽名設置
android{
signingConfigs {//簽名的配置
debug {
storeFile file('H:\\configTest.jks')//簽名文件路徑
storePassword "123456"http://簽名密鑰密碼
keyAlias "configTest"http://.jks文件別名
keyPassword "123456" //簽名公鑰密碼
}
release {
storeFile file('H:\\configTest.jks')//簽名文件路徑
storePassword "123456"
keyAlias "configTest"
keyPassword "123456" //簽名密碼
}
}
}
- 配置完成打包簽名設置后再
buildTypes{}
中的release{}
中天機打包命令行(可選設置)設置后可以通過命令打包-
gradlew assembleRelease
:這個是打包所有渠道(風格)release版本 -
gradlew assembleBaiduRelease
:只要打某個渠道的
打包后的apk文件在app–>build–>outputs—>apk中
使用gradlew時可能出現(xiàn)沒有找到該命令,需要chmod 755 gradlew
-
打包命令行
project/build.gradle(根目錄下的build.gradle)
- 用于添加子工程或模塊共用的配置項。
-
buildscript
:配置此項目的構建腳本類路徑淹禾。 -
repositories
:配置該項目的存儲庫铃岔。- 支持java 依賴庫管理(maven/ivy),用于項目的依賴汪疮。
- 如果需要的話,從https://jcenter.bintray.com/下載code reposities智嚷。
-
dependencies
:配置此項目的依賴關系。- 依賴包的定義盏道。支持maven/ivy,遠程载碌,本地庫,也支持單文件
- 定義classpath恐仑,gradle會從“repositories”中下載對應版本的Gradle泉坐。如果使用gradle wrapper的話,感覺這個配置會被忽略裳仆。Wrapper會自己去下載所使用的gradle版本。
- **不要把你的應用程序依賴這里歧斟;他們屬于個別模塊build.gradle文件
-
allprojects
:該配置會被應用到所有的子工程静袖。
// 運行gradle clean時坠陈,執(zhí)行此處定義的task。
// 該任務繼承自Delete仇矾,刪除根目錄中的build目錄贮匕。
// 相當于執(zhí)行Delete.delete(rootProject.buildDir)。
// gradle使用groovy語言刻盐,調用method時可以不用加()掏膏。
task clean(type: Delete) {
delete rootProject.buildDir
}
提下根目錄下還有一個
setting.gradle
:
- 作用就是導入子工程。它支持導入多個子工程敦锌,使整個工程支持multi-project的編譯馒疹。
- 調用include函數,將子工程app(目錄名為app)導入進來供屉。
include ':app'
(有多個時用逗號分開)
dex突破65535的限制
-
首先是在defaultConfig節(jié)點使能多DEX功能
dex.png - 然后就是在
dependencies{}
中引入multidex庫文件
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
- 最后就是你的AppApplication繼承一下MultiDexApplication即可行冰。