From a1d8f69f2673b7992ceec53fe01f6e9066b174f4 Mon Sep 17 00:00:00 2001 From: DEMEY Fanny Date: Fri, 9 Feb 2024 10:24:42 +0100 Subject: [PATCH] review --- README.md | 11 ++++++++++- chapters/MBP_006_fr.md | 10 +++++----- chapters/MBP_007_fr.md | 8 ++++---- chapters/MBP_008_fr.md | 8 ++++---- chapters/MBP_009_fr.md | 6 +++--- chapters/MBP_010_fr.md | 4 ++-- chapters/MBP_011_fr.md | 4 +++- chapters/MBP_012_fr.md | 2 +- chapters/MBP_013_fr.md | 6 +++--- chapters/MBP_015_fr.md | 8 ++++---- chapters/MBP_016_fr.md | 2 +- chapters/MBP_018_fr.md | 2 -- chapters/MBP_019_fr.md | 8 +++++--- chapters/MBP_020_fr.md | 15 +-------------- chapters/MBP_022_fr.md | 6 +++--- chapters/MBP_025_fr.md | 6 +++--- chapters/MBP_029_fr.md | 23 ++++------------------- chapters/MBP_030_fr.md | 8 ++++---- chapters/MBP_031_fr.md | 6 +++--- chapters/MBP_033_fr.md | 6 +++--- chapters/MBP_035_fr.md | 6 +++--- 21 files changed, 69 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index 2f9a642..d997380 100644 --- a/README.md +++ b/README.md @@ -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) * [É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) -* [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) * [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) * // TODO : à écrire + // MAIN/IO thread ? + // Notifications + // ABI ?? + // Feature play store + // 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. // 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) * [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 diff --git a/chapters/MBP_006_fr.md b/chapters/MBP_006_fr.md index 6b22b6d..159c7bb 100644 --- a/chapters/MBP_006_fr.md +++ b/chapters/MBP_006_fr.md @@ -94,8 +94,8 @@ sealed interface ProfileUIState { ### Principe de validation -| 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'écran 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% | \ No newline at end of file +| Le nombre ... | est inférieur ou égal à | +|-----------------------------------------------------------------------------------------------------|:-----------------------:| +| d'écrans effectuant des chargements de données à chaque fois que la vue passe dans l'état `RESUMED` | 0 | +| d'écrans rechargeant l'ensemble des données lors d'un changement de configuration | 0 | +| d'écrans n'utilisant pas de ViewModel ou équivalent pour maintenir l'état de la vue plus longtemps | 0 | \ No newline at end of file diff --git a/chapters/MBP_007_fr.md b/chapters/MBP_007_fr.md index 89c7282..2d99f6e 100644 --- a/chapters/MBP_007_fr.md +++ b/chapters/MBP_007_fr.md @@ -22,7 +22,7 @@ ### 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 `onStop`, l'activité n'est plus visible. @@ -40,7 +40,7 @@ Quelques exemples de traitements consommateurs : ### Principe de validation -| 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% | +| Le nombre ... | est inférieur ou égal à | +|-----------------------------------------------------------------------------------------------------------|:-----------------------:| +| de traitements lourds pour lesquels la mémoire n'est pas libérée dans les fonctions `onPause` ou `onStop` | 0 | diff --git a/chapters/MBP_008_fr.md b/chapters/MBP_008_fr.md index b83b9f4..3e9a592 100644 --- a/chapters/MBP_008_fr.md +++ b/chapters/MBP_008_fr.md @@ -22,11 +22,11 @@ ### 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 -| Le nombre ... | est inférieur ou égal à | -|---------------|:-------------------------:| -| d'APK déployé | 0 | +| Le nombre ... | est inférieur ou égal à | +|----------------------------------------|:-------------------------:| +| d'APK déployé sans passer par un 'store' | 0 | diff --git a/chapters/MBP_009_fr.md b/chapters/MBP_009_fr.md index 880dfa6..e8f7cd8 100644 --- a/chapters/MBP_009_fr.md +++ b/chapters/MBP_009_fr.md @@ -34,6 +34,6 @@ res/layout/item_row.xml: Warning: The resource R.layout.item_row appears ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|-----------------------------------------------|:-------------------------:| -| de fichier non utilisé dans le package final | 0 | +| Le nombre ... | est inférieur ou égal à | +|------------------------------------------------|:-------------------------:| +| de fichiers non utilisés dans le package final | 0 | diff --git a/chapters/MBP_010_fr.md b/chapters/MBP_010_fr.md index 9d2cdf0..ab8748c 100644 --- a/chapters/MBP_010_fr.md +++ b/chapters/MBP_010_fr.md @@ -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`). 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é. @@ -61,4 +61,4 @@ android { | Le nombre ... | est inférieur ou égal à | |-----------------------------------|:-----------------------:| -| de fichiers non minifiés | 25 | +| de fichiers non minifiés | 25% | diff --git a/chapters/MBP_011_fr.md b/chapters/MBP_011_fr.md index 8ef2065..2faeade 100644 --- a/chapters/MBP_011_fr.md +++ b/chapters/MBP_011_fr.md @@ -24,7 +24,9 @@ ### 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 diff --git a/chapters/MBP_012_fr.md b/chapters/MBP_012_fr.md index 77d82f2..e56c354 100644 --- a/chapters/MBP_012_fr.md +++ b/chapters/MBP_012_fr.md @@ -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. Grâce à cette bonne pratique, l’interface 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. -S’il n’est pas possible d’utiliser 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). +S’il n’est pas possible d’utiliser 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". diff --git a/chapters/MBP_013_fr.md b/chapters/MBP_013_fr.md index b2d33f2..e4ce975 100644 --- a/chapters/MBP_013_fr.md +++ b/chapters/MBP_013_fr.md @@ -34,6 +34,6 @@ Pour la même raison, avec Jetpack Compose, il ne faut pas envelopper un lazy la ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|-----------------------------------------------------------|:-------------------------:| -| d'écran défilable n'utilisant pas le chargement paresseux | 0% | +| Le nombre ... | est inférieur ou égal à | +|-------------------------------------------------------------|:-----------------------:| +| d'écrans défilables n'utilisant pas le chargement paresseux | 0 | diff --git a/chapters/MBP_015_fr.md b/chapters/MBP_015_fr.md index 6fbf54c..d6d24c0 100644 --- a/chapters/MBP_015_fr.md +++ b/chapters/MBP_015_fr.md @@ -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. 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 @@ -53,6 +53,6 @@ Source : [Developer Android - Nested Recyclerviews](https://developer.android.co ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|-----------------------------------------------------------|:-------------------------:| -| d'écran défilable n'utilisant pas le chargement paresseux | 0% | +| Le nombre ... | est inférieur ou égal à | +|-------------------------------------------------------------|:------------------------:| +| d'écrans défilables n'utilisant pas le chargement paresseux | 0 | diff --git a/chapters/MBP_016_fr.md b/chapters/MBP_016_fr.md index 9098f23..1736400 100644 --- a/chapters/MBP_016_fr.md +++ b/chapters/MBP_016_fr.md @@ -22,7 +22,7 @@ ### 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 lorsqu’elles sont indispensables. Si vous ne pouvez pas vous passer d’une 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`. diff --git a/chapters/MBP_018_fr.md b/chapters/MBP_018_fr.md index d37b5d2..81ec1ab 100644 --- a/chapters/MBP_018_fr.md +++ b/chapters/MBP_018_fr.md @@ -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. 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) -* [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. diff --git a/chapters/MBP_019_fr.md b/chapters/MBP_019_fr.md index 0e1b381..ceec58f 100644 --- a/chapters/MBP_019_fr.md +++ b/chapters/MBP_019_fr.md @@ -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. +Il peut être intéressant de mener ce genre d'analyse sur les fonctions Composable les plus riches d'une application. + ### Exemple Pour améliorer la "skipabilité" d'une fonction Composable et ainsi ne pas trop sollicité le processeur, il faut : @@ -67,6 +69,6 @@ data class LogEntry { ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|-------------------|:-------------------------:| -| de modifications n'affectant pas le layout et occasionnant un repaint (ex: color, background, visibility) | 1 | +| Le nombre ... | est inférieur ou égal à | +|-------------------------------------------------------------------------------------------|:-----------------------:| +| Fonctions Composables riches dans l'application dont la skipabilité n'a pas été optimisée | 40% | diff --git a/chapters/MBP_020_fr.md b/chapters/MBP_020_fr.md index 16f525e..a66e911 100644 --- a/chapters/MBP_020_fr.md +++ b/chapters/MBP_020_fr.md @@ -30,20 +30,7 @@ Un pixel a l'écran peut être dessiné ("Draw") plusieurs fois durant le proces ### 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 - -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 doesn’t 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 d’apparence d’un é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 d’un é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 qu’un élément équivalent avec un block display. +* 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. Pour aller plus loin : https://developers.google.com/speed/articles/reflow diff --git a/chapters/MBP_022_fr.md b/chapters/MBP_022_fr.md index 6b3d988..559b9e4 100644 --- a/chapters/MBP_022_fr.md +++ b/chapters/MBP_022_fr.md @@ -36,6 +36,6 @@ Si une requête retourne une liste de noms de villes ou de noms de contacts, il ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|--------------------------------------------------------|:-----------------------:| -| de réponse du serveur non mis en base de données local | 20% | +| Le pourcentage ... | est inférieur ou égal à | +|------------------------------------------------------------|:-----------------------:| +| de réponses du serveur non mises en base de données locale | 20% | diff --git a/chapters/MBP_025_fr.md b/chapters/MBP_025_fr.md index 1ba07b0..edb4e6e 100644 --- a/chapters/MBP_025_fr.md +++ b/chapters/MBP_025_fr.md @@ -30,6 +30,6 @@ Lorsque le serveur fourni à l'application des images à afficher, les mettre en ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|-----------------------------------------------------|:-------------------------:| -| d'image obtenue par le serveur et non mise en cache | 0 | +| Le nombre ... | est inférieur ou égal à | +|--------------------------------------------------------|:-----------------------:| +| d'images obtenues par le serveur et non mises en cache | 0 | diff --git a/chapters/MBP_029_fr.md b/chapters/MBP_029_fr.md index 0d56560..ec8be56 100644 --- a/chapters/MBP_029_fr.md +++ b/chapters/MBP_029_fr.md @@ -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 : -```kt +```kotlin android { 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 ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|------------------------------------------------------------------------------|:-------------------------:| -| de fichiers de ressources contenant des traductions de langues non supportée | 0 | +| Le nombre ... | est inférieur ou égal à | +|-------------------------------------------------------------------------------|:-------------------------:| +| de fichiers de ressources contenant des traductions de langues non supportées | 0 | diff --git a/chapters/MBP_030_fr.md b/chapters/MBP_030_fr.md index 2fde0a7..573c1bc 100644 --- a/chapters/MBP_030_fr.md +++ b/chapters/MBP_030_fr.md @@ -22,7 +22,7 @@ ### 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 l’utilisateur. +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 l’utilisateur. On limite ainsi la taille de l'application. Cependant si vous avez besoin d'une police particulière pour votre application, vous pouvez : @@ -37,9 +37,9 @@ 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 : -| | Regular | Regular + bold | Variable | Latin Regular | Latin Regular + Latin Bold | Latin Variable | -|---:| :---------------: |:---------------:|:------------:| :-----:| :-----:| :-----:| -|Poids|37.6kb|76.9kb|66kb|16kb|32.5kb| ? +| | Regular | Regular + bold | Variable | Latin Regular | Latin Regular + Latin Bold | Latin Variable | +|------:|:-------:|:--------------:|:--------:|:-------------:|:--------------------------:|:--------------:| +| Poids | 37.6kb | 76.9kb | 66kb | 16kb | 32.5kb | ? | Aller plus loin : diff --git a/chapters/MBP_031_fr.md b/chapters/MBP_031_fr.md index 58d0dbd..7f821b6 100644 --- a/chapters/MBP_031_fr.md +++ b/chapters/MBP_031_fr.md @@ -42,6 +42,6 @@ Une application de type e-commerce utilise deux listes différentes : liste de c ### Principe de validation -| Le nombre ... | est inférieur ou égale à | -|-------------------|:-------------------------:| -| de fonctionnalités peu utilisées présentent en production | 10% | +| Le pourcentage ... | est inférieur ou égale à | +|-----------------------------------------------------------|:------------------------:| +| de fonctionnalités peu utilisées présentent en production | 10% | diff --git a/chapters/MBP_033_fr.md b/chapters/MBP_033_fr.md index 1122c79..ab924c1 100644 --- a/chapters/MBP_033_fr.md +++ b/chapters/MBP_033_fr.md @@ -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 @@ -22,9 +22,9 @@ ### 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 diff --git a/chapters/MBP_035_fr.md b/chapters/MBP_035_fr.md index 792fced..84f4031 100644 --- a/chapters/MBP_035_fr.md +++ b/chapters/MBP_035_fr.md @@ -39,6 +39,6 @@ Une video de 30 minutes va typiquement faire 500mo, un podcast de la même duré ### Principe de validation -| Le nombre ... | est inférieur ou égal à | -|-------------------|:-------------------------:| -| de fichiers multimédias sans alternative textuelle | 10% | +| Le pourcentage ... | est inférieur ou égal à | +|----------------------------------------------------|:-----------------------:| +| de fichiers multimédias sans alternative textuelle | 10% |