Comment corriger l'erreur "Error: android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required" ?

Le système d'exploitation pour smartphones Android est très populaire. On peut le trouver sur énormément de smartphones et de tablettes, mais aussi, dans une version modifiée, sur les montres connectées et les télévisions. Chaque année, une nouvelle version majeure d'Android sort. Ces versions apportent des nouveautés aux utilisateurs, mais aussi aux développeurs d'application. La version 12 d'Android a mis en place une nouvelle contrainte dans le SDK. Le message d'erreur "Error: android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required" est liée à celle-ci.

Ce message vient d'une nouvelle obligation dans l'utilisation de la version 31 du SDK, qui accompagne la sortie d'Android 12. Vous devez ajouter pour chaque librairie dans le fichier "AndroidManifest.xml". La difficulté principale est de trouver la librairie qui pose problème. Pour cela, vous pouvez utiliser deux techniques différentes.

La première consiste à modifier la version du SDK pour repasser à la version précédente (30). Dans Android Studio, ouvrez ensuite le fichier "AndroidManifest.xml" et cliquez sur le bouton "Merged Manifest". Ce fichier contient le manifeste de toutes les librairies utilisées par l'application. Vous pouvez donc le parcourir et regarder quelles sont les librairies pour lesquelles la propriété "android:exported" est absente. Si le manifeste global n'est pas disponible, vous devez parcourir chaque manifeste pour chaque librairie.

Une autre méthode de recherche possible consiste à utiliser les logs de l'étape de compilation de l'application. Dans l'onglet "Git-bash" d'Android Studio, utilisez la commande suivante pour créer un fichier texte à partir du résultat de la commande de compilation :

./gradlew assembleDebug --stacktrace --info | tee log-compilation.txt

Ouvrez le fichier "log-compilation.txt" et cherchez les mots-clés suivants pour trouver la ligne indiquant l'origine de l'erreur : "activity#", "service#", "receiver#" ou "provider#". Voici un exemple de ligne que vous pouvez trouver avec ces recherches :

activity#androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity
ADDED from [androidx.test:core:1.2.0] C:\Users\Admin\.gradle\caches\transforms-3\709730c74fe4dc9f8fd991eb4d1c2adc\transformed\jetified-core-1.2.0\AndroidManifest.xml:27:9-33:20

Ouvrez ensuite le fichier "AndroidManifest.xml" indiqué pour chercher une entrée pour laquelle la propriété "android:exported" est manquante.

Une fois que vous avez trouvé la ou les lignes posant problème, il existe deux solutions pour corriger. Cela dépend des droits que vous avez sur le fichier "AndroidManifest.xml". Si vous pouvez modifier le fichier, ajoutez simplement la propriété "android:exported" avec comme valeur "false", qui est la valeur par défaut. La propriété "tools:node" avec la valeur "merge" doit également être présente.

<receiver
    android:name="<nom>"
    android:exported="false"
    tools:node="merge" />

Si vous ne pouvez pas modifier le fichier, copiez l'entrée dans votre propre fichier "AndroidManifest.xml". Ajoutez-y la directive "android:exported" et également la directive "tools.overrideLibrary". Cette directive doit indiquer le nom du paquet contenant le fichier "AndroidManifest.xml" d'origine. Cette directive indique que l'on "écrase" la directive d'origine avec les nouvelles valeurs.

<provider
    android:name="com.squareup.picasso.PicassoProvider"
    android:exported="false"
    tools:node="merge"
    tools:overrideLibrary="com.squareup.picasso.picasso" />

Android