Test fermé Google Play pour les apps Capacitor et Ionic
Capacitor ne change pas la règle de Google. Si votre compte Play Console est un compte personnel créé après le 13 novembre 2023, vous devez mener un test fermé avec au moins 12 testeurs inscrits pendant 14 jours sans interruption avant de pouvoir demander l'accès production (aide Play Console).
La documentation de Capacitor le dit elle-même : ses apps sont, au bout du compte, des apps natives normales, publiées comme n'importe quelle app Android (doc Capacitor). Les points propres à Capacitor sont ceux qui piègent : le SDK cible dépend de votre version majeure de Capacitor, le dossier android/ ne se met pas à jour tout seul, et le projet natif embarque le dernier bundle web synchronisé. Pour la règle et chaque écran de la Play Console, commencez par le guide du test fermé Google Play.
Le dossier android/ est votre projet
npx cap add android crée un projet Android Studio complet dans android/ (doc Capacitor). Ensuite, il vous appartient. Mettre à jour les paquets npm ne le réécrit pas : le guide de passage à Capacitor 8 liste des modifications à faire dans variables.gradle, le plugin Android Gradle et le wrapper Gradle, et propose npx cap migrate pour les appliquer (doc Capacitor).
Quand vous lisez « Capacitor 8 cible l'API 36 », vérifiez donc le fichier. Une app créée sous Capacitor 6 et mise à jour par npm seulement peut encore indiquer 34.
Étape 1 : Capacitor 8 pour l'API 36
Depuis le 31 août 2026, les nouvelles applications et les mises à jour doivent cibler Android 16 (niveau d'API 36) ou plus. Les applications Wear OS et Android Automotive OS doivent cibler l'API 35, les applications Android TV et Android XR l'API 34 (aide Play Console).
Capacitor lie le SDK cible à sa version majeure (doc Capacitor) :
| Capacitor Android | SDK cible |
|---|---|
| 8.x | 36 |
| 7.x | 35 |
| 6.x | 34 |
Capacitor précise aussi ne pas prendre en charge de SDK cible personnalisé. Monter le chiffre sous Capacitor 7 peut compiler, mais sans aucun soutien. Passez plutôt à Capacitor 8. La dernière version est la 8.6.0, publiée le 28 octobre 2026 (npm, vérifié le 9 novembre 2026).
La valeur se trouve dans android/variables.gradle. Le modèle 8.6.0 contient (modèle Capacitor) :
minSdkVersion = 24
compileSdkVersion = 36
targetSdkVersion = 36Capacitor 8 exige Node.js 22 ou plus et Android Studio Otter 2025.2.1 ou plus récent. Le guide de passage monte le plugin Android Gradle en 8.13.0 et le wrapper Gradle en 8.14.3 (doc Capacitor). Le guide de l'API cible 36 liste ce qu'il faut retester après le passage.
Étape 2 : fixer l'application ID avant le premier import
L'applicationId du modèle est com.getcapacitor.app. Changez-le en haut de android/app/build.gradle (doc Capacitor) et gardez le même appId dans votre configuration Capacitor.
Faites-le maintenant. Google indique qu'une fois un artefact importé, le nom de package est fixé et ne peut plus être modifié (aide Play Console). Réglez aussi le nom de l'app dans strings.xml (app_name) : c'est ce que les testeurs voient sur leur écran d'accueil.
Étape 3 : compiler l'app web, puis synchroniser
Chaque version commence de la même façon (doc Capacitor) :
npm run build # ou ng build, selon votre build web
npx cap syncnpx cap sync copie votre bundle web compilé dans les projets natifs et met à jour les dépendances natives. Oubliez-le et l'AAB contient votre build web précédent. Les testeurs signalent alors des bugs déjà corrigés.
Étape 4 : produire un AAB signé
En ligne de commande. npx cap build android compile le projet natif en AAB ou APK signé. La commande accepte --keystorepath, --keystorepass, --keystorealias, --keystorealiaspass et --androidreleasetype (AAB ou APK) (doc Capacitor). Les mêmes réglages peuvent aller sous android.buildOptions dans votre configuration Capacitor, où releaseType vaut "AAB" par défaut et signingType vaut "jarsigner" (doc Capacitor). Laissez signingType sur jarsigner pour un AAB : Google indique qu'on ne peut pas signer un app bundle avec apksigner (Android Developers). Gardez les mots de passe hors d'un fichier de configuration versionné : passez-les en options dans votre intégration continue.
Depuis Android Studio. npx cap open android, puis Build > Generate Signed Bundle/APK, choisissez Android App Bundle et créez ou sélectionnez votre keystore d'importation (Android Developers).
Sauvegardez le keystore et ses deux mots de passe. Avec la signature d'application Play, Google peut réinitialiser une clé d'importation perdue, mais une clé de signature d'application que vous gérez vous-même ne peut pas l'être (aide Play Console). Si vous utilisez Google Sign-In ou Firebase, enregistrez aussi l'empreinte de la clé de signature d'application de Google, pas seulement celle de votre clé d'importation, sinon la connexion échoue pour les testeurs qui ont installé l'app depuis Google Play (même source).
Étape 5 : augmenter versionCode à chaque version
Le modèle règle versionCode 1 et versionName "1.0" dans android/app/build.gradle (modèle Capacitor). Google Play exige un versionCode plus élevé à chaque import, jusqu'à 2 100 000 000 (aide Play Console). Vous publierez des correctifs pendant les 14 jours : augmentez-le à chaque fois, et changez versionName pour que les testeurs distinguent les builds.
Étape 6 : les autorisations
Le AndroidManifest.xml du modèle déclare déjà INTERNET (modèle Capacitor). Pour le reste, la documentation de Capacitor indique que le plugin choisi vous demandera en général d'ajouter une autorisation, à placer dans android/app/src/main/AndroidManifest.xml (doc Capacitor).
Les bibliothèques natives peuvent aussi fusionner des autorisations que vous n'avez jamais écrites. L'exemple de Google : le Google Mobile Ads SDK déclare com.google.android.gms.permission.AD_ID, qui se retrouve dans le manifeste de votre app (aide Play Console). Ouvrez le manifeste fusionné dans Android Studio avant l'import.
Google évalue aussi les autorisations à risque, comme les SMS ou le journal d'appels, sur les canaux de test. Une autorisation non déclarée sur une version fermée active vous empêche de publier des modifications (aide Play Console).
Étape 7 : retirer les réglages de développement de la configuration
Trois options de la configuration Capacitor sont prévues pour le développement (doc Capacitor) :
server.urlcharge une URL externe dans la WebView pour le rechargement à chaud. Capacitor : « This is not intended for use in production » (ce n'est pas prévu pour la production). Si vous l'oubliez, l'app de vos testeurs pointe vers votre ordinateur.server.cleartextautorise le trafic HTTP pour les serveurs de rechargement à chaud. Même avertissement.android.webContentsDebuggingEnabledvautfalsepar défaut et s'active tout seul en développement. Ne le forcez pas àtruedans le build que vous importez.
Étape 8 : minification et build de release
Le modèle contient minifyEnabled false dans le type de build release (modèle Capacitor). Si vous activez R8, testez le build réduit : les plugins qui utilisent la réflexion peuvent avoir besoin de règles de conservation. Notez que le modèle référence proguard-android.txt. Google indique qu'AGP 9.0 ne prend plus en charge ce fichier, au profit de proguard-android-optimize.txt (Android Developers). Le modèle 8.6.0 utilise encore AGP 8.13.0 : le point compte quand vous passerez à AGP 9.
Testez le build de release sur un vrai téléphone. Capacitor exige une WebView basée sur Chrome 60 ou plus, et rappelle que la System WebView ne se met pas à jour toute seule sur les émulateurs (doc Capacitor).
Étape 9 : publier sur le canal de test fermé
Dans la Play Console, allez dans Tester et publier > Tests > Tests fermés, puis Gérer le canal. Créez une version, importez le .aab, ajoutez les testeurs dans l'onglet Testeurs, choisissez les pays et envoyez les modifications pour examen.
Le lien d'inscription (opt-in) n'apparaît qu'une fois l'application à l'état « Publiée », et la première fois il peut mettre plusieurs heures à fonctionner (aide Play Console). S'il manque, voyez où trouver le lien d'inscription. Gardez vos 12 testeurs du test fermé hors du canal interne : Google indique qu'un utilisateur qui active votre test interne ne peut plus recevoir votre test fermé.
Combien de temps ça prend vraiment
- Passage de Capacitor 7 à 8 : une heure ou deux avec
npx cap migratepour une petite app, davantage avec beaucoup de plugins. - Premier AAB signé : environ une heure si Android Studio fonctionne déjà.
- Première version fermée : Google peut prendre jusqu'à sept jours, voire plus dans des cas exceptionnels, pour certains comptes (aide Play Console).
- Le test : 14 jours sans interruption. Examen de la demande d'accès production : en général sept jours ou moins (aide Play Console).
Prévoyez trois à quatre semaines entre le premier import en test fermé et la production.
Questions fréquentes
Les apps Capacitor et Ionic ont-elles besoin de 12 testeurs pendant 14 jours ?
Oui, si votre compte Play Console est un compte personnel créé après le 13 novembre 2023. Une app WebView suit la même règle que n'importe quelle app native : un test fermé avec au moins 12 testeurs inscrits pendant 14 jours sans interruption.
Quelle version de Capacitor cible l'API 36 ?
Capacitor 8. Le tableau de Capacitor lie le SDK cible à la version majeure : 8.x cible 36, 7.x cible 35, 6.x cible 34. Capacitor indique ne pas prendre en charge de SDK cible personnalisé.
Où se trouve targetSdkVersion dans un projet Capacitor ?
Dans android/variables.gradle. Le modèle de Capacitor 8 règle minSdkVersion sur 24, compileSdkVersion sur 36 et targetSdkVersion sur 36.
Comment produire un AAB signé avec Capacitor ?
Lancez npx cap build android avec les options de votre keystore, ou placez-les sous android.buildOptions dans la configuration Capacitor, dont le type de release par défaut est AAB. Vous pouvez aussi passer par Build > Generate Signed Bundle/APK dans Android Studio.
Mon build de test fermé affiche une ancienne version de mon app web. Pourquoi ?
Le projet natif ne contient que le bundle web que vous y avez copié en dernier. Lancez votre build web, puis npx cap sync, avant chaque build de release.
Sources
- support.google.com/googleplay/android-developer/answer/14151465
- support.google.com/googleplay/android-developer/answer/11926878
- support.google.com/googleplay/android-developer/answer/9845334
- support.google.com/googleplay/android-developer/answer/9842756
- support.google.com/googleplay/android-developer/answer/17367361
- support.google.com/googleplay/android-developer/answer/9214102
- support.google.com/googleplay/android-developer/answer/6048248
- support.google.com/googleplay/android-developer/answer/9859751
- developer.android.com/studio/publish/app-signing
- developer.android.com/build/building-cmdline
- developer.android.com/build/shrink-code
- capacitorjs.com/docs/android/setting-target-sdk
- capacitorjs.com/docs/updating/8-0
- capacitorjs.com/docs/android
- capacitorjs.com/docs/android/configuration
- capacitorjs.com/docs/basics/workflow
- capacitorjs.com/docs/cli/commands/build
- capacitorjs.com/docs/config
- npmjs.com/package/@capacitor/android
- github.com/ionic-team/capacitor/tree/8.6.0/android-template