Ho impostato sdk.dir
e ndk.dir
dentro local.properties
.
Come leggo i valori definiti nel sdk.dir
e ndk.dir
nel build.gradle
file?
Ho impostato sdk.dir
e ndk.dir
dentro local.properties
.
Come leggo i valori definiti nel sdk.dir
e ndk.dir
nel build.gradle
file?
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
android.getSdkDirectory()
funziona semplicemente.
Risposte:
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.rootProject
se 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
.
build.gradle
file project
è presente una variabile che fa riferimento al progetto corrente. Se hai strani errori, fai una nuova domanda.
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);
Sebbene la risposta di @ rciovati sia certamente corretta, esiste anche un modo alternativo di leggere i valori per sdk.dir
e ndk.dir
.
Come sottolineato in questo post di blog da Gaku Ueda (Ottenere la directory ndk), la BasePlugin
classe 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.application
a com.android.library
se 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à.
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
come si può vedere qui: stackoverflow.com/questions/28615439/…
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 adbExe
proprietà 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 execute
metodo di a Task
o lo inserisci DOPO la android
dichiarazione DSL in un build.gradle
file 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).
Penso che sia un modo più elegante.
println "${android.getSdkDirectory().getAbsolutePath()}"
funziona su Android Gradle 1.5.0.
Ho impostato
sdk.dir
endk.dir
dentrolocal.properties
.
Potresti riconsiderare se desideri impostare manualmente i valori in local.properties
quanto è 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.
android.getSdkDirectory()
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.
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?
cmake.dir
a 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).