Aller au contenu

Guides de configuration · Flutter

Test fermé Google Play pour les applications Flutter

De flutter build appbundle à Demander l’accès en production : compiler et signer un bundle de release, configurer le canal fermé, garder 12 testeurs inscrits pendant 14 jours et éviter les erreurs Flutter qui coûtent une semaine.

Build
flutter build appbundle
Code de version
pubspec.yaml → version: 1.0.0+1
API cible
targetSdk ≥ 36

Compiler un app bundle de release

Google Play n’accepte que des Android App Bundles (.aab) pour les nouvelles applications. Flutter en compile un en une seule commande, et le mode release est celui par défaut. Faites d’abord deux vérifications : les deux sont difficiles à corriger une fois l’application chez les testeurs.

  1. Définir l’ID d’application

    Dans android/app/build.gradle.kts, donnez à applicationId une valeur unique en nom de domaine inversé, par exemple com.yourcompany.app. Il ne peut plus changer après le premier import sur Google Play.

  2. Vérifier l’autorisation INTERNET

    Si l’application accède au réseau, android/app/src/main/AndroidManifest.xml doit déclarer android.permission.INTERNET. Les manifestes debug et profile l’incluent ; celui de release seulement si vous l’ajoutez.

  3. Compiler le bundle

    Lancez la commande ci-dessous à la racine du projet. Flutter écrit le bundle dans build/app/outputs/bundle/release/.

Terminal
flutter build appbundle

Vous utilisez des flavors ? Compilez celui que vous publiez, par exemple flutter build appbundle --flavor production, et vérifiez qu’il utilise le nom de package et les clés d’API de production.

Signer : clé d’importation et signature d’application Play

La signature d’application Play est obligatoire pour les nouvelles applications : Google conserve la clé de signature de l’application et vous signez chaque import avec votre propre clé d’importation. Si vous la perdez, vous pouvez demander à Google de la réinitialiser ; votre application n’est pas perdue pour autant. Créez la clé avec keytool :

Terminal (macOS / Linux)
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
        -storetype JKS -keysize 2048 -validity 10000 -alias upload

Créez ensuite android/key.properties avec les mots de passe et le chemin du keystore. Ce fichier et le .jks ne doivent pas entrer dans le contrôle de version :

android/key.properties
storePassword=<keystore password>
keyPassword=<key password>
keyAlias=upload
storeFile=/Users/<you>/upload-keystore.jks

Chargez le fichier dans android/app/build.gradle.kts et associez le type de build release à la nouvelle configuration de signature :

android/app/build.gradle.kts
import java.util.Properties
import java.io.FileInputStream

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
    // ...
    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties.getProperty("keyAlias")
            keyPassword = keystoreProperties.getProperty("keyPassword")
            storeFile = keystoreProperties.getProperty("storeFile")?.let { file(it) }
            storePassword = keystoreProperties.getProperty("storePassword")
        }
    }
    buildTypes {
        release {
            signingConfig = signingConfigs.getByName("release")
        }
    }
}

Les anciens projets utilisent build.gradle (Groovy) au lieu de build.gradle.kts ; les champs sont les mêmes. Lancez flutter clean après avoir modifié les fichiers Gradle.

Code de version et niveau d’API cible

Chaque import exige un code de version supérieur à tous les bundles déjà importés, quel que soit le canal. Avec Flutter, c’est le nombre après le + dans pubspec.yaml :

pubspec.yaml
version: 1.0.0+1

1.0.0 devient le nom de version visible par les utilisateurs et 1 le code de version. Passez à +2, +3, etc., ou remplacez les deux au moment du build avec --build-name et --build-number.

Depuis le 31 août 2026, les nouvelles applications et mises à jour doivent cibler Android 16 (niveau d’API 36) ou plus. Le fichier Gradle utilise targetSdk = flutter.targetSdkVersion : mettre Flutter à jour est donc la façon habituelle de l’augmenter. Si votre version de Flutter est plus ancienne, indiquez targetSdk = 36 vous-même et testez sur une version récente d’Android avant l’import.

Pièges Flutter qui retardent le test fermé

  • Numéro de build réutilisé. La Play Console refuse un bundle dont le code de version a déjà servi. Augmentez le +N de pubspec.yaml avant chaque build destiné à l’import.
  • Obfuscation sans symboles. --obfuscate ne fonctionne qu’avec --split-debug-info. Conservez le dossier de symboles de chaque build importé ; sans lui, les traces de plantage des testeurs sont illisibles.
  • Mauvais flavor. Avec des flavors, on importe vite le build de staging avec ses endpoints de staging. Les testeurs signalent alors des bugs que les utilisateurs de production ne verraient jamais.
  • Pas de réseau en release. Sans l’autorisation INTERNET dans le manifeste principal, l’application marche en debug et échoue en silence chez les testeurs.
  • Bundle signé en debug. Si le type de build release utilise encore la configuration de signature debug, la Play Console refuse l’import.
  • Plugins au code natif ancien. Les plugins qui embarquent des bibliothèques .so doivent prendre en charge les pages mémoire de 16 Ko. La Play Console le signale et, à partir du 1er février 2027, les mises à jour non compatibles ne pourront plus être publiées. Mettez à jour plugins et SDK Flutter avant le test, pas au milieu.
Terminal
flutter build appbundle --obfuscate --split-debug-info=build/symbols

Lire les rapports de plantage de vos testeurs

Les testeurs collent des traces de pile dans leurs rapports de bug, et la Play Console regroupe les plantages sous Surveiller et améliorer → Android Vitals → Plantages et ANR. Une trace Flutter a deux moitiés : la partie Dart, que --obfuscate transforme en noms courts et sans signification, et la partie Android, que R8 réduit. Flutter active toujours la réduction du code en release, prévoyez donc les deux.

  1. Conservez les symboles Dart

    Un build réalisé avec --split-debug-info écrit un fichier de symboles par architecture, par exemple app.android-arm64.symbols. Rangez le dossier avec le code de version correspondant : le fichier d’un autre build ne peut pas décoder la trace.

  2. Décodez les traces Dart

    Enregistrez la trace dans un fichier et passez-la à flutter symbolize avec le fichier de symboles de l’architecture de l’appareil. La plupart des téléphones actuels sont en arm64.

  3. Laissez la Play Console gérer la partie Java

    Avec le plug-in Android Gradle 4.1 ou plus récent, le fichier de mapping R8 voyage dans le .aab : la Play Console désobscurcit les lignes Java et Kotlin des plug-ins sans import séparé.

Terminal
flutter symbolize -i crash.txt -d build/symbols/app.android-arm64.symbols

L’obscurcissement renomme les symboles ; il ne chiffre rien et n’est pas un endroit pour des secrets. Le code qui compare runtimeType.toString() à un nom de classe casse une fois obscurci, alors que les noms d’enum restent lisibles.

La Play Console en bref : du test fermé à la production

Une fois votre bundle Flutter compilé et signé, la suite se passe dans la Play Console et fonctionne de la même manière pour tous les frameworks. Voici la liste de contrôle ; chaque menu et chaque écran sont décrits dans le guide Play Console complet.

  • Terminez la configuration de l’application dans le tableau de bord : règles de confidentialité, accès à l’application, annonces, classification du contenu, audience cible, sécurité des données et fiche Play Store.
  • Créez une release de test fermé sous Tester et publier → Tests → Test fermé : choisissez les pays de vos testeurs, importez le .aab et envoyez-le en examen.
  • Ajoutez les testeurs avec un Google Group dans l’onglet Testeurs et partagez le lien d’inscription. Il fonctionne dès que le canal affiche Publié.
  • Gardez au moins 12 testeurs inscrits pendant 14 jours d’affilée. Les tests internes ne comptent pas, et une personne qui part puis revient recommence ses 14 jours.
  • Publiez au moins une mise à jour pendant le test et notez ce que les testeurs ont trouvé et ce que vous avez modifié.
  • Demandez l’accès en production depuis le tableau de bord et répondez aux trois sections sur votre test, votre application et votre préparation. La décision revient à Google ; personne ne peut garantir l’approbation.

Prévoyez des départs : recrutez plus de 12 testeurs pour qu’un abandon ne retarde pas votre calendrier. Voir toutes les étapes Play Console.

Le guide Play Console complet

Canal fermé, Google Group et lien d’inscription, règle des 12 testeurs / 14 jours et demande d’accès en production, étape par étape sur une seule page.

Ouvrir les étapes Play Console

Livrer des correctifs pendant le test

Avec Flutter : augmentez le numéro de build, recompilez et importez le nouveau bundle dans le même canal fermé.

Terminal
flutter build appbundle --build-name=1.0.1 --build-number=2

Avant chaque import, lancez le build release sur un vrai téléphone. flutter install installe l’APK release sur un appareil connecté et révèle en quelques minutes les autorisations manquantes, les mauvais flavors et les plantages propres à la release :

Terminal
flutter build apk
flutter install

Pour vérifier le bundle exact que vous allez importer, transformez-le en APK d’appareil avec l’outil bundletool de Google, ou importez-le dans le canal fermé et installez-le depuis Google Play avec un compte testeur. Vous testez ainsi ce que reçoivent les testeurs, y compris les APK fractionnés par appareil de Play.

  • Une modification ciblée par mise à jour. De petites releases montrent clairement quel correctif répond à quel rapport de testeur et fournissent des exemples concrets pour le formulaire d’accès en production.
  • Ne changez pas de version de Flutter en plein test, sauf si un bug signalé par les testeurs l’exige. Une mise à niveau du SDK modifie en même temps le moteur, le code natif de chaque plug-in et parfois targetSdk.
  • Laissez du temps pour l’examen. Chaque nouvelle release du canal fermé est envoyée à Google avant d’arriver chez les testeurs : ne gardez pas votre dernier correctif pour le dernier jour.

Questions fréquentes

Faut-il --obfuscate pour un test fermé ?

Non. L’obscurcissement est facultatif et rend seulement les symboles Dart plus difficiles à lire. Si vous l’utilisez, associez-le toujours à --split-debug-info et archivez les symboles, sinon les plantages envoyés par les testeurs deviennent illisibles.

Quel code de version Google Play voit-il ?

Le nombre après le + dans pubspec.yaml, ou la valeur de --build-number si vous la passez. Flutter utilise le nom de build comme versionName et le numéro de build comme versionCode.

Puis-je donner un APK aux testeurs ?

Pas via Google Play : les nouvelles applications doivent être importées au format .aab, et seules les installations depuis le canal fermé comptent pour les 12 testeurs. flutter build apk --split-per-abi reste pratique pour des vérifications rapides sur vos propres téléphones.

Pourquoi la Play Console avertit-elle au sujet des pages mémoire de 16 Ko ?

En général, un plug-in fournit des bibliothèques natives .so qui ne sont pas alignées sur des pages de 16 Ko. Mettez à jour le plug-in et Flutter, recompilez, puis vérifiez sur un émulateur Android avec une image système à pages de 16 Ko avant le prochain import.

Sources

Les détails techniques ont été vérifiés dans la documentation officielle ci-dessous. Les menus et valeurs par défaut changent d’une version à l’autre ; en cas de doute, la page officielle fait foi.

Vous découvrez la règle des 12 testeurs ?

Le guide général explique l’exigence de Google, le déroulement jour par jour d’une campagne TestBunny et ce que nous pouvons ou ne pouvons pas garantir.

Lire le guide général

Besoin de 12 vrais testeurs pendant 14 jours ?

Ajoutez votre application et votre lien de test fermé, choisissez Starter (15 testeurs) ou Pro (25 testeurs), puis suivez l’activité de chaque testeur jour par jour dans votre panneau.

TestBunny n’est pas affilié à Google. Les testeurs gagnent des crédits, jamais d’argent. Personne ne peut garantir la décision de Google sur l’accès en production, et nous ne le faisons pas.