我首先要说我是Gradle的新手,因此,如果这个问题已经得到解答,我深表歉意。

我正在使用API​​密钥访问第三方工具的Android应用程序上工作。需要根据应用程序的 flavor 构建类型使用不同的API密钥。

这是我要执行的操作的基本概述:

android {
    defaultConfig {
        manifestPlaceholders = [ apiKey:"DEBUG_KEY" ]
    }

    buildTypes{
        debug{
            // Some debug setup
        }
        release{
            // Some release setup
        }
    }

    productFlavors {
        // List of flavor options
    }
    productFlavors.all{ flavor->
        if (flavor.name.equals("someFlavor")) {
            if (buildType.equals("release")) {
                manifestPlaceholders = [ apiKey:"RELEASE_KEY_1" ]
            } else {
                manifestPlaceholders = [ apiKey:"DEBUG_KEY" ]
            }
        } else {
            if (buildType.equals("release")) {
                manifestPlaceholders = [ apiKey:"RELEASE_KEY_2" ]
            } else {
                manifestPlaceholders = [ apiKey:"DEBUG_KEY" ]
            }
        }
    }
}

到目前为止,manifestPlaceholders语句在非常简单的情况下工作,但是我不知道如何从 productFlavors 块中引用 buildType ,以便可以将其用作条件。

最佳答案

我猜您是指Fabric ApiKey吗? :)我只是花了几个小时尝试用占位符类似的方式并在gradle文件中指定ApiKey,尽管从com.android.tools.build:gradle:1.3.1来看这似乎是不可能的。可以为特定 flavor 指定占位符,但不能为 flavor AND buildType指定占位符。

只是为了更正语法,您必须采取的方式(如果可能的话)将是类似的方式,但manifestPlaceholders对于变体是未知的。

applicationVariants.all{ variant->
    if (variant.productFlavors.get(0).name.equals("someFlavor")) {
        if (variant.buildType.name.equals("release")) {
            manifestPlaceholders = [ apiKey:"RELEASE_KEY_1" ]
        } else {
            manifestPlaceholders = [ apiKey:"DEBUG_KEY" ]
        }
    } else {
        if (variant.buildType.name.equals("release")) {
            manifestPlaceholders = [ apiKey:"RELEASE_KEY_2" ]
        } else {
            manifestPlaceholders = [ apiKey:"DEBUG_KEY" ]
        }
    }
}

您实际需要做的是将密钥保留在AndroidManifest.xml中,并使用多个 list 文件处理它

src / AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">
    <application>
        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="DEBUG_KEY" tools:replace="android:value"/>
    </application>
</manifest>

src / someFlavorRelease / AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">
    <application>
        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="RELEASE_KEY_1" tools:replace="android:value"/>
    </application>
</manifest>

src / someOtherFlavorRelease / AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">
    <application>
        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="RELEASE_KEY_2" tools:replace="android:value"/>
    </application>
</manifest>

manifestMerger将处理替换,您将在每种情况下使用正确的密钥。我刚刚成功实现了它。我只是希望您真的是在指Fabric键! :)

希望这可以帮助!

07-24 09:49
查看更多