68
votes

Manifeste de fusion échouée ciblage Android 12

En utilisant Android Studio 4.2.1, après avoir modifié la cible SDK sur Android 12 dans mon fichier build.gradle, j'obtiens une fusion défaillante avec plusieurs erreurs, voir les journaux Erreur.

Les erreurs affichées dans l'onglet manifeste fusionné sont les suivantes:

android {
    compileSdkVersion("android-S")
    buildToolsVersion "30.0.3"

    defaultConfig {
        ...
        minSdkVersion 23
        targetSdkVersion("S")
        ...
}

Cependant, la balise Android: exportée est déjà appliquée dans mon fichier AndroidManifest.xml. Je n'ai qu'une seule activité. Pas de services ni récepteurs de diffusion. Voir ci-dessous:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mydomain.myapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <application
        android:name="com.mydomain.myapp.MyApplication"
        android:allowBackup="false"
        tools:replace="allowBackup"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.mydomain.myapp.ui.MainActivity"
            android:exported="true">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" />
    </application>

</manifest>


11 commentaires

Êtes-vous sûr que le manifeste indiqué dans l'onglet manifeste fusionné ne contient pas de composants supplémentaires? Les bibliothèques peuvent apporter des activités, des services et des récepteurs.


@Commonsware Le problème semble effectivement être causé par des bibliothèques tierces manquant la balise Android: exportée . L'onglet manifeste fusionné montrait vide ("rien à montrer") parce que la fusion a échoué, j'ai donc dû reconstruire avec une cible ci-dessous Android 12 pour enquêter. Merci!


C'est intéressant et ressemble à un bug / limitation en studio. Même s'il ne peut pas fournir toutes les fonctionnalités de l'onglet manifeste fusionné normal, il devrait au moins montrer ce que le manifeste fusionné contient, juste pour des scénarios comme celui-ci.


@Commonsware est d'accord. Ce serait également bien si les erreurs dans le panneau latéral droit pouvaient pointer du composant provoqué l'erreur. Pour ajouter à la confusion, en haut du panneau latéral droit, il a lu: "Autres fichiers manifestes (inclus dans la fusion, mais n'a pas contribué à aucun éléments)" que j'ai interprété comme "d'autres fichiers manifestes ne sont pas la source de l'erreur .


Si cela ne vous dérange pas que je demande ... quelles étaient les bibliothèques qui vous ont donné ces résultats? Je voudrais essayer de reproduire le problème et peut-être déposer un rapport de bogue (si vous ne l'avez pas déjà fait). Merci!


@Commonsware, j'ai déjà créé des PR pour les bibliothèques!


Désolé, je voulais dire que je cherchais à déposer un rapport de bogue contre Studio, pour ne pas avoir affiché le manifeste fusionné en raison des messages de peluche.


Laissez-nous Continuez cette discussion dans le chat .


@Commonsware Qu'en est-il des bibliothèques tierces qui sont requises par un projet, mais qui ne sont pas mises à jour pour tester Android 12 en spécifiant l'indicateur Android: exporté ? Je travaille sur un grand cadre avec beaucoup de dépendances et je voudrais tester Android 12. Je sais que certaines des LIB ne mettront pas à jour les manifestes de sitôt. Devrions-nous examiner la fusion manifeste échouée et remplacer explicitement toutes les intentions qui n'ont pas encore définie leur indicateur exporté ?


@ Dell116: "Devrions-nous regarder la fusion manifeste échouée et remplacer explicitement toutes les intentions qui n'ont pas encore définie leur drapeau exporté?" -- très probablement oui. Vous devriez être en mesure d'ajouter des entrées à votre propre manifeste, avec la même balise et Android: Name Valeurs, paramètre Android: exporté = "true" , dans votre module d'application .


J'ai récemment migré mes applications vers Android 12, et oui j'ai fait face à tous ces problèmes, voici la solution de voyage de migration: medium.com/native-mobile-bits/…


9 Réponses :


153
votes

Le problème a été causé par 3 activités manquant l'attribut Android: exporté dans le AndroidX.Test: Core version de la bibliothèque 1.3.0 . La mise à niveau vers la version 1.4.0-beta01 Correction du problème.

Si vous obtenez des erreurs après avoir ciblé Android 12, le moyen le plus simple de déboguer est à:

  • Backgrade vers une version sdk antérieure
  • Rebuild Project
  • Après une version réussie, ouvrez AndroidManifest.xml de votre projet.
  • En bas de la fenêtre, cliquez sur l'onglet manifeste fusionné
  • Recherchez un qui inclut une balise et il manque le Android: Attribut exporté

Si vous souhaitez vous assurer que ces activités sont le problème, ajoutez-les directement au fichier AndroidManifest.xml Ajout et essayez de reconstruire le projet.

Donc, si manque le Android: exporté Attribut, ajoutez-le à votre fichier AndroidManifest.xml comme SO:

<activity 
 android:name="com.domain.ProblemActivity"
 android:exported="true" >

Rebuild Cibler Android 12 et si cela fonctionne, vous avez trouvé le bug!

Merci @mikepenz pour m'avoir pointé dans la bonne direction.


11 commentaires

Merci pour le conseil. J'ai pu découvrir l'activité qui manquait l'attribut exporté. C'était en effet une activité d'une bibliothèque tierce qui a été automatiquement ajoutée au manifeste.


Ces étapes ont définitivement aidé. J'ai oublié que l'utilisation du du composant de navigation génère également la balise . Vous devrez également ajouter la propriété exportée à ces activités.


Lorsque je modifie les libs tiers du manifeste pour ajouter la export , cela n'enregistre pas le fichier pourquoi? Dois-je inclure manuellement toutes les activités à mon manifeste?


@ David.c essayez-vous de modifier les fichiers manifestes des bibliothèques? Parce que je ne pense pas que vous puissiez le faire. Quelqu'un me corrige si je me trompe. Ensuite, vous avez 2 options: ajoutez toutes les activités de problème au fichier manifeste de votre application ou contactez les auteurs des bibliothèques pour leur faire savoir qu'ils devraient ajouter l'attribut pour éviter tout problème avec Android 12.


@ TB_CAR_04 Je suis sur un grand projet, je n'avais pas d'autre choix que d'ajouter 50 activités à mon fichier manifeste, que ce n'est pas la meilleure solution. Le meilleur est d'attendre que les auteurs des LIB mettent à jour leur manifeste pour Android 12.


Je ne travaille pas dans mon projet. Je n'ai aucune activité avec un filtre d'intention sans attribut exporté, mais j'ai toujours cette erreur de compilation! Comment puis-je trouver où est exactement l'activité sans attribut exporté?


J'ai pu déterminer ce qui causait le problème dans mon projet en exécutant gradlew processDebugAndroidTestManifest --debug et en faisant défiler jusqu'à l'endroit où les "applications ciblant Android 12 et plus ..." " Dans mon cas, la ligne d'information au-dessus, il montrait la fusion de l'espresso qui devait être mise à jour au 3.4.0. Une autre chose qui devait être mise à jour était WorkManager.


Si vous avez toujours échoué après l'ajout à , vous devez également ajouter Android: exporté vers votre récepteur stackoverflow.com/a/68605049/9101876


Dans mon cas "Androidx.test.ext: Junit: 1.1.1 'l'obligeait, supprimant cette dépendance l'a résolu. Merci pour cette réponse cependant, cela m'a aidé à examiner ma liste de dépendances!


J'ai rencontré ce problème lorsque je tente d'exécuter des tests pendant (navigation / test en composiy) CodeLabs. Comme @Blake l'a dit, j'ai couru ./ gradlew processDebugAndroidTestManifest --debug . Pour moi, c'était expresso-contrib et expresso-core . Appuyez sur Ctrl + Alt + Shift + S , en sélectionnant les dépendances , puis en sélectionnant la version la plus élevée disponible (qui au moment de cela, était < i> 3.5.0-alpha03 ), a résolu le problème après avoir suivi avec appliquer et ok .


Je ne comprends pas pourquoi nous ne pouvons pas facilement trouver qu'un fichier manifeste a un problème



2
votes

J'ai eu ce problème, le trouvez par:

  • S'il y a une activité, un service, un récepteur ou un fournisseur qui n'a pas exporté Â Attribut dans votre fichier AndroidManifest , ajoutez l'attribut ci-dessous dans cette activité, service, récepteur ou fournisseur

android:exported="false or true"


0 commentaires

0
votes

N'oubliez pas de le mettre également dans la balise de service

    <service
        android:name=".service.MyIME"
        android:exported="true"
        android:permission="android.permission.BIND_INPUT_METHOD">
        <meta-data
            android:name="android.view.im"
            android:resource="@xml/method" />

        <intent-filter>
            <action android:name="android.view.InputMethod" />
        </intent-filter>
    </service>


0 commentaires

6
votes

Si votre application cible Android 12 ou plus et contient des activités, des services ou des récepteurs de diffusion qui utilisent des filtres d'intention, vous devez explicitement déclarer l'attribut Android: exporté pour ces composants d'application. Afin de résoudre ce problème, nous devons suivre ces étapes:

  1. Nous devons localiser le AndroidManifest.xml dans le dossier principal.
  2. Android> App> src> main> androidmanifest.xml

     Entrer la description de l'image ici

    1. Nous devons ajouter Android: exporté = "" et définir une valeur booléenne à l'intérieur de ces guillemets. Maintenant, vous pouvez demander quand dois-je ajouter Android: exported = "true" ou Android: exported = "false" aux activités, services ou récepteurs diffusés qui utilisent Filtres d'intention. Si le composant de l'application inclut la catégorie Launcher, définissez Android: Exporté vers true. Dans la plupart des autres cas, définissez Android: exporté vers FALSE.

    2. Ceci est un exemple de la façon dont il devrait ressembler dans votre AndroidManifest.xml

    3. <service android:name="com.example.app.backgroundService"
               android:exported="false">
          <intent-filter>
              <action android:name="com.example.app.START_BACKGROUND" />
          </intent-filter>
      </service>

      Vous pouvez consulter plus d'informations sur ce sujet en suivant ce lien:

      Exportation de composants plus sûrs pour Android 12


0 commentaires

0
votes

nettoyer et reconstruire le projet a fonctionné pour moi


0 commentaires

0
votes

J'ai eu mon activité correctement configurée avec 'exported = true' et j'avais toujours le problème suivant:

    <activity
        android:name="androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity"
        android:exported="true"
        android:theme="@android:style/Theme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity"
        android:exported="true"
        android:theme="@android:style/Theme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyFloatingActivity"
        android:exported="true"
        android:theme="@android:style/Theme.Dialog" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>

Alors je suis tombé sur ce post github, qui pourrait expliquer pourquoi cela se produit et appliqué La solution de contournement yogurtearl suggère et cela a fonctionné pour moi.

https://github.com/android/android-test/issues/832

Cela va essentiellement comme ceci:

comme un Solution, en mettant cela dans l'application / src / debug / androidmanifest.xml, il obligera les ceux-ci à lancer dans le même processus de test.

Installation failed due to [...] androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present

et a ajouté le 'exporté = true' à eux.


0 commentaires

0
votes

Si vous utilisez dexguard , vous devez mettre à jour la dernière version qui est 9.2.11 (19-01-2022) pour le moment.

Citation des notes de version:

Ajouter une configuration par défaut pour garder l'attribut exporté selon les applications ciblant Android 12.


0 commentaires

5
votes

Si vous améliorez votre studio Android à Bumblebee 2021.1.1. Les modifications ci-dessous sont nécessaires à faire: Étape 1: Votre TargetsDkversion doit être 30 ou plus Étape 2: Mettez à jour votre bibliothèque appcompat à implémentation 'Androidx.appCompat: AppCompat: 1.4.1'

Étape 3: Dans le fichier AndroidManifest, ajoutez Android: exporté = true à votre lanceur d'activités.


0 commentaires

0
votes

comme spécifié dans le lien suivant- https://devener.android.com/about/versions/ 12 / Behavior-Changes-12 # exporté , les composants d'Android qui utilisent des filtres d'intention doivent explicitement définir l'exportation des composants, à l'échelle de laquelle votre application ne peut pas être installée sur un appareil qui s'exécute sur Android 12 ou supérieur. Les composants de l'application comprennent des activités, des services, des récepteurs de diffusion et des fournisseurs de contenu.

Si le composant de l'application inclut la catégorie de lanceur, définissez Android: exporté vers true. Dans la plupart des autres cas, définissez Android: exporté vers FALSE.

Même après avoir défini la balise Android: exportée, si vous faites face au problème défaillant de la fusion manifeste, vérifiez toutes les bibliothèques que vous utilisez dans votre application. Ouvrez les bibliothèques externes dans la vue du projet du studio Android et essayez de vérifier tous les fichiers manifestes des bibliothèques que vous avez inclus dans votre projet. N'importe laquelle de ces bibliothèques n'a peut-être pas été mise à jour selon Android 12. Donc, si vous trouvez un fichier manifeste de la bibliothèque avec une balise exportée manquante, essayez de modifier le fichier et ajoutez-y cette balise. J'espère que cela pourrait aider à supprimer l'erreur de fusion manifeste.


0 commentaires