是否可以将Java字符串常量传递给Gradle文件?

时间:2019-07-12 09:44:57

标签: android kotlin android-gradle

我正在使用buildConfigField来传递调试信息并将服务器IP和其他字符串文字发布到应用中。

像这样:

 buildTypes {
        debug {
            buildConfigField "String", "url", "\"http:\\xxxxxxx.xx\""
        }

        release {
            buildConfigField "String", "url", "\"http:\\ppppppp.xx\""
        }
    }

但是我遇到一个问题,即在调试模式下,我的应用程序可以与多个测试服务器通信。有时我将其指向本地网络ip,如果不在工作场所,则将其指向远程测试服务器。

我现在面临的问题是,每当我想更改配置时,都必须在此处输入整个IP地址:

 debug {
     buildConfigField "String", "url", "\"http:\\xxxxxxx.xx\""
 }

我有一个Kotlin文件,其IP地址已经定义:

object API {
    const val URL_MAIN = "http://19.544...."
    const val URL_TEST_LOCAL = "http://192.16...."
    const val URL_TEST_REMOTE = "http://19.554...."
}

总有办法通过gradle文件访问此变量,而不用键入它。

编辑: 我将这些url放在Kotlin类中,因为我也需要在项目中使用它的值。

5 个答案:

答案 0 :(得分:3)

您无需为此使用Java字符串,产品版本是完美的解决方案

在Gradle文件中的android块中按如下方式使用它

productFlavors {

       main {
            dimension "app"
            buildConfigField 'String', 'url', 'http://XXXXXXX'
        }

      test_local {
            dimension "app"
            buildConfigField 'String', 'url', 'http://XXXXXXX'
        }

       test_remote {
            dimension "app"
            buildConfigField 'String', 'url', 'http://XXXXXXX'
        }


    }

使用Android Studio左下角的Build Variant部分 然后选择您要建造的建筑

答案 1 :(得分:1)

在项目的根目录中,创建文件myFile.properties

URL_MAIN = "http://19.544...."
URL_TEST_LOCAL = "http://192.16...."
URL_TEST_REMOTE = "http://19.554...."

然后:

buildTypes {
    debug  {
        Properties properties = new Properties()
        properties.load(project.rootProject.file('myFile.properties').newDataInputStream())
        buildConfigField "String", "url", properties.getProperty('URL_TEST_LOCAL')
    }

    release  {
        Properties properties = new Properties()
        properties.load(project.rootProject.file('myFile.properties').newDataInputStream())
        buildConfigField "String", "url", properties.getProperty('URL_MAIN')
    }
}

答案 2 :(得分:1)

另一种解决方案是在build.gradle

中定义这些内容
def API_URL_MAIN = "http://19.544...."
def API_URL_TEST_LOCAL = "http://192.16...."
def API_URL_TEST_REMOTE = "http://19.554...."

// all your other things...

buildTypes {
    debug {
        buildConfigField "String", "url", "\"$API_URL_TEST_LOCAL\""
    }
    release {
        buildConfigField "String", "url", "\"$API_URL_MAIN\""
    }
}

您将需要"\"$<NAME_OF_YOUR_CONSTANT>\""以便正确构建为String

答案 3 :(得分:1)

您可以使用 BuildConfig 类,该类是自动生成的类,可为您提供由 buildConfigFields 定义的变量文件。

因此,您无需更改主要内容,而需要更改API对象中的一些次要内容,如下所示:

object API {
    const val URL_MAIN = BuildConfig.URL
}

现在,根据您的构建类型在 buildConfigField 中定义此URL

buildConfigField "String", "URL", "\"http:\\xxxxxxx.xx\""

对于 debug release 类型,它可以是您想要的任何类型。

答案 4 :(得分:1)

您可以在Gradle文件中使用ProductFlavoursProductFlavours是一种应用程序的不同样式。您可以在口味中添加多个buildConfigField,最终生成一个 Build.config 文件

productFlavors {

   name {
        minsdkversion 16
        targetsdkversion 26
        dimension "app_name"
        buildConfigField 'String', 'BASE_URL', '"http://XXXXXXX"'
    }

  name1 {
        minsdkversion 16
        targetsdkversion 26
        dimension "app_name"
        buildConfigField 'String', 'BASE_URL', '"http://XXXXXXX"'
    }

   name2 {
        minsdkversion 16
        targetsdkversion 26
        dimension "app_name"
        buildConfigField 'String', 'BASE_URL', '"http://XXXXXXX"'
    }
}