Como leio propriedades definidas em local.properties em build.gradle

92

Eu configurei sdk.dire ndk.direntre local.properties.

Como leio os valores definidos no sdk.dire ndk.dirno build.gradlearquivo?

Vikram
fonte
15
a verdadeira questão é: por que isso não está integrado ao plug-in gradle do Android?!?!?!?!
Armand
@Armand: talvez porque local.propertiesesteja 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
serv-inc
1
@Armand é uma pena que não tenha sido construído há 5 anos, mas depois foi adicionado: android.getSdkDirectory()simplesmente funciona.
Alex Cohn

Respostas:

141

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.rootProjectse 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.

rciovati
fonte
3
O que é "project.rootProject"?
AlexBalo
1
Adicionada uma breve explicação
rciovati
O que você quer dizer com projeto? Minha ide está me dando um erro. Como faço para obter o caminho do projeto.
AlexBalo
Dentro de um build.gradlearquivo projectestá uma variável que se refere ao projeto atual. Se você tiver erros estranhos, faça uma nova pergunta.
rciovati
Se eu copiar seu código dentro de uma classe de utilitário em app / src / main / java / my_package_name / Utils.java, ele não poderá ser resolvido. Como posso ler local.properties de uma classe Utility?
AlexBalo
26

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);
Dmitrijs
fonte
2
Essa é a resposta correta. Como não é selecionado? A resposta escolhida nem mesmo oferece uma solução ??
Joshua Pinter
10

Embora a resposta de @rciovati esteja certamente correta, também existe uma maneira alternativa de ler os valores de sdk.dire ndk.dir.

Conforme apontado nesta entrada de blog por Gaku Ueda (Obtendo o diretório ndk), a BasePluginclasse 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.applicationpara com.android.libraryse 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.

super-qua
fonte
1
Para Gradle 1.1.0, você precisa usar plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()como pode ser visto aqui: stackoverflow.com/questions/28615439/…
Stephan
1
Interrompido novamente com a mudança para o plugin "experimental" :(
Alex Cohn,
8

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 adbExepropriedade ú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 executemétodo de a Taskou DEPOIS da androiddeclaração DSL em um build.gradlearquivo 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).

PaulR
fonte
3

Acho que é uma forma mais elegante.

println "${android.getSdkDirectory().getAbsolutePath()}"

ele funciona no Android Gradle 1.5.0.

Victor Choy
fonte
0

Adicionando a propriedade

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.

  1. Abra a local.propertiessua nível de projeto diretório, e depois adicionar o seu imóvel como exemplo a seguir:
sdk.dir=MY_SDK_DIR
  1. Em seu build.gradlearquivo de nível de aplicativo , adicione este código ao defaultConfigelemento. Isso permite que o Android Studio leia a sdk.dirpropriedade do local.propertiesarquivo 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", "")
  1. Salve os arquivos e sincronize seu projeto com o Gradle.
  2. Recupere sua string usando o seguinte código
getString(R.string.sdk_dir);
G. Ciardini
fonte