Ce que cela signifie
Avant Android 12, un composant doté d'un intent-filter était exporté par défaut : n'importe quelle autre application pouvait le lancer. Depuis Android 12, la documentation d'Android indique qu'une application ciblant Android 12 ou plus qui contient des activités, services ou broadcast receivers utilisant des intent-filters doit déclarer explicitement android:exported ; sinon, elle ne peut pas être installée sur un appareil sous Android 12 ou plus.
Le contrôle lit le manifeste du fichier compilé, c'est-à-dire le manifeste fusionné : les composants déclarés par vos bibliothèques comptent aussi.
Échéance
Pas de date propre au store : c'est une règle de la plateforme, qui s'applique dès que votre targetSdkVersion vaut 31 ou plus. Comme Google Play exige un niveau d'API cible récent, toutes les applications du store sont concernées.
Corriger
1. Définir l'attribut sur vos propres composants
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".BootReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>Utilisez true uniquement lorsque d'autres applications ou le système doivent atteindre le composant (activité de lancement, activités de liens profonds, cible de partage). Utilisez false pour tout ce qui est interne.
2. Surcharger les composants issus de bibliothèques
Quand le composant appartient à une dépendance, la mettre à jour est la correction propre. Sinon, redéclarez-le dans votre manifeste avec l'attribut et laissez la fusion des manifestes combiner les deux :
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<receiver
android:name="com.example.sdk.SomeReceiver"
android:exported="false"
tools:node="merge" />
</application>
</manifest>3. Lire le manifeste fusionné
L'onglet Merged Manifest d'Android Studio montre quelle bibliothèque a apporté chaque composant. Le contrôle liste chaque composant fautif par son nom.
Vérifier avant de soumettre
Déposez l'APK, AAB ou lot d'APK fractionnés (XAPK, APKS, APKM) sur la page de contrôle des stores. Elle exécute PLAY-EXPORTED avec les dates de cette page, puis supprime le fichier : rien de l'application n'est conservé. Le même moteur tourne hors ligne dans la CLI Narvy et renvoie le code 1 quand un point bloquant est trouvé, ce qui permet de bloquer un job de CI.
narvy store-check app-release.aab --lang frQuestions fréquentes
L'attribut doit-il valoir true ou false ?
true rend le composant accessible aux autres applications, false le garde privé à votre application (et aux applications partageant le même identifiant utilisateur). Exporter un composant qui n'en a pas besoin élargit la surface d'attaque : partez de false.
Mon targetSdk est inférieur à 31. La règle s'applique-t-elle ?
Pas celle-ci : le contrôle la marque comme non applicable. Mais l'exigence de niveau d'API cible de Google Play vous obligera à relever la cible, et la règle s'appliquera dès que vous le ferez.
Les composants sans intent-filter sont-ils concernés ?
Non. Sans intent-filter, la valeur par défaut est déjà false, et le contrôle ne regarde que les activités, services et receivers qui en déclarent un.