如何在Android Gradle项目中的项目配置阶段之前定义ANDROID_HOME?

问题描述 投票:0回答:1

使用Gradle构建Android应用程序时,我们需要将ANDROID_HOME指向我们的构建版本。也许在local.properties文件中使用环境变量或其他东西。

我试图找到一种方法来自动定义和使用它,如果可能的话。

我几乎达到了预期的结果,但因为我无法改变System.env环境变量,所以我否决了。

在这个Android类com.android.build.gradle.internal.SdkHandler#findSdkLocation中,我们可以看到它是如何查找和配置android sdk位置的。

我们是否有办法在项目配置阶段开始之前设置此环境变量?

看起来它需要在我们的include(":android_project")settings.gradle.kts之前。

android gradle android-gradle environment-variables gradle-kotlin-dsl
1个回答
0
投票

我找到了一个解决方案,不确定它是否是最好的解决方案。

改变System.getenv()变量,使用这种answer的Kotlin改编形式:

@Suppress("UNCHECKED_CAST")
@Throws(Exception::class)
fun addAdditionalEnvironmentVariables(additionalEnvironmentVariables: Map<String, String>) {
    try {
        val processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment")
        val theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment")
        theEnvironmentField.isAccessible = true
        val env = theEnvironmentField.get(null) as MutableMap<String, String>
        env.putAll(additionalEnvironmentVariables)
        val theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment")
        theCaseInsensitiveEnvironmentField.isAccessible = true
        val cienv = theCaseInsensitiveEnvironmentField.get(null) as MutableMap<String, String>
        cienv.putAll(additionalEnvironmentVariables)
    } catch (e: NoSuchFieldException) {
        val classes = Collections::class.java.getDeclaredClasses()
        val env = System.getenv()
        for (cl in classes) {
            if ("java.util.Collections\$UnmodifiableMap" == cl.getName()) {
                val field = cl.getDeclaredField("m")
                field.setAccessible(true)
                val obj = field.get(env)
                val map = obj as MutableMap<String, String>
                map.clear()
                map.putAll(additionalEnvironmentVariables)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.