【问题标题】:Gradle buildConfigField: Syntax for arrays & maps?Gradle buildConfigField:数组和地图的语法?
【发布时间】:2017-06-27 02:38:51
【问题描述】:

android gradle 文档中提到了 buildConfigField:

void buildConfigField(String type, String name, String value)

向生成的 BuildConfig 类添加一个新字段。字段生成为:type name = value;

这意味着它们中的每一个都必须具有有效的 Java 内容。如果类型是字符串,则值应包含引号。

我找不到有关数组、Arraylist 或 HashMap 的 buildConfigField 值语法的任何信息?由于它们被编译成 java 代码,通常一切皆有可能。

有没有人有一些例子或文档?

【问题讨论】:

  • 这是 Groovy 代码。所以如果你想知道语法,看那里。
  • 这与常规语法无关,或多或少与可用类型有关。但我同时解决了这个问题......

标签: java android gradle android-gradle-plugin


【解决方案1】:

对于数组

app.gradle

        buildConfigField "String[]", "URL_ARRAY",
        "{" +
        "\"http:someurl\"," +
        "\"http:someurl\"," +
        "\"http:someurl\"" +
        "}"

地图

        buildConfigField "java.util.Map<String, String>", "NAME_MAP", 
                 "new java.util.HashMap<String, " +
                 "String>() {{ put(\"name\", \"John\"); put(\"name1\",  \"John\"); put(\"name2\", " +
                "\"John\"); }}"

代码访问:

HashMap<String, String> name = (HashMap<String, String>) BuildConfig.NAME_MAP;

【讨论】:

    【解决方案2】:

    恕我直言,使用buildConfig 字段的原因是为了将重要数据保留在代码之外——比如环境变量。

    另一个例子 - 静态数组 + gradle.properties(需要 Gradle 2.13 或更高版本):

    gradle.properties:

    
    nonNullStringArray=new String[]{ \n\
        \"foo\",\n\
        \"bar\"\n}
    
    

    build.gradle:

    buildConfigField "String[]", "nonNullStringArray", (project.findProperty("nonNullStringArray") ?: "new String[]{}")
    
    buildConfigField "String[]", "nullableStringArray", (project.findProperty("nullableStringArray") ?: "null")
    
    
    

    【讨论】:

      【解决方案3】:

      数组的便捷方法(不转义):

      def arrayAsString(String ... args) {
          StringBuilder builder = new StringBuilder();
          builder.append("{");
          if(args.length > 0) {
              for (String arg : args) {
                  builder.append('"')
                  builder.append(arg);
                  builder.append('"')
                  builder.append(", ")
              }
              builder.setLength(builder.length() - 2)
          }
          builder.append("}");
          return builder.toString();
      }
      

      【讨论】:

        【解决方案4】:

        这里是另一个例子

        带有环境的 Gradle 文件:

        ext {
            // Environments list
            apiUrl = [
                    prod         : "https://website.com",
                    preprod      : "https://preprod.website.com"
            ]
        }
        

        Gradle Android 文件:

        private static String getApiUrlHashMapAsString(apiUrlMap) {
            def hashMap = "new java.util.HashMap<String, String>()" + "{" + "{ "
            apiUrlMap.each { k, v -> hashMap += "put(\"${k}\"," + "\"${v}\"" + ");" }
            return hashMap + "}" + "}"
        }
        
        android {
            defaultConfig {
                 buildConfigField "java.util.Map<String, String>", "API_URLS", getApiUrlHashMapAsString(apiUrl)
            }
        }
        

        在您的代码中:

        BuildConfig.API_URLS
        

        【讨论】:

          【解决方案5】:

          好的,我现在知道了。参数在java中是1:1翻译的,这意味着实际上你需要在gradle中编写java代码并正确转义。

          对于哈希集:

          
          buildConfigField "java.util.Set<String>", "MY_SET", "new java.util.HashSet<String>() {{ add(\"a\"); }};"
          
          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-05-01
            • 1970-01-01
            • 2015-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多