【问题标题】:How to build several apks at once with custom gradle task?如何使用自定义 gradle 任务一次构建多个 apk?
【发布时间】:2018-09-14 05:30:11
【问题描述】:

我正在努力寻找一种使用 gradle 一次构建多个 apk 的方法。

我想要一个自定义 gradle 任务,它只考虑带有enviroment = "production" 的变体以及除nonPublishedBrandbuildtype = "release" 之外的所有品牌(参见下面的代码)。

对于这些变体中的每一个,我需要:

  1. 生成签名的apk

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

  3. 将 apk 重命名为 <brand>-<version>.apk 并将其移动到公共文件夹 $buildDir/myApks

我只找到了一种让 assemble 任务也运行我的自定义任务的方法,但这并不理想,因为我不想在每次构建生产版本变体时上传映射,但只有在它意味着即启动特定 gradle 任务时才上传.

是否可以使用 gradle 来实现?你能指出我正确的方向吗?

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

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
}
}

【问题讨论】:

  • 试试 ./gradlew assemble
  • @Rockin ./gradlew assemble 生成不同文件夹中的所有 apk,而我只需要一个公共文件夹中的一部分(仅发布,生产变体,不包括 nonpublishedbrand),在上传映射文件后重命名遇到问题

标签: android gradle apk build.gradle


【解决方案1】:

circle.ci 是一种在每次提交时生成构建的有效方式。
文档:https://circleci.com/docs/2.0/

你的 circle.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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 2015-12-28
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2022-08-13
    • 1970-01-01
    相关资源
    最近更新 更多