Me he puesto sdk.dir
y ndk.dir
entrado local.properties
.
¿Cómo leo los valores definidos en sdk.dir
y ndk.dir
en el build.gradle
archivo?
Me he puesto sdk.dir
y ndk.dir
entrado local.properties
.
¿Cómo leo los valores definidos en sdk.dir
y ndk.dir
en el build.gradle
archivo?
local.properties
está en uso para la propia configuración local de Android Studio, y tener otro archivo con el mismo nombre podría crear un poco de confusión. Consulte stackoverflow.com/a/49306091/1587329 a continuación
android.getSdkDirectory()
simplemente funciona.
Respuestas:
Puedes hacerlo de esta manera:
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir')
def ndkDir = properties.getProperty('ndk.dir')
Úselo project.rootProject
si está leyendo el archivo de propiedades en un subproyecto 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
En caso de que el archivo de propiedades esté en el mismo directorio de subproyecto, puede usar solo project
.
build.gradle
archivo project
hay una variable que se refiere al proyecto actual. Si tiene errores extraños, haga una nueva pregunta.
propiedades.locales
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", "")
}
y en el código lo obtienes como otra cadena de Resources -
resources.getString(R.string.default_account_iccid);
Aunque la respuesta de @ rciovati es ciertamente correcta, también hay una forma alternativa de leer los valores de sdk.dir
y ndk.dir
.
Como se señaló en esta entrada de blog de Gaku Ueda (Obtener directorio ndk), la BasePlugin
clase ofrece métodos para getNdkFolder()
y getSdkFolder()
:
def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()
Nota: es posible que deba cambiar com.android.application
a com.android.library
si está construyendo una biblioteca
Esta es quizás una forma más elegante de leer los valores de la carpeta. Aunque hay que decir que la respuesta proporcionada por @rciovati es más flexible, ya que se puede leer cualquier valor en el archivo de propiedades.
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()
como se puede ver aquí: stackoverflow.com/questions/28615439/…
La respuesta que carga local.properties manualmente arriba obviamente funciona, y la siguiente que requiere que sepa qué complemento se aplicó debería funcionar también.
Estos enfoques pueden ser un poco mejores para algunos, ya que son más genéricos porque funcionan independientemente de si está utilizando el complemento Aplicación, Prueba o Biblioteca. Estos fragmentos también le brindan acceso programático completo a todas las configuraciones de complementos de Android (tipos de productos, versión de herramientas de compilación y mucho más):
Si necesita acceso en un archivo build.gradle que usa el complemento Gradle de Android, simplemente acceda al DSL de Android directamente, ya que ahora está disponible directamente:
project.android.sdkDirectory
La forma más larga (a continuación) de esto es útil si está creando clases o complementos personalizados de Gradle Tasks o simplemente desea ver qué propiedades están disponibles.
// 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}");
En el momento de esta publicación también hay una adbExe
propiedad útil que definitivamente vale la pena señalar.
Este código debe ejecutarse DESPUÉS de que el complemento Gradle de Android esté configurado según el ciclo de vida de Gradle. Por lo general, esto significa que lo coloca en el execute
método de a Task
o lo coloca DESPUÉS de la android
declaración DSL en un build.gradle
archivo de aplicación / biblioteca de Android ).
Estos fragmentos también vienen con la advertencia de que a medida que actualiza las versiones del complemento de Gradle de Android, estas propiedades pueden cambiar a medida que se desarrolla el complemento, así que simplemente pruebe cuando se mueva entre las versiones de Gradle y el complemento de Gradle de Android, así como Android Studio (a veces una nueva versión de Android Studio requiere una nueva versión del complemento Gradle de Android).
Creo que es una forma más elegante.
println "${android.getSdkDirectory().getAbsolutePath()}"
Funciona en Android Gradle 1.5.0.
Me he puesto
sdk.dir
yndk.dir
entradolocal.properties
.
Puede reconsiderar si desea establecer valores manualmente, local.properties
ya que Android Studio ya lo usa (para el proyecto raíz), y
no debe modificar este archivo manualmente ni registrarlo en su sistema de control de versiones.
pero vea la exención específica sobre cmake listada en los comentarios.
android.getSdkDirectory()
local.properties
es legítima. Consulte developer.android.com/studio/projects/… : Google recomienda agregar cmake.dir="path-to-cmake"
para anular el comportamiento de búsqueda predeterminado.
If you set this property, Gradle no longer uses PATH to find CMake.
. Entonces, ¿cuál es tu opinión al respecto? ¿Recomiendas usarlo o simplemente mencionas que se puede alterar en algunos casos? Es decir: esto NO DEBE ser como en RFC2119 : intente hacerlo de esa manera a menos que haya buenas razones.
cmake.dir
a local.properties , no una advertencia o efecto secundario de hacer algo peligroso. No soy yo, es Google quien recomienda usarlo, cuando hay una buena razón (es decir, si no desea que Gradle use PATH para encontrar CMake).