解读xxxx gradle配置

xxxx主工程的build.gradle
import org.apache.tools.ant.filters.ReplaceTokens

//这里声明的是gradle脚本自身需要的仓储和依赖
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.1.+'
}
}

project.ext {
archivesBaseName = "xxxxx" 这一段没有地方使用,应该是冗余的代码
}

apply plugin: 'android' 类型是android

Project p = project(':xxxxxxx-android-library') 定义lib工程

//这里声明的是我们的xxxx项目需要的仓储
repositories {
jcenter()
mavenCentral()
flatDir {//本地仓库
dirs p.projectDir.absolutePath + '/libs' //这里指定了lib项目中的libs目录
}
}

apply from: './flavor.gradle' //渠道定义

partners.each { key, value -> //循环创建task
tasks.create(name: "copyFlavor$key", type: Copy) {//该任务是copy文件,任务名copyFlavor+渠道名
from "partners/AndroidManifest.xml"
into "build/partners/$key"
filter(ReplaceTokens, tokens: [partnerId: value.id, partnerName: value.name])//将AndroidManifest.xml里面的变量partnerId、partnerName替换掉
}
}

//任务prepareFlavor会在执行前先执行copyFlavor开头的任务(即上面创建出的N个任务)
task prepareFlavor(dependsOn: tasks.matching { Task task -> task.name.startsWith("copyFlavor") })
preBuild.dependsOn prepareFlavor//preBuild任务执行前先执行prepareFlavor

//android构建的所有配置,与apply plugin: 'android' 对应
android {
compileSdkVersion Integer.valueOf(compile_sdk_version)//编译版本。compile_sdk_version定义在gradle.properties里面
buildToolsVersion build_tool_version//build工具版本。build_tool_version定义在gradle.properties里面

   //默认配置,会同时应用到debug和release版本上,这个会覆盖manifest里的minsdk和targetsdk defaultConfig {
        minSdkVersion 14  最低版本14,就是4.0
targetSdkVersion 21
}

//自定义签名配置
signingConfigs {
xxxxConfig {
storeFile file("key/xxxx.keystore")
storePassword "xxxx520"
keyAlias "xxxx"
keyPassword "xxxx520"
}
}

   //构建类型
buildTypes {
//Debug打开,使用测试环境接口
debug {
signingConfig signingConfigs.xxxxConfig //使用之前定义的签名配置进行签名
}
//Debut打开,monkey打开,使用生产环节接口
monkey {
signingConfig signingConfigs.xxxxConfig
}
//Debug打开,使用生产环境接口
beta.initWith(buildTypes.debug) //debug类型的一个副本
beta {
signingConfig signingConfigs.xxxxConfig //冗余代码,debug中已经配置过了
}
betaProguard {
minifyEnabled true //开启混淆
proguardFile 'proguard.cfg' //混淆文件
signingConfig signingConfigs.xxxxConfig
}
//Debug关闭,使用生产环境接口
release {
minifyEnabled true
proguardFile 'proguard.cfg'
signingConfig signingConfigs.xxxxConfig
}
}

dependencies {
compile fileTree(dir: 'libs', includes: ['*.jar']) //把libs目录下的所有jar文件一起进行打包
compile project(':xxxxxx-android-library') //xxxxx项目一起打包
betaCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' //beta的时候 这个一起进行打包
}

lintOptions {
abortOnError false //lint忽略error
}

packagingOptions { //打包配置,exclude 一下文件统统不打入最终包里
exclude 'libs/jackson-core-asl-1.9.13.jar'
exclude 'libs/jackson-mapper-asl-1.9.13.jar'
exclude 'META-INF/ASL2.0'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LGPL2.1'
}


task copyNativeLibs(type: Copy) {//任务,将.so文件全部copy到build/libs目录下
from fileTree(dir: 'libs', include: '**/*.so')
into 'build/libs'

from fileTree(dir: '../xxxxxxx-library/libs', include: '**/*.so')
into 'build/libs'
}

   //影响所有使用dex的任务
dexOptions {
preDexLibraries = false //是否pre-dex预编译库。这可以提高增量构建,但清洁构建可能会慢一些
javaMaxHeapSize "2g" //dex的最大堆大小
}

  //在dex开头的任务之后做的事情,主要就是dex、dex1、dex2......还有个就是让list.txt中的内容保证出现在main-dex中,就是第一个dex,这个文件中包括了我们应用启动所需的所有的内容,不然如果打包到第二个dex1里面,就会启动失败
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')// 这个任务其实就是proguard之后的那一步生成dex.class
}.each { dx -> //这里循环是因为多渠道的时候就会针对不同的渠道有多个dexXXXXXXX任务
if (dx.additionalParameters == null) {
dx.additionalParameters = ['--multi-dex']
} else {
dx.additionalParameters += '--multi-dex'
}
dx.additionalParameters += '--main-dex-list=list.txt'
}
}
  
   //javaCompile之前执行copyNativeLibs
    tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyNativeLibs }
   //clean之前执行cleanCopyNativeLibs
    clean.dependsOn 'cleanCopyNativeLibs'

  // 指定jni目录是build/libs,我觉得可以在sourceSets-main里面设置jniLibs
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniFolders = new HashSet<File>()
// pkgTask.jniFolders.add(new File(projectDir, 'libs'))
pkgTask.jniFolders.add(new File(projectDir, 'build/libs'))
}

  /*官方是这样给的例子
   productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'some-other-rules.txt'
        }
    }*/
productFlavors {
partners.each { key, value ->
"$key" {}
}
}
  
   //与buildType对应,映射到对应的目录下,使用不同的config资源文件
sourceSets.debug.setRoot('types/debug')
sourceSets.monkey.setRoot('types/monkey')
sourceSets.beta.setRoot('types/beta')
sourceSets.betaProguard.setRoot('types/beta')
sourceSets.release.setRoot('types/release')

   //映射源码
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets'] //这个一半gradle工程默认没有,如果只是添加一个这个目录放些资源,是访问不到的,必须设置映射链接起来
}

instrumentTest.setRoot('tests')

     /*设置了manifest里面的
           android:versionCode="75"
android:versionName="7.0.9"
       所以manifest里面的可以删除了
     */
defaultConfig {
versionCode Integer.valueOf(version_code)
versionName version_name
}

     //重定义manifest和res
partners.each { key, value ->
"$key" {
manifest.srcFile "build/partners/$key/AndroidManifest.xml"
if (value.first) {//首发
res.srcDirs = ["partners/$key/res"]
}
}
}
}

}


task archive << { //给任务archive设置action
FileTree tree = fileTree(dir: 'build/outputs/apk')
tree.include '*-release.apk'
tree.each { File file -> //在build/outputs/apk目录下找到-release.apk的文件
        def flavor = file.name.split("-")[1] // 会有个文件 xxxx-xxx-release.apk,去除xxxx flavor
def pvalue = 0
partners.each { key, value ->
if (key == flavor) { //在partners里根据key匹配找到pvalue
pvalue = value.id
}
}
copy { //复制打包出的原始apk,改名到build/archive目录下
from file
into "build/archive"
rename { "xxxx-$flavor-p$pvalue-$version_name-release.apk" }
}
}
}


gradle.properties
//主工程项目的相关配置在build.gradle里可以直接引用
#编译的build tool版本
build_tool_version=22.0.1
compile_sdk_version=21

#应用的版本信息
#version_code必须是整数,每次新版本需增加这个值
version_code=74
#version_name是字符串,用于描述版本
version_name=7.0.8

#设置打包的默认渠道,xxxxx表示是从xxxxxx站点直接下载
# all - 表示所有渠道的包一起打包
partner=xxxxxx

#通过传参数,打包一个指定p值的apk
#p值,数字
p=none
#渠道英文字符串
pflavor=none
#渠道中文字符串
pname=none


下面看一下多渠道定义文件

/**
* 定义默认的全部渠道,首发的需要加上first true,不需要首发的不加
* 这里三星比较特殊,因为他的一些特殊配置常量要使用到,和首发无关,所以一直true
*/
def defaultPartners = [ 
"xxxx": [id: "14584", name: "xxxxxxxx"],
.
.
.
.

]

/**
* 根据参数不同打包不同渠道的apk
*/
project.ext {  //额外处理,参数,该部分在执行所有任务之前应该会跑完。
if (p != "none" && pflavor != "none" && pname != "none") {  //p 、pflavor、pname 定义在上面的gradle.properties中,都是none,如果用命令执行的时候带了这些参数,则会经过这部分判断

println "Use specific p=$p, pflavor=$pflavor and pname=$pname"  //输出参数
partners = ["$pflavor": [id: p, name: pname]] //保存到partners,结构就是def defaultPartners里每条的结构
defaultPartners.each { key, value ->  //从所有定义的渠道数据里找到输入参数对应的渠道信息
if (value.id == p) {
partners = ["$key": value] //
println "P value duplicate. Use already defined partner: $key"
}
}
} else if (defaultPartners.get(partner) != null) {  //参数输入了partner
println "Use already defined partner: $partner"
partners = ["$partner": defaultPartners.get(partner)]
} else if (partner == "all") { //全部所有渠道包
partners = defaultPartners
} else {  //默认xxxx渠道包
println "Use default xxxx partner"
partners = ["xxxx": defaultPartners.xxxx]
}
}

task partners << {//给任务partners 设置action 就是打印输出partners里所有的渠道信息
partners.each { key, value ->
println "$key:$value.id,$value.name"
}
}

 

 



现在分析一下任务执行顺序:

:xxxxxxx:cleanCopyNativeLibs  //对应了主工程的 clean.dependsOn 'cleanCopyNativeLibs'

:xxxxxxx:clean  //gradle的第一步
:xxxxxxx-library:clean //lib库clean
:xxxxxxx:copyNativeLibs // copyNativeLib,对应主工程的 tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyNativeLibs } 

:xxxxxxx:copyFlavor360    //对应了 task prepareFlavor(dependsOn: tasks.matching { Task task -> task.name.startsWith("copyFlavor") }) 

:xxxxxxx:copyFlavor360anquanweishi
:xxxxxxx:copyFlavor360wifi
:xxxxxxx:copyFlavor360wuxiandaohangmingzhan2
:xxxxxxx:copyFlavor360zhuomian
:xxxxxxx:copyFlavor365rili
:xxxxxxx:copyFlavor91
:xxxxxxx:copyFlavor91zhuomian
:xxxxxxx:copyFlavorVIVO
:xxxxxxx:copyFlavoraiqiyi
:xxxxxxx:copyFlavoralicloud
:xxxxxxx:copyFlavoranquandashi
:xxxxxxx:copyFlavoranzhi
:xxxxxxx:copyFlavorbaidu
:xxxxxxx:copyFlavorbaidusem

.

.

.

.

.

:xxxxxxx:prepareFlavor   // task prepareFlavor 

.

//中间会重复执行N次这个操作

:xxxxx:check360zhuomianReleaseManifest
:xxxxx:prepare360zhuomianReleaseDependencies
:xxxxx:compile360zhuomianReleaseAidl
:xxxxx:compile360zhuomianReleaseRenderscript
:xxxxx:generate360zhuomianReleaseBuildConfig
:xxxxx:generate360zhuomianReleaseAssets UP-TO-DATE
:xxxxx:merge360zhuomianReleaseAssets
:xxxxx:generate360zhuomianReleaseResValues
:xxxxx:generate360zhuomianReleaseResources
:xxxxx:merge360zhuomianReleaseResources
:xxxxx:process360zhuomianReleaseManifest
:xxxxx:process360zhuomianReleaseResources
:xxxxx:generate360zhuomianReleaseSources
:xxxxx:compile360zhuomianReleaseJava
:xxxxx:lintVital360zhuomianRelease
:xxxxx:compile360zhuomianReleaseNdk UP-TO-DATE
:xxxxx:proguard360zhuomianRelease
:xxxxx:dex360zhuomianRelease
:xxxxx:process360zhuomianReleaseJavaRes UP-TO-DATE
:xxxxx:package360zhuomianRelease
:xxxxx:zipalign360zhuomianRelease
:xxxxx:assemble360zhuomianRelease

.

.

 

 

再看一个打某个具体包的步骤

[workspace] $ /opt/xxxx/gradle-2.3/bin/gradle clean assembleRelease archive -Pcompile_sdk_version=21 -Pbuild_tool_version=22.0.1 -Ppartner=baidu
Use already defined partner: baidu
:xxxxxxxxxx-android:cleanCopyNativeLibs
:xxxxxxxxxx-android:clean
:xxxxxxxxxx-android-library:clean
:xxxxxxxxxx-android:copyNativeLibs
:xxxxxxxxxx-android:copyFlavorbaidu
:xxxxxxxxxx-android:prepareFlavor
:xxxxxxxxxx-android:preBuild
:xxxxxxxxxx-android:preBaiduReleaseBuild
:xxxxxxxxxx-android:checkBaiduReleaseManifest
:xxxxxxxxxx-android:preBaiduBetaBuild
:xxxxxxxxxx-android:preBaiduBetaProguardBuild
:xxxxxxxxxx-android:preBaiduDebugBuild
:xxxxxxxxxx-android:preBaiduMonkeyBuild
:xxxxxxxxxx-android-library:compileLint
:xxxxxxxxxx-android-library:copyReleaseLint UP-TO-DATE
:xxxxxxxxxx-android-library:mergeReleaseProguardFiles UP-TO-DATE
:xxxxxxxxxx-android-library:preBuild UP-TO-DATE
:xxxxxxxxxx-android-library:preReleaseBuild UP-TO-DATE
:xxxxxxxxxx-android-library:checkReleaseManifest
:xxxxxxxxxx-android-library:preDebugAndroidTestBuild UP-TO-DATE
:xxxxxxxxxx-android-library:preDebugBuild UP-TO-DATE
:xxxxxxxxxx-android-library:preparePaysdk11Library
:xxxxxxxxxx-android-library:prepareReleaseDependencies
:xxxxxxxxxx-android-library:compileReleaseAidl
:xxxxxxxxxx-android-library:compileReleaseRenderscript
:xxxxxxxxxx-android-library:generateReleaseBuildConfig
:xxxxxxxxxx-android-library:generateReleaseAssets UP-TO-DATE
:xxxxxxxxxx-android-library:mergeReleaseAssets
:xxxxxxxxxx-android-library:generateReleaseResValues UP-TO-DATE
:xxxxxxxxxx-android-library:generateReleaseResources
:xxxxxxxxxx-android-library:mergeReleaseResources
:xxxxxxxxxx-android-library:processReleaseManifest
:xxxxxxxxxx-android-library:processReleaseResources
:xxxxxxxxxx-android-library:generateReleaseSources
:xxxxxxxxxx-android-library:compileReleaseJavaNote: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:xxxxxxxxxx-android-library:processReleaseJavaRes
:xxxxxxxxxx-android-library:packageReleaseJar
:xxxxxxxxxx-android-library:compileReleaseNdk UP-TO-DATE
:xxxxxxxxxx-android-library:packageReleaseJniLibs UP-TO-DATE
:xxxxxxxxxx-android-library:packageReleaseLocalJar
:xxxxxxxxxx-android-library:packageReleaseRenderscript UP-TO-DATE
:xxxxxxxxxx-android-library:packageReleaseResources
:xxxxxxxxxx-android-library:bundleRelease
:xxxxxxxxxx-android:preparePaysdk11Library
:xxxxxxxxxx-android:prepareWorkspacexxxxxxxxxxAndroidLibraryUnspecifiedLibrary
:xxxxxxxxxx-android:prepareBaiduReleaseDependencies
:xxxxxxxxxx-android:compileBaiduReleaseAidl
:xxxxxxxxxx-android:compileBaiduReleaseRenderscript
:xxxxxxxxxx-android:generateBaiduReleaseBuildConfig
:xxxxxxxxxx-android:generateBaiduReleaseAssets UP-TO-DATE
:xxxxxxxxxx-android:mergeBaiduReleaseAssets
:xxxxxxxxxx-android:generateBaiduReleaseResValues UP-TO-DATE
:xxxxxxxxxx-android:generateBaiduReleaseResources
:xxxxxxxxxx-android:mergeBaiduReleaseResources....
:xxxxxxxxxx-android:processBaiduReleaseManifest
:xxxxxxxxxx-android:processBaiduReleaseResources
:xxxxxxxxxx-android:generateBaiduReleaseSources
:xxxxxxxxxx-android:compileBaiduReleaseJavaNote: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:xxxxxxxxxx-android:lintVitalBaiduRelease
:xxxxxxxxxx-android:compileBaiduReleaseNdk UP-TO-DATE
:xxxxxxxxxx-android:proguardBaiduRelease
:xxxxxxxxxx-android:dexBaiduRelease
:xxxxxxxxxx-android:processBaiduReleaseJavaRes UP-TO-DATE
:xxxxxxxxxx-android:validatexxxxConfigSigning
:xxxxxxxxxx-android:packageBaiduRelease
:xxxxxxxxxx-android:zipalignBaiduRelease
:xxxxxxxxxx-android:assembleBaiduRelease
:xxxxxxxxxx-android:assembleRelease
:xxxxxxxxxx-android-library:assembleRelease
:xxxxxxxxxx-android:archive

BUILD SUCCESSFUL

posted @ 2015-12-09 19:45  saki_god  阅读(1488)  评论(0编辑  收藏  举报