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?
android
android-gradle-plugin
Vikram
fuente
fuente
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ónandroid.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 subproyectobuild.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
.fuente
build.gradle
archivoproject
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);
fuente
Aunque la respuesta de @ rciovati es ciertamente correcta, también hay una forma alternativa de leer los valores de
sdk.dir
yndk.dir
.Como se señaló en esta entrada de blog de Gaku Ueda (Obtener directorio ndk), la
BasePlugin
clase ofrece métodos paragetNdkFolder()
ygetSdkFolder()
: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
acom.android.library
si está construyendo una bibliotecaEsta 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.
fuente
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 aTask
o lo coloca DESPUÉS de laandroid
declaración DSL en unbuild.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).
fuente
Creo que es una forma más elegante.
println "${android.getSdkDirectory().getAbsolutePath()}"
Funciona en Android Gradle 1.5.0.
fuente
Puede reconsiderar si desea establecer valores manualmente,
local.properties
ya que Android Studio ya lo usa (para el proyecto raíz), ypero vea la exención específica sobre cmake listada en los comentarios.
fuente
android.getSdkDirectory()
local.properties
es legítima. Consulte developer.android.com/studio/projects/… : Google recomienda agregarcmake.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).