* app| build.gradle
app| build.gradle
apply plugin:'com.android.application' //APK编译必须加载这个插件
android {
compileSdkVersion gradle.api
buildToolsVersion "22.0.1"
sourceSets{ //差不多的设置
main{
manifest.srcFile'AndroidManifest.xml'
//通过设置jni目录为空,我们可不使用apk插件的jni编译功能。为什么?因为据说
//APK插件的jni功能好像不是很好使....晕菜
jni.srcDirs = []
jniLibs.srcDir 'libs'
aidl.srcDirs=['src']
java.srcDirs=['src']
res.srcDirs=['res']
}
}//main结束
signingConfigs { //设置签名信息配置
debug { //如果我们在local.properties设置使用特殊的keystore,则使用它
//下面这些设置,无非是函数调用....请务必阅读API文档
if(project.gradle.debugKeystore !=null){
storeFilefile("file://${project.gradle.debugKeystore}")
storePassword"android"
keyAlias"androiddebugkey"
keyPassword"android"
}
}
}//signingConfigs结束
buildTypes {
debug {
signingConfigsigningConfigs.debug
jniDebuggable false
}
}//buildTypes结束
dependencies {
//compile:project函数可指定依赖multi-project中的某个子project
compile project(':CPosDeviceSdk')
compile fileTree(dir: 'libs', include:['*.jar'])
} //dependices结束
repositories{
flatDir {//flatDir:告诉gradle,编译中依赖的jar包存储在dirs指定的目录
name"minsheng-gradle-local-repository"
dirsgradle.LOCAL_JAR_OUT //LOCAL_JAR_OUT是我存放编译出来的jar包的位置
}
}//repositories结束
}//android结束
/*
创建一个Task,类型是Exec,这表明它会执行一个命令。我这里让他执行ndk的
ndk-build命令,用于编译ndk。关于Exec类型的Task,请自行脑补Gradle的API
*/
//注意此处创建task的方法,是直接{}喔,那么它后面的tasks.withType(JavaCompile)
//设置的依赖关系,还有意义吗?Think!如果你能想明白,gradle掌握也就差不多了
task buildNative(type:Exec, description: 'CompileJNI source via NDK') {
if(project.gradle.ndkDir == null) //看看有没有指定ndk.dir路径
println "CANNOT BuildNDK"
else{
commandLine"/${project.gradle.ndkDir}/ndk-build",
'-C',file('jni').absolutePath,
'-j',Runtime.runtime.availableProcessors(),
'all', 'NDK_DEBUG=0'
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOnbuildNative
}
......
//对于APK,除了拷贝APK文件到指定目录外,我还特意为它们加上了自动版本命名的功能
tasks.getByName("assemble"){
it.doLast{
println "$project.name: Afterassemble, jar libs are copied tolocal repository"
project.ext.versionName =android.defaultConfig.versionName
println "\t versionName =$versionName"
copyOutput(false)
}
}
----------------------------------------------------
app2 | build.gradle
apply plugin:'com.android.application' //加载APP插件
//加载utils.gradle
applyfrom:rootProject.getRootDir().getAbsolutePath() +"/utils.gradle"
//buildscript设置android app插件的位置
buildscript {
repositories { jcenter() }
dependencies { classpath'com.android.tools.build:gradle:1.2.3' }
}
//androidScriptBlock
android {
compileSdkVersion gradle.api
buildToolsVersion "22.0.1"
sourceSets{//源码设置SB
main{
manifest.srcFile'AndroidManifest.xml'
jni.srcDirs = []
jniLibs.srcDir 'libs'
aidl.srcDirs=['src']
java.srcDirs=['src']
res.srcDirs=['res']
assets.srcDirs = ['assets'] //多了一个assets目录
}
}
signingConfigs {//签名设置
debug { //debug对应的SB。注意
if(project.gradle.debugKeystore !=null){
storeFilefile("file://${project.gradle.debugKeystore}")
storePassword"android"
keyAlias"androiddebugkey"
keyPassword"android"
}
}
}
/*
最关键的内容来了: buildTypesScriptBlock.
buildTypes和上面的signingConfigs,当我们在build.gradle中通过{}配置它的时候,
其背后的所代表的对象是NamedDomainObjectContainer<BuildType>和
NamedDomainObjectContainer<SigningConfig>
注意,NamedDomainObjectContainer<BuildType/或者SigningConfig>是一种容器,
容器的元素是BuildType或者SigningConfig。我们在debug{}要填充BuildType或者
SigningConfig所包的元素,比如storePassword就是SigningConfig类的成员。而proguardFile等
是BuildType的成员。
那么,为什么要使用NamedDomainObjectContainer这种数据结构呢?因为往这种容器里
添加元素可以采用这样的方法: 比如signingConfig为例
signingConfig{//这是一个NamedDomainObjectContainer<SigningConfig>
test1{//新建一个名为test1的SigningConfig元素,然后添加到容器里
//在这个花括号中设置SigningConfig的成员变量的值
}
test2{//新建一个名为test2的SigningConfig元素,然后添加到容器里
//在这个花括号中设置SigningConfig的成员变量的值
}
}
在buildTypes中,Android默认为这几个NamedDomainObjectContainer添加了
debug和release对应的对象。如果我们再添加别的名字的东西,那么gradleassemble的时候
也会编译这个名字的apk出来。比如,我添加一个名为test的buildTypes,那么gradle assemble
就会编译一个xxx-test-yy.apk。在此,test就好像debug、release一样。
*/
buildTypes{
debug{ //修改debug的signingConfig为signingConfig.debug配置
signingConfigsigningConfigs.debug
}
demo{ //demo版需要混淆
proguardFile'proguard-project.txt'
signingConfigsigningConfigs.debug
}
//release版没有设置,所以默认没有签名,没有混淆
}
......//其他和posdevice 类似的处理。来看如何动态生成runtime_config文件
def runtime_config_file = 'assets/runtime_config'
/*
我们在gradle解析完整个任务之后,找到对应的Task,然后在里边添加一个doFirstAction
这样能确保编译开始的时候,我们就把runtime_config文件准备好了。
注意,必须在afterEvaluate里边才能做,否则gradle没有建立完任务有向图,你是找不到
什么preDebugBuild之类的任务的
*/
project.afterEvaluate{
//找到preDebugBuild任务,然后添加一个Action
tasks.getByName("preDebugBuild"){
it.doFirst{
println "generate debugconfiguration for ${project.name}"
def configFile = newFile(runtime_config_file)
configFile.withOutputStream{os->
os << I amDebug\n' //往配置文件里写 I am Debug
}
}
}
//找到preReleaseBuild任务
tasks.getByName("preReleaseBuild"){
it.doFirst{
println "generate releaseconfiguration for ${project.name}"
def configFile = newFile(runtime_config_file)
configFile.withOutputStream{os->
os << I amrelease\n'
}
}
}
//找到preDemoBuild。这个任务明显是因为我们在buildType里添加了一个demo的元素
//所以Android APP插件自动为我们生成的
tasks.getByName("preDemoBuild"){
it.doFirst{
println "generateofflinedemo configuration for${project.name}"
def configFile = newFile(runtime_config_file)
configFile.withOutputStream{os->
os << I amDemo\n'
}
}
}
}
}
.....//copyOutput
*
> gradle tasks --all查看所有任务
参考http://www.cnblogs.com/wxishang1991/p/5532006.html 此网页没事多看看。
gradle 原文 https://docs.gradle.org/current/dsl/# 里面讲了settings.gradle、build.gradle的各种元素、方法、写法