在build.gradle中定义一个自定义方法,并从同一个块和其他块

时间:2018-06-14 05:05:31

标签: android android-gradle build.gradle

我需要在build.gradle中定义一个方法来定义BuildConfigFields。我试过的是下面的内容。

defaultConfig {
    initializeBuildConfig()
    applicationId com.terser
    minSdkVersion 16
    targetSdkVersion 26
    versionCode 1
    versionName "1.0.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    ext.initializeBuildConfig = {->
        Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(file('config.properties')))
        def properties_appName = versionProps['APP_NAME']
        manifestPlaceholders = [appname:properties_appName]

        def properties_authkey=versionProps['AUTH_KEY']
        buildConfigField "String", "AUTH_KEY", "\"$properties_authkey\""
    }
}

但它无法解决错误。

  

无法在DefaultConfig_Decorated上找到arguments []的方法initializeBuildConfig(){name = main,dimension = null,minSdkVersion = null,targetSdkVersion = null,renderscriptTargetApi = null,renderscriptSupportModeEnabled = null,renderscriptSupportModeBlasEnabled = null,renderscriptNdkModeEnabled = null,versionCode = null,versionName = null,applicationApplicationId = null,testInstrumentationRunner = null,testInstrumentationRunnerArguments = {},testHandleProfiling = null,testFunctionalTest = null,signingConfig = null,resConfig = null,mBuildConfigFields = {},mResValues = {}, mProguardFiles = [],mConsumerProguardFiles = [],mManifestPlaceholders = {appname = invite},mWearAppUnbundled = null},类型为com.android.build.gradle.internal.dsl.DefaultConfig。

任何人都可以帮助我吗?我想知道如何在同一个块中以及在其他块中定义方法并调用它。我怎么能从方法返回一个值 ?
我已经查看了How to define and call custom methods in build.gradle。答案似乎是正确的,但我无法从上述链接中给出的答案中获取概念。我试图实现相同但得到上述错误。

1 个答案:

答案 0 :(得分:0)

的一种方法
ext.myCustomMethod = { param1, param2 ->
    // Method body here
}

请注意,这是为项目范围创建的,即。全局可用于项目,可以使用myCustomMethod(p1,p2)在构建脚本中的任何位置调用,这相当于project.myCustomMethod(p1,p2)

该方法也可以在不同的范围内定义,例如在任务中:

task myTask {
    ext.myCustomMethod = { param1, param2 ->
        // Method body here
    }

    doLast {
        myCustomMethod(p1, p2) // This will resolve 'myCustomMethod' defined in task
    }
}

赞:

task ndkBuild(type: Exec, description: 'Compile JNI source with NDK') {
        Properties properties = new Properties()
        properties.load(project.rootProject.file('local.properties').newDataInputStream())
        def ndkDir = properties.getProperty('ndk.dir')
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine "$ndkDir/ndk-build.cmd", '-C', file('src/main/jni').absolutePath
        } else {
            commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath
        }
    }

当我们使用ext时,范围被限制在定义的位置,即。如果它是在任务下定义的,则它是任务的本地。它的工作方式是通过实现ExtensionAware的实体(如项目,任务等)。这会添加一个ExtraPropertiesExtension,它通过ext指令配置。