使用Gradle构建Android应用程序时,我们需要将ANDROID_HOME
指向我们的构建版本。也许在local.properties
文件中使用环境变量或其他东西。
我试图找到一种方法来自动定义和使用它,如果可能的话。
我几乎达到了预期的结果,但因为我无法改变System.env
环境变量,所以我否决了。
在这个Android类com.android.build.gradle.internal.SdkHandler#findSdkLocation
中,我们可以看到它是如何查找和配置android sdk位置的。
我们是否有办法在项目配置阶段开始之前设置此环境变量?
看起来它需要在我们的include(":android_project")
的settings.gradle.kts
之前。
我找到了一个解决方案,不确定它是否是最好的解决方案。
改变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)
}
}
}
}