Comment lire les propriétés définies dans local.properties dans build.gradle

J’ai défini sdk.dir et ndk.dir dans local.properties .

Comment lire les valeurs définies dans sdk.dir et ndk.dir dans le fichier build.gradle ?

Vous pouvez le faire de cette manière:

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

Utilisez project.rootProject si vous lisez le fichier de propriétés dans un sous-projet 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 

Si le fichier de propriétés se trouve dans le même répertoire de sous-projet, vous pouvez simplement utiliser project .

Bien que la réponse de @rciovati soit certainement correcte, il existe également une autre manière de lire les valeurs de sdk.dir et ndk.dir .

Comme indiqué dans cette entrée de blog de Gaku Ueda (Obtenir le répertoire ndk), la classe BasePlugin propose des méthodes pour getNdkFolder() et getSdkFolder() :

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

Remarque: vous devrez peut-être remplacer com.android.application par com.android.library si vous construisez une bibliothèque

C’est peut-être une façon plus élégante de lire les valeurs des dossiers. Bien qu’il faille dire que la réponse fournie par @rciovati est plus flexible, on peut lire n’importe quelle valeur dans le fichier de propriétés.

La réponse qui charge manuellement local.properties ci-dessus fonctionne bien, et la suivante qui vous oblige à savoir quel plug-in a été appliqué devrait également fonctionner.

Ces approches peuvent être un peu mieux pour certains car elles sont plus génériques car elles fonctionnent indépendamment du fait que vous utilisiez le plug-in Application, Test ou Library. Ces extraits de code vous offrent également un access complet par programme à toutes les configurations de plug-in Android (Saveurs de produits, version des outils de génération, etc.):

Si vous avez besoin d’un access à un fichier build.gradle utilisant le plug-in Android Gradle, accédez directement à Android DSL car il est désormais disponible directement:

 project.android.sdkDirectory 

La forme la plus longue (ci-dessous) est pratique si vous créez des classes ou des plug-ins Gradle personnalisés ou si vous voulez simplement voir quelles propriétés sont 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}") } Ssortingng sdkDir = androidPluginExtension.getProperties().get("sdkDirectory"); System.out.println("Using sdk dir: ${sdkDir}"); 

Au moment de cette publication, il y a aussi un bien pratique adbExe qui mérite d’être noté.

Ce code doit être exécuté APRÈS que le plug-in Android Gradle soit configuré selon le cycle de vie de Gradle. Généralement, cela signifie que vous le mettez dans la méthode d’ execute d’une Task ou que vous le placez APRÈS la déclaration DSL android dans un fichier build.gradle une application / bibliothèque build.gradle ).

Ces extraits sont accompagnés du fait que, lors de la mise à niveau des versions d’Android Gradle Plugin, ces propriétés peuvent changer lorsque le plug-in est développé. Il suffit de tester le déplacement entre les versions du plug-in Gradle et Android ainsi que d’Android Studio (parfois une nouvelle version d’Android). Studio nécessite une nouvelle version du plug-in Android Gradle).

local.properties

 default.account.iccid=123 

build.gradle –

 def Properties properties = new Properties() properties.load(project.rootProject.file("local.properties").newDataInputStream()) defaultConfig { resValue "ssortingng", "default_account_iccid", properties.getProperty("default.account.iccid", "") } 

et dans le code que vous obtenez comme une autre chaîne de ressources –

 resources.getSsortingng(R.ssortingng.default_account_iccid); 

Je pense que c’est plus élégant.

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

il fonctionne sur Android Gradle 1.5.0.

Vous pouvez envisager de nommer le fichier autrement que local.properties comme cela est déjà utilisé par Android Studio (pour le projet racine), et

vous ne devez pas modifier ce fichier manuellement ou le vérifier dans votre système de contrôle de version.