Come leggo le proprietà definite in local.properties in build.gradle


89

Ho impostato sdk.dire ndk.dirdentro local.properties.

Come leggo i valori definiti nel sdk.dire ndk.dirnel build.gradlefile?


15
la vera domanda è: perché questo non è integrato nel plugin gradle di Android?!?!?!?!
Armand

@Armand: forse perché local.propertiesè in uso per la configurazione locale di Android Studio e avere un altro file con lo stesso nome potrebbe creare un po 'di confusione. Vedi stackoverflow.com/a/49306091/1587329 di seguito
serv-inc

1
@Armand è un peccato che non sia stato costruito 5 anni fa, ma in seguito è stato aggiunto: android.getSdkDirectory()funziona semplicemente.
Alex Cohn,

Risposte:


139

Puoi farlo in questo modo:

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir')
def ndkDir = properties.getProperty('ndk.dir')

Utilizzare project.rootProjectse stai leggendo il file delle proprietà in un sottoprogetto 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

Nel caso in cui il file delle proprietà si trovi nella stessa directory del sottoprogetto, è possibile utilizzare solo project.


3
Che cos'è "project.rootProject"?
AlexBalo

1
Aggiunta una breve spiegazione
rciovati

Cosa intendi per progetto? Il mio ide mi sta dando un errore. Come ottengo il percorso del progetto.
AlexBalo

All'interno di un build.gradlefile projectè presente una variabile che fa riferimento al progetto corrente. Se hai strani errori, fai una nuova domanda.
rciovati

Se copio il tuo codice all'interno di una classe di utilità in app / src / main / java / my_package_name / Utils.java non può essere risolto. Come posso leggere local.properties da una 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 nel codice lo ottieni come altra stringa da Resources -

resources.getString(R.string.default_account_iccid);

2
Questa è la risposta corretta. Come non viene selezionato? La risposta scelta non fornisce nemmeno una soluzione ??
Joshua Pinter,

10

Sebbene la risposta di @ rciovati sia certamente corretta, esiste anche un modo alternativo di leggere i valori per sdk.dire ndk.dir.

Come sottolineato in questo post di blog da Gaku Ueda (Ottenere la directory ndk), la BasePluginclasse offre metodi per getNdkFolder()e getSdkFolder():

def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()

Nota: potrebbe essere necessario passare com.android.applicationa com.android.libraryse si sta creando una libreria

Questo è forse un modo più elegante di leggere i valori della cartella. Anche se va detto che la risposta fornita da @rciovati è più flessibile, poiché si potrebbe leggere qualsiasi valore nel file delle proprietà.


1
Per Gradle 1.1.0 devi usare plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()come si può vedere qui: stackoverflow.com/questions/28615439/…
Stephan

1
Di nuovo rotto con il passaggio al plugin "sperimentale" :(
Alex Cohn

8

La risposta che carica local.properties manualmente sopra ovviamente funziona, e anche quella successiva che richiede di sapere quale plugin è stato applicato dovrebbe funzionare.

Questi approcci potrebbero essere leggermente migliori per alcuni poiché sono più generici perché funzionano indipendentemente dal fatto che tu stia utilizzando il plug-in Applicazione, Test o Libreria. Questi snippet ti danno anche pieno accesso programmatico a tutta la configurazione del plugin Android (Product Flavors, Build Tools version e molto altro):

Se è necessario accedere a un file build.gradle che utilizza il plug-in Android Gradle, è sufficiente accedere direttamente ad Android DSL poiché è ora disponibile direttamente:

project.android.sdkDirectory

La forma più lunga (sotto) è utile se stai creando classi o plug-in Gradle Tasks personalizzati o semplicemente desideri visualizzare quali proprietà sono disponibili.

// 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}");

Al momento di questo intervento c'è anche una comoda adbExeproprietà che vale sicuramente la pena notare.

Questo codice deve essere eseguito DOPO che il plug-in Android Gradle è stato configurato per Gradle livecycle. In genere questo significa che lo metti nel executemetodo di a Tasko lo inserisci DOPO la androiddichiarazione DSL in un build.gradlefile di app / librerie Android ).

Questi frammenti includono anche l'avvertenza che quando aggiorni le versioni del plug-in Android Gradle queste proprietà possono cambiare man mano che il plug-in viene sviluppato, quindi prova semplicemente quando ti sposti tra le versioni del plug-in Gradle e Android Gradle e Android Studio (a volte una nuova versione di Android Studio richiede una nuova versione del plug-in Android Gradle).


3

Penso che sia un modo più elegante.

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

funziona su Android Gradle 1.5.0.


1

Ho impostato sdk.dire ndk.dirdentro local.properties.

Potresti riconsiderare se desideri impostare manualmente i valori in local.propertiesquanto è già in uso da Android Studio (per il progetto radice) e

non dovresti modificare questo file manualmente o archiviarlo nel tuo sistema di controllo della versione.

ma vedi l'esenzione specifica su cmake elencata nei commenti.


Al contrario: il file è gestito da Android Studio, ea volte è bello leggerne il contenuto. Fortunatamente, ora è supportato:android.getSdkDirectory()
Alex Cohn

@ AlexCohn: certo, la lettura suona bene. La risposta riguarda solo l'impostazione manuale dei valori. Si spera che sia più chiaro ora.
serv-inc

Anche la manipolazione manuale di local.propertiesè legittima. Vedi developer.android.com/studio/projects/… : Google consiglia di aggiungere cmake.dir="path-to-cmake"per sovrascrivere il comportamento di ricerca predefinito.
Alex Cohn

@AlexCohn: come una scelta. Con l'avvertenza If you set this property, Gradle no longer uses PATH to find CMake.. Allora qual è la tua opinione? Mi consigliate di usarlo o semplicemente accennate al fatto che in alcuni casi può essere modificato? Cioè: questo NON DOVREBBE è come in RFC2119 : provare a farlo in questo modo a meno che non ci siano buone ragioni?
serv-inc

1
Interpreto questa frase in modo diverso. "Gradle non usa più PATH per trovare CMake" è lo scopo documentato dell'aggiunta cmake.dira local.properties , non un avvertimento o un effetto collaterale di fare qualcosa di pericoloso. Non sono io, è Google che consiglia di usarlo, quando c'è una buona ragione (cioè, se non vuoi che Gradle usi PATH per trovare CMake).
Alex Cohn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.