【问题标题】:Is it possible to pass Java String Constants to Gradle file?是否可以将 Java 字符串常量传递给 Gradle 文件?
【发布时间】:2019-07-12 09:44:57
【问题描述】:

我正在使用 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\""
 }

我有一个已经定义了这些 IP 地址的 Kotlin 文件:

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 类中,因为我也需要在我的项目中使用它的值。

【问题讨论】:

  • 使用BuildConfig 类,它将为您提供来自 buildConfigFields 的所有可用变量。

标签: android kotlin android-gradle-plugin


【解决方案1】:

您不需要为此使用 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 部分 并选择您要制作的版本

【讨论】:

    【解决方案2】:

    在项目的根目录下,创建一个文件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')
        }
    }
    

    【讨论】:

      【解决方案3】:

      另一种解决方案是在您的 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

      【讨论】:

        【解决方案4】:

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

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

        object API {
            const val URL_MAIN = BuildConfig.URL
        }
        

        现在,通过您的构建类型在 buildConfigField 中定义此 URL

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

        这样对于 debugrelease 类型,它可以是任何你想要的。

        【讨论】:

        • 我希望buildConfigField 访问该变量。在您的示例中,kotlin 代码正在访问 buildconfig 中定义的 url。
        • 因此,您希望buildConfigField 访问变量其他依赖项。对于这样的事情,您需要从 gradle 中的任何 property 文件中读取它。请参阅@Thomas 的回答。
        【解决方案5】:

        您可以在 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"'
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          • 2014-06-04
          • 2014-11-18
          • 1970-01-01
          相关资源
          最近更新 更多