Eu configurei sdk.dir
e ndk.dir
entre local.properties
.
Como leio os valores definidos no sdk.dir
e ndk.dir
no build.gradle
arquivo?
Eu configurei sdk.dir
e ndk.dir
entre local.properties
.
Como leio os valores definidos no sdk.dir
e ndk.dir
no build.gradle
arquivo?
local.properties
esteja em uso para a configuração local do próprio Android Studio, e ter outro arquivo com o mesmo nome pode criar um pouco de confusão. Consulte stackoverflow.com/a/49306091/1587329 abaixo
android.getSdkDirectory()
simplesmente funciona.
Respostas:
Você pode fazer isso desta forma:
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir')
def ndkDir = properties.getProperty('ndk.dir')
Use project.rootProject
se estiver lendo o arquivo de propriedades em um subprojeto build.gradle
:
.
├── app
│ ├── build.gradle <-- You are reading the local.properties in this gradle build file
│ └── src
├── build.gradle
├── gradle
├── gradlew
├── gradlew.bat
├── settings.gradle
└── local.properties
Caso o arquivo de propriedades esteja no mesmo diretório do subprojeto, você pode usar apenas project
.
build.gradle
arquivo project
está uma variável que se refere ao projeto atual. Se você tiver erros estranhos, faça uma nova pergunta.
local.properties
default.account.iccid=123
build.gradle -
def Properties properties = new Properties()
properties.load(project.rootProject.file("local.properties").newDataInputStream())
defaultConfig {
resValue "string", "default_account_iccid", properties.getProperty("default.account.iccid", "")
}
e no código você o obtém como outra string de Recursos -
resources.getString(R.string.default_account_iccid);
Embora a resposta de @rciovati esteja certamente correta, também existe uma maneira alternativa de ler os valores de sdk.dir
e ndk.dir
.
Conforme apontado nesta entrada de blog por Gaku Ueda (Obtendo o diretório ndk), a BasePlugin
classe oferece métodos para getNdkFolder()
e getSdkFolder()
:
def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()
Nota: pode ser necessário alterar com.android.application
para com.android.library
se você estiver construindo uma biblioteca
Esta é talvez uma forma mais elegante de ler os valores da pasta. Embora deva ser dito que a resposta fornecida por @rciovati é mais flexível, pois é possível ler qualquer valor no arquivo de propriedades.
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
como pode ser visto aqui: stackoverflow.com/questions/28615439/…
A resposta que carrega local.properties manualmente acima obviamente funciona, e a próxima que requer que você saiba qual plugin foi aplicado deve funcionar também.
Essas abordagens podem ser um pouco melhores para alguns, já que são mais genéricas, pois funcionam independentemente de você estar usando o plugin de aplicativo, teste ou biblioteca. Esses snippets também fornecem acesso programático completo a todas as configurações do plug-in do Android (sabores do produto, versão das ferramentas de construção e muito mais):
Se você precisar acessar um arquivo build.gradle que está usando o plug-in do Android para Gradle, basta acessar o DSL do Android diretamente, pois agora está disponível diretamente:
project.android.sdkDirectory
A forma mais longa (abaixo) disso é útil se você estiver criando classes personalizadas de Tarefas do Gradle ou plug-ins ou simplesmente quiser ver quais propriedades estão disponíveis.
// def is preferred to prevent having to add a build dependency.
def androidPluginExtension = project.getExtensions().getByName("android");
// List available properties.
androidPluginExtension.properties.each { Object key, Object value ->
logger.info("Extension prop: ${key} ${value}")
}
String sdkDir = androidPluginExtension.getProperties().get("sdkDirectory");
System.out.println("Using sdk dir: ${sdkDir}");
No momento desta postagem, há também uma adbExe
propriedade útil que definitivamente vale a pena observar.
Este código deve ser executado APÓS o plug-in do Android Gradle ser configurado de acordo com o ciclo de vida do Gradle. Normalmente, isso significa que você o coloca no execute
método de a Task
ou DEPOIS da android
declaração DSL em um build.gradle
arquivo de aplicativo / bibliotecas Android ).
Esses snippets também vêm com a ressalva de que, conforme você atualiza as versões do plug-in do Android Gradle, essas propriedades podem mudar conforme o plug-in é desenvolvido, portanto, basta testar ao mover entre as versões do Gradle e do plug-in do Android Gradle, bem como do Android Studio (às vezes, uma nova versão do Android O Studio requer uma nova versão do plug-in do Android Gradle).
Acho que é uma forma mais elegante.
println "${android.getSdkDirectory().getAbsolutePath()}"
ele funciona no Android Gradle 1.5.0.
A técnica do Gradle a seguir mostra como armazenar uma propriedade em seu arquivo local.properties para que ela possa ser referenciada com segurança por seu aplicativo.
local.properties
sua nível de projeto diretório, e depois adicionar o seu imóvel como exemplo a seguir:sdk.dir=MY_SDK_DIR
build.gradle
arquivo de nível de aplicativo , adicione este código ao defaultConfig
elemento. Isso permite que o Android Studio leia a sdk.dir
propriedade do local.properties
arquivo no momento da compilação e injete a variável de compilação em seu res/gradleResVlues.xml
.Properties properties = new Properties()
if (rootProject.file("local.properties").exists()) {
properties.load(rootProject.file("local.properties").newDataInputStream())
}
resValue "string", "sdk_dir", properties.getProperty("sdk.dir", "")
getString(R.string.sdk_dir);