当前位置: 首页 > 知识库问答 >
问题:

如何使用自定义gradle任务同时构建多个APK?

令狐运珧
2023-03-14

我正在努力寻找一种方法,建立几个apk与gradle一次。

我想有一个定制的gradle任务,它只考虑具有Environment=“production”和所有品牌的变体,但不考虑非公开品牌和buildtype=“release”的变体(见下面的代码)。

对于这些变体,我需要:

>

  • 生成签名的apk

    使用相对任务uploadBugsnag${variant.name}-releaseMapping将prodguard映射上载到bugsnag

    将apk重命名为

    我只找到了一种方法,可以让组装任务也运行我的自定义任务,但这并不理想,因为我不想每次构建生产版本变体时都上载映射,而只想在这意味着启动特定的gradle任务时上载映射。

    gradle有可能做到这一点吗?你能给我指一下正确的方向吗?

    请参阅我的build.gradleandroid部分以供参考:

    android {
    compileSdkVersion 27
    
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1000000
        versionName "1.0.0.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    
    
    signingConfigs {
        release {
            storeFile file("keystore/keystore")
            storePassword '*******'
            keyAlias '*******'
            keyPassword '*******'
        }
    }
    
    buildTypes {
    
        debug {
            applicationIdSuffix ".debug"
            versionNameSuffix ".debug"
            manifestPlaceholders = [buildTypePrefix: "D_"]
        }
    
        release {
            debuggable false
            signingConfig signingConfigs.release
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            manifestPlaceholders = [buildTypePrefix: ""]
        }
    }
    
    
    flavorDimensions "environment", "brand"
    
    productFlavors {
        //ENVIRONMENTS
        staging {
            dimension "environment"
            applicationIdSuffix ".staging"
            versionNameSuffix ".staging"
            buildConfigField("String", "BASE_URL", "\"http://baseurl-staging.com\"")
            manifestPlaceholders = [environmentPrefix: "S_"]
        }
    
        production {
            dimension "environment"
            buildConfigField("String", "BASE_URL"l, "\"http://baseurl-prod.com\"")
            manifestPlaceholders = [environmentPrefix: ""]
        }
    
        //BRANDS
        nonPublishedBrand {
            dimension "brand"
            applicationId "${packageBaseName}.nonpublishedbrand"
            manifestPlaceholders = [appName: "Non published brand"]
            ext {
                facebook_app_id = [
                        staging: "0000000",
                        prod   : "11111111"
                ]
            }
        }
    
    
        brand1 {
            dimension "brand"
            applicationId "${packageBaseName}.brand1"
            manifestPlaceholders = [appName: "Brand 1"]
            ext {
                facebook_app_id = [
                        staging: "22222222",
                        prod   : "33333333"
                ]
            }
        }
    
        brand2 {
            dimension "brand"
            applicationId "${packageBaseName}.brand2"
            manifestPlaceholders = [appName: "Brand 2"]
            ext {
                facebook_app_id = [
                        staging: "44444444",
                        prod   : "555555555"
                ]
            }
        }
    }
    
    productFlavors {
        applicationVariants.all { variant ->
            def isDebug = false
            if (variant.buildType.name == "debug") {
                isDebug = true
            }
    
            def isStaging = false
            def flavors = variant.productFlavors
            def environment = flavors[0]
            if (environment.name == "staging") {
                isStaging = true
            }
    
            def facebookAppId = ""
            if (isStaging){
                facebookAppId = flavors[1].facebook_app_id.staging
            }else{
                facebookAppId = flavors[1].facebook_app_id.prod
            }
    
            variant.buildConfigField "String", "FACEBOOK_APP_ID", "\"${facebookAppId}\""
        }
    }
    
    dataBinding {
        enabled = true
    }
    
    bugsnag {
        autoUpload false
    }
    }
    

  • 共有1个答案

    傅越
    2023-03-14

    圆圈ci是在每次提交时生成生成的有效方法<文档:https://circleci.com/docs/2.0/

    你的圈子。yml文件的内容如下:

        override:
            - ./gradlew clean :mobile:assemblePre -PdisablePreDex -Pandroid.threadPoolSize=1 -Dorg.gradle.parallel=false -Dorg.gradle.jvmargs="-Xms2048m -Xmx4608m"
            -  cp -r ~ build/outputs/apk/build/pre/*.apk  $CIRCLE_ARTIFACTS
    
            - ./gradlew clean :mobile:assembleRelease -PdisablePreDex -Pandroid.threadPoolSize=1 -Dorg.gradle.parallel=false -Dorg.gradle.jvmargs="-Xms2048m -Xmx4608m"
            - cp -r ~build/outputs/apk/build/release/*.apk $CIRCLE_ARTIFACTS
    

    汇编预和汇编发布是在上述情况下执行的任务。您可以尝试在此处编写自定义任务。

     类似资料:
    • 在构建中使用自定义Ant任务 为了让你的构建可以自定义任务, 你可以使用 taskdef(通常更容易) 或者 typedef Ant 任务, 就像你在一个build.xml文件中一样. 然后,你可以参考内置 Ant 任务去定制 Ant 任务. 例 16.5.使用自定义 Ant 任务 build.gradle task check << { ant.taskdef(resource: 'ch

    • 我有一个用Gradle构建的Android应用程序,它包含BuildTypes和产品口味(变体)。例如,我可以运行这个命令来构建一个特定的APK: 我必须在build.gradle中创建一个自定义任务,例如:

    • 我想把多个分级任务作为一个来运行。所以不是 这行不通

    • 我正在使用Eclipse Buildship插件在我的项目上执行Gradle任务。知道如何在运行构建任务时排除测试任务吗?在Gradle STS插件中,我曾经将程序参数更新为'-x test',它跳过了测试任务。当我在Buildship上尝试同样的方法时,得到了下面的错误。

    • 我正在尝试创建一个自定义任务/插件(两者都拒绝工作),用于我的gradle构建脚本。 我正在使用groovy插件,希望在单独的文件中声明任务/插件,而不是在我的构建中。格拉德尔。 我的项目树如下所示: 我试图做的是在中创建我的任务/插件类,然后在。 让我举一个小例子。 TestTask。groovy: build.gradle 当我尝试使用我的gradle.build(清洁,构建等)做任何事情时,

    • 我想写一个Gradle任务,在我所有的子项目中共享。此任务在调用它的子项目中查找所有其他类型为“GenerateMavenPom”的任务,并执行这些任务。 通过这样做,我的子项目可以定义他们想要的任何Maven发布,我可以使用“gradle GenerateMavenPomFiles”等单个任务执行gradle来创建pom.xml,而不需要知道每个子项目中的单个发布类型。为什么?因为Maven插件