美文网首页
Gradle脚本

Gradle脚本

作者: southtrain | 来源:发表于2018-03-07 19:25 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:Gradle脚本

          本文链接:https://www.haomeiwen.com/subject/ymrnxftx.html