【问题标题】:How to add meta-data to gradle/AndroidStudio generated manifest如何将元数据添加到 gradle/Android Studio 生成清单
【发布时间】:2014-01-09 03:11:41
【问题描述】:

我正在从 Ant/Eclipse 环境迁移到 Gradle/Android Studio,我们使用的一些工具需要 Android 应用程序具有元数据标签,同时设置了 android:name 和 android:value 字段。

我们目前有两个应用的构建变体,在 build.gradle 文件中指定为 productFlavours/buildTypes。由于 Android manifest.xml 文件是 gradle 在构建时生成的,我显然不能直接将元数据放在 xml 文件中。

有没有办法在 build.gradle 文件中指定这一点,以便两个 buildType 都将元数据字段添加到生成的 Manifest.xml 中,但具有不同的“android:value”值?

【问题讨论】:

    标签: android gradle


    【解决方案1】:

    为什么不能将meta-data 直接放在清单中?

    您可以通过sourceSets 为每个gradle buildTypes 指定一个清单:

    sourceSets {
    
            main {
                manifest.srcFile 'src/main/AndroidManifest.xml'
                res.srcDirs = ['src/main/res']
            }
    
            debug {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
                res.srcDirs = ['src/main/debug/res']
            }
    
            release {
                manifest.srcFile 'src/main/release/AndroidManifest.xml'
                res.srcDirs = ['src/main/release/res']
            }
    }
    

    如果你在 debug 中构建,gradle 会将“main”清单与调试清单合并。

    【讨论】:

    • 因为没有人喜欢将一个巨大的清单文件复制到三个不同的文件中并维护它们?
    • 正如我所说,Gradle 会将调试清单与主清单合并。所以你不必复制和维护巨大的文件......
    【解决方案2】:

    您可以使用这种方法:

    1. build.gradle:
        buildTypes {
            debug {
                ...
                resValue "string", "my_string", "string value debug"
            }
            release {
                ...
                resValue "string", "my_string", "string value release"
            }
        }
    

        productFlavors {
            staging {
                ...
                resValue "string", "my_string", "string value staging"
            }
            production {
                ...
                resValue "string", "my_string", "string value production"
            }
        }
    
    1. 在 AndroidManifest.xml 中使用 Gradle 文件同步项目后:
        <meta-data android:name="MY_META" android:value="@string/my_string"/>
    

    【讨论】:

    • 您能否链接到此信息的来源?供进一步参考。
    • 正是我需要的
    【解决方案3】:

    受其他一些答案的启发,这很好用...

    1) 在您的清单中放置一个占位符:

    <meta-data android:name="MY_META" android:value="${someKeyForValue}"/>
    

    2) 在你的 build.gradle 中设置值

    flavorDimensions "env"
    productFlavors {
        dev {
            flavorDimension "env"
            ...
            someKeyForValue = "TheDynamicValue_01"
        }
        prod {
            flavorDimension "env"
            ...
            someKeyForValue = "TheDynamicValue_02"
        }
     }
    

    这种方法避免了创建资源,并且原始清单读取更清楚一点,即将在构建时注入一个值。

    有关清单占位符支持的更多信息:Android Tools and Manifest Placeholders

    【讨论】:

    • 不再起作用了。文档说改用这个: manifestPlaceholders = [ someKeyForValue :"TheDynamicValue_02"]
    【解决方案4】:
    android {
        ...
        buildTypes {
            debug {
                ...
                resValue "string", "GOOGLE_MAPS_ANDROID_API_KEY", "(your development Maps API key)"
            }
            release {
                ...
                resValue "string", "GOOGLE_MAPS_ANDROID_API_KEY", "(your production Maps API key)"
            }
        }
    }
    <meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="@string/GOOGLE_MAPS_ANDROID_API_KEY"/>
    
    
    Your IDE may complain about this string resource not existing, but it will build just fine.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2012-11-16
      • 2019-05-22
      • 2013-10-31
      相关资源
      最近更新 更多