Gradle自動化編譯Android專案總結
相對於ant和maven,java工程用gradle進行自動化編譯真是簡單太多了。最近在用gradle對公司的專案進行自動化打包,發現gradle的教程還是很少,網上的資源有價值的更是很少,基本都是一篇文章轉來轉去。希望自己遇到的問題可以為後來學習的人提供些思路。
1.gradle打包會對工程res目錄下的資源做校驗,如果有些資源不合法會編譯錯誤。這是我遇到的一個.9圖片的問題,如下:
這個問題很好解決,重新做圖。其實這也是好事,gradle幫我們做了檢查,可以發現一些潛在危險。
2.eclipse中更新最新的adt(版本22)可以匯出一個工程的build.gradle檔案,但是大部分情況下不能直接使用。
匯出的方法是:選擇工程-->export-->android-->Generate Gradle build files.
主要會出問題的地方是工程依賴者塊,我匯出的原始工程中是這樣的:
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':D::開發環境:工作workspace程式碼:androidKu')
}
其中中文路徑肯定是不可行的,這個需要更改;另外如果你工程import的jar包不一定實在libs目錄下,比如我的是在lib目錄下(libs/目錄放的是so庫)。
3.編碼問題。gradle預設編碼會用你電腦編碼,比如你是中文版的windows,那麼採用的編碼是gbk的。這種方式可以設定編碼:
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
4.so庫的編譯,很多專案為了安全都使用了一些so庫。對於so庫的編譯參考了這個部落格:http://blog.csdn.net/ilittleone/article/details/9222425。更具體的結果可以去stackoverflow搜尋。
5.庫專案的編譯。庫專案的編譯也稍微糾結了一下,不過參考一些資料很快就搞定了。
我是採用這種方式實現,假如主專案和庫專案都是在D:\workspace目錄下,專案名稱分別是main和lib。那麼需要在D:\workspace目錄下新建build.gradle和settings.gradle。另外主專案和庫專案目錄下也分別需要build.gradle檔案。完整程式碼如下所示。
(1)D:\workspace目錄下build.gradle檔案
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
allprojects {
repositories {
mavenCentral()
}
}
(2)D:\workspace目錄下settings.gradle檔案include ':Main'
include ':Lib'
(3)D:\workspace\Main目錄下build.gradle檔案buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
}
apply plugin: 'android'
dependencies {
compile fileTree(dir: 'lib', include: '*.jar')
compile project(':Lib')
}
android {
compileSdkVersion 10
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 8
targetSdkVersion 17
}
signingConfigs {
myConfig{
storeFile file("xxx.keystore")
storePassword "xxx"
keyAlias "xxx"
keyPassword "xxx"
}
}
buildTypes{
release {
signingConfig signingConfigs.myConfig
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest.setRoot('tests')
}
task copyNativeLibs(type: Copy) {
from fileTree(dir: 'libs', include: '**/*.so' ) into 'build/libs'
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniDir file('build/libs')
}
}
需要注意的是:編碼,so庫的引入根據需要選擇;這個是將目標籤名檔案放在主專案目錄下的做法,如果在別的路徑下,請自行設定。
(4)D:\workspace\Lib目錄下build.gradle檔案
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android-library'
android {
compileSdkVersion 7
buildToolsVersion "17.0.0"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
http://blog.csdn.net/ilittleone/article/details/9222425