相对于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://www.cnblogs.com/youxilua/archive/2013/05/20/3087935.html
http://blog.csdn.net/ilittleone/article/details/9222425