【问题标题】:How to define ANDROID_HOME before the project configuration phase in Android Gradle projects?如何在 Android Gradle 项目的项目配置阶段之前定义 ANDROID_HOME?
【发布时间】:2019-04-27 14:49:51
【问题描述】:

使用 Gradle 构建 Android 应用程序时,我们需要将 ANDROID_HOME 指向我们的构建。可能在local.properties 文件中使用环境变量或其他内容。

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

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

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

我们有办法在项目配置阶段开始之前设置这个环境变量吗?

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

【问题讨论】:

    标签: android gradle android-gradle-plugin environment-variables gradle-kotlin-dsl


    【解决方案1】:

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

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

    @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)
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多