Как определить ANDROID_HOME перед этапом настройки проекта в проектах Android Gradle? - PullRequest
0 голосов
/ 27 апреля 2019

При создании приложения для Android с Gradle нам нужно указать ANDROID_HOME для нашей сборки. Возможно, используется переменная окружения или что-то в файле local.properties.

Я пытаюсь найти способ автоматически определить и использовать его, если это возможно.

Я почти достиг ожидаемого результата, но поскольку я не смог изменить переменные окружения System.env, это наложило на меня вето.

В этом классе Android com.android.build.gradle.internal.SdkHandler#findSdkLocation мы можем видеть, как он находит и настраивает местоположение Android SDK.

Есть ли у нас способ установить эту переменную среды до начала фазы конфигурации проекта?

Похоже, что это должно быть до include(":android_project") в нашем settings.gradle.kts.

1 Ответ

0 голосов
/ 27 апреля 2019

Я нашел решение, но не уверен, что он лучший.

Изменение переменных System.getenv() с использованием адаптированной 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)
            }
        }
    }
}
...