dev
DEMEY Fanny 2024-02-09 10:24:42 +01:00
parent 0cab6b3d21
commit a1d8f69f26
21 changed files with 69 additions and 86 deletions

View File

@ -47,20 +47,29 @@ N'hésitez pas à lire [le guide des contributeurs](CONTRIBUTING.md).
* [avoriser les polices standards ou utiliser les "Downloadable font"](chapters/MBP_030_fr.md) * [avoriser les polices standards ou utiliser les "Downloadable font"](chapters/MBP_030_fr.md)
* [Éliminer les fonctionnalités non utilisées](chapters/MBP_031_fr.md) * [Éliminer les fonctionnalités non utilisées](chapters/MBP_031_fr.md)
* [Limiter les outils d'analytics et les données collectées](/chapters/MBP_032_fr.md) * [Limiter les outils d'analytics et les données collectées](/chapters/MBP_032_fr.md)
* [Utiliser la version la plus récente du langage et du SDK Android](chapters/MBP_033_fr.md) * [Utiliser la version la plus récente du langage (Kotlin/Java) et du SDK Android](chapters/MBP_033_fr.md)
* [Entretenir son application régulièrement](chapters/MBP_034_fr.md) * [Entretenir son application régulièrement](chapters/MBP_034_fr.md)
* [Fournir une alternative textuelle aux contenus multimédias](chapters/MBP_035_fr.md) * [Fournir une alternative textuelle aux contenus multimédias](chapters/MBP_035_fr.md)
* [Éviter la lecture et le chargement automatique des vidéos et des sons](chapters/MBP_035_fr.md) * [Éviter la lecture et le chargement automatique des vidéos et des sons](chapters/MBP_035_fr.md)
* // TODO : à écrire * // TODO : à écrire
// MAIN/IO thread ? // MAIN/IO thread ?
// Notifications // Notifications
// ABI ?? // ABI ??
// Feature play store // Feature play store
// Utiliser correctement implementation testImplementation debugImplementation pour ne pas packager des librairies utilisées uniquement pour les tests ou le debug // Utiliser correctement implementation testImplementation debugImplementation pour ne pas packager des librairies utilisées uniquement pour les tests ou le debug
// Reduce cost of inflation (ex ConstraintLayout instead of nested LinearLayout) https://developer.android.com/topic/performance/vitals/render#recyclerview_too_much_inflation_or_create_is_taking_too_long If your view types look good, look at reducing the cost of your inflation. Reducing unnecessary container and structural views can help. Consider building itemViews with ConstraintLayout, which can help reduce structural views. // Reduce cost of inflation (ex ConstraintLayout instead of nested LinearLayout) https://developer.android.com/topic/performance/vitals/render#recyclerview_too_much_inflation_or_create_is_taking_too_long If your view types look good, look at reducing the cost of your inflation. Reducing unnecessary container and structural views can help. Consider building itemViews with ConstraintLayout, which can help reduce structural views.
// TODO pas encore fait mais applicable au mobile // TODO pas encore fait mais applicable au mobile
* Monitorer la taille de l'application dans le temps (ex d'outil : https://github.com/JakeWharton/diffuse + le playstore)
* [Utiliser la délégation d'évènements](/chapters/BP_044_fr.md) * [Utiliser la délégation d'évènements](/chapters/BP_044_fr.md)
* [Optimiser les PDF](/chapters/BP_108_fr.md) // proposer le téléchargement de PDF plutôt que d'inclure un viewer de PDF (=> lib en moins, visibilité de toute façon inadaptée au mobile, peu accessible, personnes ont déjà une app permettant de lire les PDF) * [Optimiser les PDF](/chapters/BP_108_fr.md) // proposer le téléchargement de PDF plutôt que d'inclure un viewer de PDF (=> lib en moins, visibilité de toute façon inadaptée au mobile, peu accessible, personnes ont déjà une app permettant de lire les PDF)
* [Adapter les sons/vidéo aux contextes d'écoute](/chapters/BP_112_fr.md) // et 114 * [Adapter les sons/vidéo aux contextes d'écoute](/chapters/BP_112_fr.md) // et 114

View File

@ -95,7 +95,7 @@ sealed interface ProfileUIState {
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|----------------------------------------------------------------------------------------------------|:-----------------------:| |-----------------------------------------------------------------------------------------------------|:-----------------------:|
| d'écran effectuant des chargements de données à chaque fois que la vue passe dans l'état `RESUMED` | 0% | | d'écrans effectuant des chargements de données à chaque fois que la vue passe dans l'état `RESUMED` | 0 |
| d'écran rechargeant l'ensemble des données lors d'un changement de configuration | 0% | | d'écrans rechargeant l'ensemble des données lors d'un changement de configuration | 0 |
| d'écran n'utilisant pas de ViewModel ou équivalent pour maintenir l'état de la vue plus longtemps | 0% | | d'écrans n'utilisant pas de ViewModel ou équivalent pour maintenir l'état de la vue plus longtemps | 0 |

View File

@ -22,7 +22,7 @@
### Description ### Description
Lorsqu'une personne navigue entre plusieurs applications sur son mobile, ces applications basculent entre premier plan et arrière-plan. Lorsqu'une application qui effectue un traitement consommateur en mémoire passe en arrière-plan, il convient de s'appuyer sur son cycle de vie pour réduire l'impact de ce traitement sur la batterie du téléphone. Lorsqu'une personne navigue entre plusieurs applications sur son mobile, les applications basculent entre premier plan et arrière-plan. Lorsqu'une application qui effectue un traitement consommateur en mémoire passe en arrière-plan, il convient de s'appuyer sur son cycle de vie pour réduire l'impact de ce traitement sur la batterie du téléphone.
* Dans la fonction `onPause`, l'activité est toujours visible à l'écran, mais l'utilisateur ne peut plus interagir avec. * Dans la fonction `onPause`, l'activité est toujours visible à l'écran, mais l'utilisateur ne peut plus interagir avec.
- Dans la fonction `onStop`, l'activité n'est plus visible. - Dans la fonction `onStop`, l'activité n'est plus visible.
@ -41,6 +41,6 @@ Quelques exemples de traitements consommateurs :
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------:| |-----------------------------------------------------------------------------------------------------------|:-----------------------:|
| de traitement lourds pour lesquels la mémoire n'est pas libéré dans les fonctions `onPause` ou `onStop` | 0% | | de traitements lourds pour lesquels la mémoire n'est pas libérée dans les fonctions `onPause` ou `onStop` | 0 |

View File

@ -22,11 +22,11 @@
### Description ### Description
Un Android App Bundle (AAB) contient tout le code compilé et les ressources d'une application, mais délègue au Google Play Store la responsabilité de générer et signer l'APK qui sera installé sur l'appareil de l'utilisateur. Celui-ci optimise ainsi l'APK en n'y incluant que les ressources nécessaires selon la configuration de l'appareil. Cela permet de réduire considérablement la taille de l'application. Or la taille d'une application a un impact sur sa vitesse de chargement la quantité de mémoire qu'elle utilise et sa consommation de la batterie. Un Android App Bundle (AAB) contient tout le code compilé et les ressources d'une application, mais délègue au Google Play Store la responsabilité de générer et signer l'APK qui sera installé sur l'appareil de l'utilisateur. Celui-ci optimise ainsi l'APK en n'y incluant que les ressources nécessaires selon la configuration de l'appareil. Cela permet de réduire considérablement la taille de l'application. Or la taille d'une application a un impact sur sa vitesse de chargement, la quantité de mémoire qu'elle utilise et sa consommation de la batterie.
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|---------------|:-------------------------:| |----------------------------------------|:-------------------------:|
| d'APK déployé | 0 | | d'APK déployé sans passer par un 'store' | 0 |

View File

@ -35,5 +35,5 @@ res/layout/item_row.xml: Warning: The resource R.layout.item_row appears
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|-----------------------------------------------|:-------------------------:| |------------------------------------------------|:-------------------------:|
| de fichier non utilisé dans le package final | 0 | | de fichiers non utilisés dans le package final | 0 |

View File

@ -29,7 +29,7 @@ Sur Android, cet outil se décompose en quatre processus :
3. L'obfuscation. Ce processus réduit le nom des classes et de ses membres, augmentant la sécurité et réduisant par la même occasion la taille des fichiers. Par exemple la classe : `com.monpackage.MaClass` devient une fois compilée : `a.a.B`. (paramètre `isMinifyEnabled`). 3. L'obfuscation. Ce processus réduit le nom des classes et de ses membres, augmentant la sécurité et réduisant par la même occasion la taille des fichiers. Par exemple la classe : `com.monpackage.MaClass` devient une fois compilée : `a.a.B`. (paramètre `isMinifyEnabled`).
4. La suppression des ressources non utilisées dans notre code appelé aussi "Ressource shrinking" (paramètre `isShrinkResources`). Ce processus ne s'applique que si le paramètre `isMinifyEnabled` est activé. 4. La suppression des ressources non utilisées dans notre code appelé aussi "Ressource shrinking" (paramètre `isShrinkResources`). Ce processus ne s'applique que si le paramètre `isMinifyEnabled` est activé.
Pour activer et configurer ces processus, il faut activer les paramètres `isShrinkResources` et `isMinfyEnabled` dans le fichier Gradle de l'application, dans les paramètres du build qui sera déployé. Au-delà de ses paramètres, il faut ensuite spécifier les processus doivent s'appliquer et sur quelles classes dans le fichier `proguard-rules.pro` du projet. Pour activer et configurer ces processus, il faut activer les paramètres `isShrinkResources` et `isMinfyEnabled` dans le fichier Gradle de l'application, dans les paramètres du build qui sera déployé. Au-delà de ses paramètres, il faut ensuite spécifier les processus qui doivent s'appliquer et sur quelles classes dans le fichier `proguard-rules.pro` du projet.
Cette pratique permet généralement de réduire la taille finale de l'application de moitié. Cette pratique permet généralement de réduire la taille finale de l'application de moitié.
@ -61,4 +61,4 @@ android {
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|-----------------------------------|:-----------------------:| |-----------------------------------|:-----------------------:|
| de fichiers non minifiés | 25 | | de fichiers non minifiés | 25% |

View File

@ -24,7 +24,9 @@
### Description ### Description
Ne pas redimensionner les images côté application. Cette approche impose en effet de transférer ces images dans leur taille originale, gaspillant ainsi de la bande passante et des cycles CPU. Lorsque le serveur fourni à l'application des images à afficher, ne pas redimensionner les images côté application. Cette approche impose en effet de transférer ces images dans leur taille originale, gaspillant ainsi de la bande passante et des cycles CPU.
Note : Si l'image à afficher est statique (c'est-à-dire qu'elle ne dépend pas de la donnée fournie par le serveur et qu'elle ne change pas dans le temps), il est encore mieux de directement l'inclure dans le code de l'application. Il convient alors de choisir un [format adéquat](MBP_012_fr.md) et de dimensionner cette image au plus juste.
### Exemple ### Exemple

View File

@ -27,7 +27,7 @@ Par ailleurs, avec la multiplication des terminaux, des tailles décran et l
doit être privilégiée par rapport à des images matricielles. doit être privilégiée par rapport à des images matricielles.
Grâce à cette bonne pratique, linterface est indépendante de la résolution de lécran. On limite donc aussi la dette technique. Grâce à cette bonne pratique, linterface est indépendante de la résolution de lécran. On limite donc aussi la dette technique.
La première règle consiste à remplacer les images matricielles (GIF, PNG, JPEG, WebP, etc.) par des images vectoriels (SVG), ou des icônes inclues dans la police de caractères. La première règle consiste à remplacer les images matricielles (GIF, PNG, JPEG, WebP, etc.) par des images vectoriels (SVG), ou des icônes inclues dans la police de caractères.
Sil nest pas possible dutiliser ce format, il convient de convertir a minima les images de type GIF, PNG et JPEG en image de type WebP. En effet, ce dernier offre une compression meilleure et supporte également la gestion de transparence depuis Android 4.3 (API Level 18). Sil nest pas possible dutiliser ce format, il convient de convertir au moins les images de type GIF, PNG et JPEG en image de type WebP. En effet, ce dernier offre une compression meilleure et supporte également la gestion de transparence depuis Android 4.3 (API Level 18).
Android Studio permet de transformer rapidement des images de type PNG ou JPEG en format WebP. Il suffit de faire clic droit sur le fichier de l'image ou un répertoire contenant plusieurs images, et sélectionner "Convert to WebP". Android Studio permet de transformer rapidement des images de type PNG ou JPEG en format WebP. Il suffit de faire clic droit sur le fichier de l'image ou un répertoire contenant plusieurs images, et sélectionner "Convert to WebP".

View File

@ -35,5 +35,5 @@ Pour la même raison, avec Jetpack Compose, il ne faut pas envelopper un lazy la
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|-----------------------------------------------------------|:-------------------------:| |-------------------------------------------------------------|:-----------------------:|
| d'écran défilable n'utilisant pas le chargement paresseux | 0% | | d'écrans défilables n'utilisant pas le chargement paresseux | 0 |

View File

@ -25,7 +25,7 @@
Il existe beaucoup d'applications qui affichent une liste verticale contenant plusieurs listes horizontales. Par exemple l'application du Play Store, ou encore des applications de streaming de vidéo comme Netflix. Ce type de design fonctionne très bien d'un point de vue UX, mais cela represente beaucoup de vues dans tous les sens. Il existe beaucoup d'applications qui affichent une liste verticale contenant plusieurs listes horizontales. Par exemple l'application du Play Store, ou encore des applications de streaming de vidéo comme Netflix. Ce type de design fonctionne très bien d'un point de vue UX, mais cela represente beaucoup de vues dans tous les sens.
Avec le UI Toolkit original, par défaut, chaque liste horizontale a sa propre `RecycledViewPool`. Une optimisation pouvant réduire l'usage de la mémoire consiste à partager le `RecycledViewPool` entre ces listes horizontal si elles affichent des vues similaires. Avec le UI Toolkit original, par défaut, chaque liste horizontale a sa propre `RecycledViewPool`. Une optimisation pouvant réduire l'usage de la mémoire consiste à partager le `RecycledViewPool` entre ces listes horizontal si elles affichent des vues similaires.
Un autre bonne pratique consiste à limiter le nombre d'éléments qui sont préchargées pour chaque liste horizontale appartenant à la liste verticale. Par exemple si visuellement pour une liste horizontale, nous avons toujours 3,5 éléments visible à l'écran, nous pouvons appliquer sur le `LinearLayoutManager` de la liste horizontale `setInitialItemPrefetchCount(4)`. Cela permet ainsi d'indiquer à la liste verticale que dès qu'une nouvelle liste horizontale apparait à l'écran, il faut charger les 4 premiers éléments de la liste, permettant de soulager la mémoire utilisée à ce stade. Un autre bonne pratique consiste à limiter le nombre d'éléments qui sont préchargés pour chaque liste horizontale appartenant à la liste verticale. Par exemple si visuellement pour une liste horizontale, nous avons toujours 3 éléments et demi visible à l'écran, nous pouvons appliquer sur le `LinearLayoutManager` de la liste horizontale `setInitialItemPrefetchCount(4)`. Cela permet ainsi d'indiquer à la liste verticale que dès qu'une nouvelle liste horizontale apparait à l'écran, il faut charger les 4 premiers éléments de la liste, permettant de soulager la mémoire utilisée à ce stade.
### Exemple ### Exemple
@ -54,5 +54,5 @@ Source : [Developer Android - Nested Recyclerviews](https://developer.android.co
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|-----------------------------------------------------------|:-------------------------:| |-------------------------------------------------------------|:------------------------:|
| d'écran défilable n'utilisant pas le chargement paresseux | 0% | | d'écrans défilables n'utilisant pas le chargement paresseux | 0 |

View File

@ -22,7 +22,7 @@
### Description ### Description
Les animations peuvent être très coûteuses en termes de cycles CPU et de consommation mémoire, car elle déclanche une phase de "Re-draw" voir de "Re-layout" à chaque frame (soit environ 50 fois par ms). Les animations peuvent être très coûteuses en termes de cycles CPU et de consommation mémoire, car elles déclenchent une phase de "Re-draw" voir de "Re-layout" à chaque frame (soit environ 50 fois par ms).
. Il faut donc éviter au maximum les animations, et ne les utiliser que lorsquelles sont indispensables. . Il faut donc éviter au maximum les animations, et ne les utiliser que lorsquelles sont indispensables.
Si vous ne pouvez pas vous passer dune animation, limitez-vous à l'animation de propriétés necessitant de ré-éxecuter uniquement la phase "Drawing". Par exemple : `alpha`, `translation`, `rotation`, `color`. A l'inverse, éviter l'animation de propriété nécessitant de ré-executer en plus la phase de "Layout". Par exemple : `padding`, `height`, `width`. Si vous ne pouvez pas vous passer dune animation, limitez-vous à l'animation de propriétés necessitant de ré-éxecuter uniquement la phase "Drawing". Par exemple : `alpha`, `translation`, `rotation`, `color`. A l'inverse, éviter l'animation de propriété nécessitant de ré-executer en plus la phase de "Layout". Par exemple : `padding`, `height`, `width`.

View File

@ -22,9 +22,7 @@
Au cours de la vie d'un projet, il peut arriver qu'une dépendance à une bibliothèque reste présente alors que celle-ci n'est plus du tout utilisée dans le code. Il convient de la supprimer. Au cours de la vie d'un projet, il peut arriver qu'une dépendance à une bibliothèque reste présente alors que celle-ci n'est plus du tout utilisée dans le code. Il convient de la supprimer.
Pour cela, il existe plusieurs outils. Par exemple : Pour cela, il existe plusieurs outils. Par exemple :
* [Fair gradle analysis](https://plugins.gradle.org/plugin/com.faire.gradle.analyze)
* [Autonomous App - Dependency Analysis Gradle Plugin](https://github.com/autonomousapps/dependency-analysis-gradle-plugin) * [Autonomous App - Dependency Analysis Gradle Plugin](https://github.com/autonomousapps/dependency-analysis-gradle-plugin)
* [Nebula - Gradle Lint Plugin](https://github.com/nebula-plugins/gradle-lint-plugin/wiki/Unused-Dependency-Rule)
À noter que cette pratique n'a peu de sens en terme d'optimisation de la taille de l'application si la bonne pratique [Minifier le code](MBP_010_fr.md) est déjà appliquée sur le projet. Cependant, elle a le mérite d'améliorer la maintenabilité du code permettant la gestion des dépendances de l'application. À noter que cette pratique n'a peu de sens en terme d'optimisation de la taille de l'application si la bonne pratique [Minifier le code](MBP_010_fr.md) est déjà appliquée sur le projet. Cependant, elle a le mérite d'améliorer la maintenabilité du code permettant la gestion des dépendances de l'application.

View File

@ -42,6 +42,8 @@ Stabilité des paramètres :
L'outil [Compose Compiler Report](https://developer.android.com/jetpack/compose/performance/stability/diagnose#compose-compiler) permet d'obtenir facilement un rapport analysant la stabilité des fonctions Composable d'un projet Android. L'outil [Compose Compiler Report](https://developer.android.com/jetpack/compose/performance/stability/diagnose#compose-compiler) permet d'obtenir facilement un rapport analysant la stabilité des fonctions Composable d'un projet Android.
Il peut être intéressant de mener ce genre d'analyse sur les fonctions Composable les plus riches d'une application.
### Exemple ### Exemple
Pour améliorer la "skipabilité" d'une fonction Composable et ainsi ne pas trop sollicité le processeur, il faut : Pour améliorer la "skipabilité" d'une fonction Composable et ainsi ne pas trop sollicité le processeur, il faut :
@ -68,5 +70,5 @@ data class LogEntry {
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|-------------------|:-------------------------:| |-------------------------------------------------------------------------------------------|:-----------------------:|
| de modifications n'affectant pas le layout et occasionnant un repaint (ex: color, background, visibility) | 1 | | Fonctions Composables riches dans l'application dont la skipabilité n'a pas été optimisée | 40% |

View File

@ -30,20 +30,7 @@ Un pixel a l'écran peut être dessiné ("Draw") plusieurs fois durant le proces
### Exemple ### Exemple
* Pour afficher un texte en gris, plutôt que de définir la couleur de la `TextView` en noir, et de lui appliquer un alpha * Pour afficher un texte en gris, plutôt que de définir la couleur du composant `TextView` en noir, et de lui appliquer un niveau de transparence via le paramètre `alpha`, définir plutôt la couleur du texte en gris directement.
For example, you can get gray text by drawing black text in a TextView with a translucent alpha value set on it. However, you can get the same effect with better performance by drawing the text in gray.
A pixel on the screen can be drawn multiple times during the process of showing the exact layout of the UI in a frame, These multiple draws on pixel called as overdraw, represented in four stages which are 1x, 2x, 3x and 4x. It doesnt mean that x number of nested view groups will cause x number of overdraws. In other words, we may have a complicated nested view group, but there may be no overdraws at all. It is not about the nested view groups but the pixel that is used to draw the UI element. If a pixel is drawn for the first time we call it a “true color”, if the same pixel is drawn the second time, it is called as 1x overdraw. As many times as a pixel has drawn on top of an existing pixel, that many overdraws are made. So drawing it 1 time after the original drawing means the UI has 1x overdraws, 2 times means 2x overdraws and so on. Overdraw is unavoidable sometimes, but it has to be kept at a minimum.
Le repaint est le changement dapparence dun élément du DOM (Document Object Model), tandis que le reflow est le changement/recalcul de la position des éléments dans le DOM. Ces deux opérations sont coûteuses en ressources, notamment en cycles CPU : il faut donc éviter de les déclencher.
### Exemple
Pour éviter les repaint, ne pas modifier les propriétés stylistiques dun élément (couleur de fond, style de bordure, couleur du texte, taille, etc.).
Pour éviter les reflow, limiter les changements de propriétés de position, de dimension, de type de positionnement, de contenu, etc. Cette suggestion est notamment valable pour certains éléments HTML tels que les tables, dont le reflow peut nécessiter jusquà trois fois plus de temps quun élément équivalent avec un block display.
Pour aller plus loin : Pour aller plus loin :
https://developers.google.com/speed/articles/reflow https://developers.google.com/speed/articles/reflow

View File

@ -36,6 +36,6 @@ Si une requête retourne une liste de noms de villes ou de noms de contacts, il
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le pourcentage ... | est inférieur ou égal à |
|--------------------------------------------------------|:-----------------------:| |------------------------------------------------------------|:-----------------------:|
| de réponse du serveur non mis en base de données local | 20% | | de réponses du serveur non mises en base de données locale | 20% |

View File

@ -31,5 +31,5 @@ Lorsque le serveur fourni à l'application des images à afficher, les mettre en
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|-----------------------------------------------------|:-------------------------:| |--------------------------------------------------------|:-----------------------:|
| d'image obtenue par le serveur et non mise en cache | 0 | | d'images obtenues par le serveur et non mises en cache | 0 |

View File

@ -28,7 +28,7 @@ Remarque : En livrant l'application au format AAB (Android App Bundle), par déf
Pour inclure uniquement les fichiers de langues que supporte l'application, il faut le spécifier dans le fichier gradle de l'application. Par exemple, pour inclure uniquement l'anglais et le français : Pour inclure uniquement les fichiers de langues que supporte l'application, il faut le spécifier dans le fichier gradle de l'application. Par exemple, pour inclure uniquement l'anglais et le français :
```kt ```kotlin
android { android {
defaultConfig { defaultConfig {
... ...
@ -37,26 +37,11 @@ android {
``` ```
For example, if you are using a library that includes language resources (such as AppCompat or Google Play Services), then your app includes all translated language strings for the messages in those libraries whether the rest of your app is translated to the same languages or not. If you'd like to keep only the languages that your app officially supports, you can specify those languages using the resConfig property. Any resources for languages not specified are removed.
The following snippet shows how to limit your language resources to just English and French:
Kotlin
Groovy
android {
defaultConfig {
...
resourceConfigurations.addAll(listOf("en", "fr"))
}
}
### Exemple ### Exemple
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le nombre ... | est inférieur ou égal à |
|------------------------------------------------------------------------------|:-------------------------:| |-------------------------------------------------------------------------------|:-------------------------:|
| de fichiers de ressources contenant des traductions de langues non supportée | 0 | | de fichiers de ressources contenant des traductions de langues non supportées | 0 |

View File

@ -22,7 +22,7 @@
### Description ### Description
Plutôt que d'inclure les fichiers définissant une police d'écriture au sein de l'application, préférer la police standard Roboto, car est est déjà présente sur l'appareil de lutilisateur. Plutôt que d'inclure les fichiers définissant une police d'écriture au sein de l'application, préférer la police standard Roboto, car elle est déjà présente sur l'appareil de lutilisateur.
On limite ainsi la taille de l'application. On limite ainsi la taille de l'application.
Cependant si vous avez besoin d'une police particulière pour votre application, vous pouvez : Cependant si vous avez besoin d'une police particulière pour votre application, vous pouvez :
@ -38,8 +38,8 @@ Cependant si vous avez besoin d'une police particulière pour votre application,
Voici un tableau comparatif de poids des fonts de la police Oswald : Voici un tableau comparatif de poids des fonts de la police Oswald :
| | Regular | Regular + bold | Variable | Latin Regular | Latin Regular + Latin Bold | Latin Variable | | | Regular | Regular + bold | Variable | Latin Regular | Latin Regular + Latin Bold | Latin Variable |
|---:| :---------------: |:---------------:|:------------:| :-----:| :-----:| :-----:| |------:|:-------:|:--------------:|:--------:|:-------------:|:--------------------------:|:--------------:|
|Poids|37.6kb|76.9kb|66kb|16kb|32.5kb| ? | Poids | 37.6kb | 76.9kb | 66kb | 16kb | 32.5kb | ? |
Aller plus loin : Aller plus loin :

View File

@ -42,6 +42,6 @@ Une application de type e-commerce utilise deux listes différentes : liste de c
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égale à | | Le pourcentage ... | est inférieur ou égale à |
|-------------------|:-------------------------:| |-----------------------------------------------------------|:------------------------:|
| de fonctionnalités peu utilisées présentent en production | 10% | | de fonctionnalités peu utilisées présentent en production | 10% |

View File

@ -1,4 +1,4 @@
## Utiliser la version la plus récente du langage et du SDK Android ## Utiliser la version la plus récente du langage Kotlin et du SDK Android
### Identifiants ### Identifiants
@ -22,9 +22,9 @@
### Description ### Description
Le langage Kotlin est régulièrement améliorés. Chaque nouvelle apporte son lot de gain en termes de performances, de gestion mémoire, de stabilité et comble des failles de sécurité. Il est donc conseillé en règle générale d'utiliser la version la plus récente du langage pour bénéficier de ses apports. Le langage Kotlin est régulièrement amélioré. Chaque nouvelle version apporte son lot de gain en termes de performances, de gestion mémoire, de stabilité et comble des failles de sécurité. Il est donc conseillé en règle générale d'utiliser la version la plus récente du langage pour bénéficier de ses apports.
De la même façon chaque nouvelle version d'Android introduit des améliorations en terme de sécurité et performance. Certaines de ces améliorations ne s'appliquent a une application que si celle-ci déclare explicitement cette nouvelle version en tant que `targetSdkVersion` dans sa configuration. Cibler la version la plus récente d'Android permet ainsi de bénéficier de ces évolutions sans empécher l'utilisation de l'application sur des versions plus anciennes. De la même façon chaque nouvelle version d'Android introduit des améliorations en termes de sécurité et performance. Certaines de ces améliorations ne s'appliquent a une application que si celle-ci déclare explicitement cette nouvelle version en tant que `targetSdkVersion` dans sa configuration. Cibler la version la plus récente d'Android permet ainsi de bénéficier de ses évolutions sans empêcher l'utilisation de l'application sur des versions plus anciennes.
### Exemple ### Exemple

View File

@ -39,6 +39,6 @@ Une video de 30 minutes va typiquement faire 500mo, un podcast de la même duré
### Principe de validation ### Principe de validation
| Le nombre ... | est inférieur ou égal à | | Le pourcentage ... | est inférieur ou égal à |
|-------------------|:-------------------------:| |----------------------------------------------------|:-----------------------:|
| de fichiers multimédias sans alternative textuelle | 10% | | de fichiers multimédias sans alternative textuelle | 10% |