原文
http://tools.android.com/tech-docs/new-build-system/user-guide
構建文件 build.gradle
Basic Project
1.最簡單的配置:
apply plugin: 'java'
使用自帶的java插件,用gradle編譯java
2.最常見的android配置:
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.11.1' } } apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.0" }
repositories 使用maven central repository
dependencies 依賴android plugin
apply plugin 使用android plugin
android {} 配置android plugin 參數,這個事dsl的入口
提示:需要 local.properties 設置代表android sdk 路徑的sdk.dir屬性,或者使用 ANDROID_HOME 環境變量
項目結構
1.默認目錄結構:
- src/main/ 放源碼
- src/androidTest/ 放測試代碼
2.java和android plugin 共有源碼目錄:
- java/
- resources/
3.android plugin 源碼目錄
- AndroidManifest.xml
- res/
- assets/
- aidl/
- rs/
- jni/
配置路徑
修改java plugin默認路徑的兩種方式
sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}
sourceSets { main.java.srcDirs = ['src/java'] main.resources.srcDirs = ['src/resources'] }
將android plugin 的路徑修改為舊的形式
android { sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest.setRoot('tests') } }
構建任務
常見任務
- assemble 合並輸出
- check 運行所有檢查
- build 運行 assemble 和 check
- clean 清空輸出
這幾個任務本身不做什么事,具體的事情要往里面插,類似策略模式
java任務
- assemble
- jar
This task creates the output.
- jar
- check
- test
This task runs the tests.
- test
jar 直接或者間接依賴於其他任務,比如classes 編譯java代碼
具體看http://gradle.org/docs/current/userguide/java_plugin.html
android任務
- assemble
The task to assemble the output(s) of the project - check
The task to run all the checks. - connectedCheck
Runs checks that requires a connected device or emulator. they will run on all connected devices in parallel. - deviceCheck
Runs checks using APIs to connect to remote devices. This is used on CI servers. - build
This task does both assemble and check - clean
This task cleans the output of the project
多了connectedCheck和deviceCheck檢查設備連接
tip:gradle支持任務名簡寫:比如用gradle aR 代替gradle assembleRelease
自定義構建過程
Manifest entries
android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { versionCode 12 versionName "2.0" minSdkVersion 16 targetSdkVersion 16 } }
默認值
Property Name | Default value in DSL object | Default value |
versionCode | -1 | value from manifest if present |
versionName | null | value from manifest if present |
minSdkVersion | -1 | value from manifest if present |
targetSdkVersion | -1 | value from manifest if present |
applicationId | null | value from manifest if present |
testApplicationId | null | applicationId + “.test” |
testInstrumentationRunner | null | android.test.InstrumentationTestRunner |
signingConfig | null | null |
proguardFile | N/A (set only) | N/A (set only) |
proguardFiles | N/A (set only) | N/A (set only) |
依賴管理
依賴於本地包
dependencies {
compile files('libs/foo.jar')
}
android {
...
}
compile的文件都會加入classpath當中,並打包到apk
可選的compile配置
- compile: main application
- androidTestCompile: test application
- debugCompile: debug Build Type
- releaseCompile: release Build Type.
依賴於遠程包
repositories { mavenCentral() } dependencies { compile 'com.google.guava:guava:11.0.2' } android { ... }
先把repository加進來,然后在dependencies以maven或者ivy的形式聲明artifacts,就可以了
配置其他maven庫
repositories { maven { url "http://repo.mycompany.com/maven2" } }
http://gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
多項目構建
示例:
app,lib1,lib2 都是gradle項目
gradle這么引用他們 :app :libraries:lib1 :libraries:lib2
每個項目都有build.gradle文件
根目錄有settings.gradle
結構如下:
為了表示當前目錄是一個gradle目錄,需要有settings.gradle文件,內容如下:
include ':app', ':libraries:lib1', ':libraries:lib2'
app依賴其他項目,依賴關系這么寫
dependencies {
compile project(':libraries:lib1')
}
library項目
上面 :libraries:lib1 :libraries:lib2可以是java項目,:app使用它們的jar包,
但是 如果這些庫要訪問android api 或者其他android資源,它們不能是普通的java項目,必須是Android Library Projects
創建Android Library Projects
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.5.6' } } apply plugin: 'android-library' android { compileSdkVersion 15 }
使用android-libraray plugin 其他跟普通android項目類似
輸出.aar文件,包含編譯代碼(.jar/.so)和資源文件(manifest, res, assets)
引用Library
dependencies {
compile project(':libraries:lib1')
compile project(':libraries:lib2')
}
發布Library
android { defaultPublishConfig "debug" }
默認只發布release版本,可以通過上面代碼修改
如果有變體(后面將提到),要加上變體名
android { defaultPublishConfig "flavor1Debug" }
發布所有版本
android {
publishNonDefault true
}
引用其他發布的artifact
dependencies { flavor1Compile project(path: ':lib1', configuration: 'flavor1Release') flavor2Compile project(path: ':lib1', configuration: 'flavor2Release') }
構建變體
變體:類似普通版和高級版
android {
....
productFlavors {
flavor1 {
...
}
flavor2 {
...
}
}
}
Build Type + Product Flavor = Build Variant
例如
- Flavor1 - debug
- Flavor1 - release
- Flavor2 - debug
- Flavor2 - release