Gradle脚本

AndroidStudio项目结构:

- Project
   - application app
   - module sdk
   - module 3rd
   - module net
   ....

上面的Project/Application/Module都具有自己的build.gradle配置文件。真正能构建的好像只能在Application或Module,在Project里面部分命令是不支持的。

对于Module而言,在build过程,和Application对象几乎一样。

project对象

  1. 可以添加在任意build.gradle里面,Project除外。
  2. 对于Application或Module,都指向当前Application或Module对象。不能跨域。比如,application app中project是app模块;module sdk中project是sdk模块;并不能通过app模块访问到sdk模块。
build {
    doLast {
        def appName = "app"
        def moduleName = "rpcservice"
        def buildDir = project.projectDir.path+"/../";
        println buildDir
        def fromFile = buildDir + moduleName+"/build/outputs/aar/" + moduleName + "-release.aar"
        def intoFile = buildDir + appName + "/build/outputs/aar/"
        println fromFile
        println intoFile
        copy {
            from fromFile
            into intoFile
            rename {
                appName + "-release.aar"
            }
        }
        println("=====================build.doLast success.=========================")
    }
}

以上脚本代码,可以添加到Application或Module里,Project不支持。

rootProject对象

println project.rootProject.projectDir.absolutePath;

copy&rename

坑爹的copy&rename,因为不提供复制时直接改变文件名。只能将文件复制到目录,然后再修改名称。

 copy {
            from fromFile
            into intoFile
            rename {
                appName + "-release.aar"
            }
 }

task copyTmpChangelog(type: Copy) {
  from "input"
  into '.'
  rename { String fileName ->
    fileName.replace("input", "output")
  }
}

static静态方法

static def genVersionName() {
    String versionName = System.getenv("VERSION_NAME")
    if (versionName != null) {
        return versionName
    } else {
        return "UNDEFINED"
    }
}
def _versionName = genVersionName()

ext 全局变量区

ext {
    bintrayRepo = 'maven'
    bintrayName = 'appswitcher'
    bintrayOrg = 'inmarket'
    versionName = "1.0.0"

    publishedGroupId = 'com.inmarket'
    libraryName = 'appswitcher'
    artifact = 'appswitcher'

    libraryDescription = 'App switching library for Android'

    libraryVersion = '1.0.0'

    developerId = 'zaidd'
    developerName = 'Zaid Daghestani'
    developerEmail = 'zdaghestani@inmarket.com'

    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
    allLicenses = ["Apache-2.0"]
}

gradlew 命令

坑爹的gradle需要本地安装才能用,而gradlew则不需要,使用gradle会出现各种版本不对的错误,而gradlew则没有。所以放弃使用gradle吧。

  1. ./gradlew install 生成pom文件在build目录下
  2. ./gradlew build 构建所有版本

Pom文件

archivesBaseName = "libqrcodeshare"

Gradle实例

Project
   - app
        - build.gradle
   - sdk
        - build.gradle
        - genPom.gradle

app/build.gradle

apply plugin: 'com.android.application'

boolean isBuildInJenkins() {
    String tag = System.getenv("BUILD_TAG")
    println "****************BUILD_TAG is $tag*****************"
    return tag != null && tag.contains("jenkins")
}
android {
    compileSdkVersion 26
    // 所有输出到output
    if (isBuildInJenkins()) {
        applicationVariants.all { variant ->
            variant.packageApplication.outputDirectory = new File(project.buildDir.absolutePath + "/outputs/apk/")
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.0.0-beta1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'

    compile project(path: ':sdk')
}

sdk/build.gradle

apply plugin: 'com.android.library'
apply from: './genPom.gradle'

// 构建完成后执行,仅指当前module构建完成
build {
    doLast {
        def appName = "app"
        def moduleName = "sdk"
        def buildDir = project.projectDir.path+"/../";
        println buildDir
        def fromModule = buildDir + moduleName + "/build/"
        def intoApp = buildDir + appName + "/build/"
        println fromModule
        println intoApp

        println project.rootProject.projectDir.absolutePath;

        // copy aar -> app/build/
        copy {
            from fromModule + "/outputs/aar/" + moduleName + "-release.aar"
            into intoApp + "/outputs/aar/"
            rename {
                appName + "-release.aar"
            }
        }
        // copy pom -> app/build/
        copy {
            from fromModule + "/poms/pom-default.xml"
            into intoApp + "/poms/"
        }
        println("=====================build.doLast success.=========================")
    }
}

sdk/genPom.gradle

apply plugin: 'com.github.dcendents.android-maven'

static def genVersionName() {
    String versionName = System.getenv("VERSION_NAME")
    if (versionName != null) {
        return versionName
    } else {
        return "UNDEFINED"
    }
}

static def getGroupId(){
    String groupId = System.getenv("GROUP_ID")
    if (groupId != null) {
        return groupId
    } else {
        return "UNDEFINED"
    }
}

static def getArtifactId(){
    String artifactId = System.getenv("ARTIFACT_ID")
    if (artifactId != null) {
        return artifactId
    } else {
        return "UNDEFINED"
    }
}

static def getName(){
    String name = System.getenv("LIB_NAME")
    if (name != null) {
        return name
    } else {
        return "UNDEFINED"
    }
}

def _groupId = getGroupId()
def _artifactId = getArtifactId()
def _versionName = genVersionName()
def _name = getName()

install {
    println mavenPomDir
    def appName = "app"
    def moduleName = "sdk"
    def buildDir = project.projectDir.path+"/../";
    println buildDir
    def fromModule = buildDir + moduleName + "/build/"
    def intoApp = buildDir + appName + "/build/"
    // 【修改默认的mavenPomDir路径,本来是在sdk/build/poms下,现在将其生成到app/build/poms目录下】
    mavenPomDir = intoApp + "poms/"
    println mavenPomDir
    println '========================xxxx======================='
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                groupId _groupId
                artifactId _artifactId
                version _versionName
                name _name
            }
        }
    }
}

maven插件文档https://docs.gradle.org/current/userguide/maven_plugin.html,里面有说明,gradlew install是执行生成pom文件。

以上gradle,执行结果:


[EnvInject] - Executing scripts and injecting environment variables after the SCM step.
[EnvInject] - Injecting as environment variables the properties file path 'gradle.properties'
[EnvInject] - Variables injected successfully.
[EnvInject] - Injecting environment variables from a build step.
[EnvInject] - Injecting as environment variables the properties content 

【1. 静态方法先执行】
CLASSIFIER=release
ARTIFACT_ID=librpcservice
REPOSITORYID=releases
VERSION_NAME=R.0.1.13
GROUP_ID=com.jokin.demo
LIB_NAME=LibRpcService_master
MVN_URL=http://mvn.gz.jokin.cn/nexus/content/repositories/${REPOSITORYID}

[EnvInject] - Variables injected successfully.
[Gradle] - Launching build.

[LibRpcService_master] $ /usr/local/cov-analysis-linux64-2017.07/bin/cov-build --dir $COV_IDIR /home/demo/tools/hudson.plugins.gradle.GradleInstallation/gradle-4.2/bin/gradle clean build install
Coverity Build Capture (64-bit) version 2017.07 on Linux 4.4.0-97-generic x86_64
Internal version numbers: 7a4de27b47 p-milo-push-30112.654


To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/4.2/userguide/gradle_daemon.html.
Daemon will be stopped at the end of the build stopping after processing

【2. app/build.gradle中的方法执行】
****************BUILD_TAG is jenkins-write_display-write_display_common_library-LibRpcService_master-13*****************

Configuration 'compile' in project ':app' is deprecated. Use 'implementation' instead.

WARNING [Project: :sdk] Support for not packaging BuildConfig is deprecated.

Configuration 'compile' in project ':sdk' is deprecated. Use 'implementation' instead.
                        
【3. sdk/genPom.gradle执行】
/home/demo/workspace/write_display/write_display_common_library/LibRpcService_master/sdk/build/poms
/home/demo/workspace/write_display/write_display_common_library/LibRpcService_master/sdk/../
/home/demo/workspace/write_display/write_display_common_library/LibRpcService_master/app/build/poms
========================xxxx=======================

【4. 各项目依次clean,相当于gradlew clean】
:clean
:app:clean
:sdk:clean

:app:preBuild UP-TO-DATE

:sdk:preBuild UP-TO-DATE
:sdk:preDebugBuild UP-TO-DATE
:sdk:checkDebugManifest
:sdk:processDebugManifest

:app:preDebugBuild
:sdk:compileDebugAidl
:app:compileDebugAidl
:sdk:packageDebugRenderscript NO-SOURCE
:app:compileDebugRenderscript
:app:checkDebugManifest
:app:generateDebugBuildConfig
:app:prepareLintJar UP-TO-DATE
:app:generateDebugResValues
:app:generateDebugResources
:sdk:compileDebugRenderscript
:sdk:generateDebugResValues
:sdk:generateDebugResources
:sdk:packageDebugResources
。。。省略。。。。。

:sdk:transformClassesAndResourcesWithPrepareIntermediateJarsForRelease
:app:javaPreCompileRelease
:app:compileReleaseJavaWithJavac
:app:compileReleaseSources
:app:lintVitalRelease SKIPPED
:app:transformClassesWithPreDexForRelease
:app:transformDexWithDexForRelease
:app:transformNativeLibsWithMergeJniLibsForRelease
:app:transformNativeLibsWithStripDebugSymbolForRelease
:app:transformResourcesWithMergeJavaResForRelease
:app:packageRelease
:app:assembleRelease
:app:assemble          【app】【gradlew assemble】
:app:lint              【app】【gradlew lint】
:app:javaPreCompileDebugUnitTest
:app:compileDebugUnitTestJavaWithJavac NO-SOURCE
:app:testDebugUnitTest NO-SOURCE
:app:javaPreCompileReleaseUnitTest
:app:compileReleaseUnitTestJavaWithJavac NO-SOURCE
:app:testReleaseUnitTest NO-SOURCE
:app:test UP-TO-DATE
:app:check             【app】【gradlew check】
:app:build             【app】【gradlew build】

:sdk:extractDebugAnnotations
:sdk:transformResourcesWithMergeJavaResForDebug
:sdk:transformClassesAndResourcesWithSyncLibJarsForDebug
:sdk:bundleDebug
:sdk:compileDebugSources
:sdk:assembleDebug
:sdk:extractReleaseAnnotations
:sdk:transformResourcesWithMergeJavaResForRelease
:sdk:transformClassesAndResourcesWithSyncLibJarsForRelease
:sdk:bundleRelease
:sdk:compileReleaseSources
:sdk:assembleRelease
:sdk:assemble   【sdk】【gradlew assemble】
:sdk:lint       【sdk】【gradlew lint】
:sdk:javaPreCompileDebugUnitTest
:sdk:compileDebugUnitTestJavaWithJavac NO-SOURCE
:sdk:testDebugUnitTest NO-SOURCE
:sdk:javaPreCompileReleaseUnitTest
:sdk:compileReleaseUnitTestJavaWithJavac NO-SOURCE
:sdk:testReleaseUnitTest NO-SOURCE
:sdk:test UP-TO-DATE
:sdk:check
:sdk:build.      【sdk】【gradlew build】
                 【sdk】【after build】
/home/demo/workspace/write_display/write_display_common_library/LibRpcService_master/sdk/../
/home/demo/workspace/write_display/write_display_common_library/LibRpcService_master/sdk/../sdk/build/
/home/demo/workspace/write_display/write_display_common_library/LibRpcService_master/sdk/../app/build/
/home/demo/workspace/write_display/write_display_common_library/LibRpcService_master
=====================build.doLast success.=========================
:sdk:install     【gradlew install】

BUILD SUCCESSFUL in 2m 8s
114 actionable tasks: 110 executed, 4 up-to-date
Emitted 94 Java compilation units (100%) successfully
[WARNING] Recoverable errors were encountered during 26 of these Java compilation units.

大致流程:

  1. 静态方法先执行
  2. app/build.gradle先执行
  3. sdk引入的genPom.gradle执行
  4. 当所有gradle文件执行一遍后,开始构建。
  5. 各项目依次clean,相当于gradlew clean,构建前先清理。
  6. 接下来依次执行,从Application app到Module sdk。
    【app】【gradlew assemble】
    【app】【gradlew lint】
    【app】【gradlew check】
    【app】【gradlew build】
  7. 如果在app/build后面添加脚本,则脚本在此时执行(上面的 build { doLast{ } }只是针对当前Project或Module的构建过程,并不是指整个项目构建完成。)
    【sdk】【gradlew assemble】
    【sdk】【gradlew lint】
    【sdk】【gradlew check】
    【sdk】【gradlew build】
  8. 如果在sdk/build后面添加脚本,则脚本在此时执行。
  9. 最后一个module构建完成,执行install。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 基础 Android构建过程 Gradle是以Groovy语言为基础的自动化构建工具。Android的构建系统是建...
    mqstack阅读 12,793评论 0 7
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • 参考资料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter阅读 10,977评论 0 6
  • 瓦墙上,院落内, 到处都是皑皑飘雪。 四处的寂静, 恰似落入云端的感觉: 静谧,祥和,而又兴奋, 掩去手把上的积雪...
    大头土豆丫丫阅读 241评论 0 0