review
parent
0cab6b3d21
commit
a1d8f69f26
11
README.md
11
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
|
||||
|
|
|
@ -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% |
|
||||
| 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 |
|
|
@ -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 |
|
||||
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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% |
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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".
|
||||
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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% |
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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% |
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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 :
|
||||
|
|
|
@ -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% |
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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% |
|
||||
|
|
Loading…
Reference in New Issue