Erreur d'installation: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED?

93

Je développe une petite application qui répertorie toutes les applications présentes / installées sur l'appareil Android. Mais j'obtiens l'erreur ci-dessous pendant que j'essaye d'exécuter le code.

Erreur d'installation: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

S'il vous plaît, quelqu'un peut-il m'aider à résoudre cette erreur.

SP
la source
1
Il existe de nombreuses erreurs dans le fichier manifest.xml qui peuvent provoquer ce code d'erreur, voir la réponse de la liste d'erreurs PackageParser.java ci-dessous.
Ribo
1
Vous n'avez pas accepté de réponse?
Shieldgenerator7
Suivez ce lien Vous obtiendrez votre réponse stackoverflow.com/questions/16015033/…
Sritam Jagadev
Vérifiez ce lien pour une réponse claire
Vishnuvathsan
Si vous avez différents packages et classes dans votre projet, changez le nom du package des lettres majuscules aux lettres minuscules.Le nom du package doit commencer par des lettres minuscules
Waheed Akhtar

Réponses:

79

Il peut y avoir une autre raison à cette erreur. L'attribut

android:taskAffinity="string" 

Devrait toujours commencer par un point, comme:

android:taskAffinity=".string" 
Andy
la source
4
Problème résolu pour moi mais, où puis-je trouver ces informations dans la documentation? il n'y a rien sur un DOT ici: developer.android.com/guide/topics/manifest/…
Beto Caldas
68

Le nom de l'activité doit être précédé de "." dans votre fichier manifeste.

suresha Chilukuri
la source
dans le manifeste, vous avez déclaré l'attribut package avec package, donc lorsque vous créez une activité, vous mettez "." pour être précédé du nom du package, vous pouvez également taper le nom complet de l'activité comme: "com.example.test.Activity_Name", ou ".Activity_Name"
Amt87
42

J'avais cette erreur car j'avais des lettres majuscules dans le nom de mon package comme celui-ci

Com.Example.packagename

après l'avoir changé en quelque chose comme

com.example.packagename

c'était résolu

Samuel
la source
cela a résolu mon problème. Ma classe d'activité était sous un package appelé Activités, et je l'ajoute au manifeste avant que cette erreur n'apparaisse. lorsque j'ai changé le nom du package d'activités en activités, le problème a été résolu. Merci
alicanbatur
2
Je pense que vous pouvez avoir des majuscules dans le nom du package, cependant, la première lettre du nom du package ne peut pas être une majuscule. Donc "myActivity" = OK mais "MyActivity" = Not OK
Gene
29

Le code d'erreur INSTALL_PARSE_FAILED_MANIFEST_MALFORMED est renvoyé par PackageParser.java lorsqu'il détecte l'une d'un grand nombre d'erreurs dans le fichier manifest.xml.

Pour isoler l'erreur, regardez dans logcat (lorsque vous exécutez la commande 'adb install foo.apk'). Dans le problème que j'ai rencontré, logcat contenait:

W/ActivityManager(  360): No content provider found for permission revoke: file:///data/local/tmp/foo.apk
D/Finsky  (32707): [1] PackageVerificationReceiver.onReceive: Verification requested, id = 6
D/Finsky  (32707): [1] WorkerTask.onPreExecute: Verification Requested for id = 6,   data=file:///data/local/tmp/foo.apk flags=112 fromVerificationActivity=false
W/PackageParser(32707): /data/local/tmp/foo.apk (at Binary XML file line #214): <provider> does not include authorities attribute
D/Finsky  (32707): [716] PackageVerificationService.getPackageInfo: Cannot read archive for file:///data/local/tmp/foo.apk in request id=6
D/Finsky  (32707): [1] PackageVerificationReceiver.onReceive: Verification requested, id = 6
W/ActivityManager(  360): No content provider found for permission revoke: file:///data/local/tmp/foo.apk
I/PackageManager(  360): Copying native libraries to /data/app-lib/vmdl1205566381
W/PackageParser(  360): /data/app/vmdl1205566381.tmp (at Binary XML file line #214): <provider> does not include authorities attribute

Dans la quatrième ligne ci-dessus, vous pouvez voir que PackageParser se plaint que la ligne # 214 du fichier manifest.xml "<provider> n'inclut pas l'attribut des autorités" . Consultez la liste ci-dessous de tous les cas dans PackageParser qui renvoie ce code d'erreur. (PackageParser est la seule classe qui produit le code d'erreur PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED)

Dans mon cas, le message "<provider> n'inclut pas l'attribut des autorités" est produit par la ligne 2490 de PackagerParser.java dans la fonction parseProvider appelée par parseApplication.


Depuis la version 4.1.1 de frameworks / base / core / java / android / content / pm / PackageParser.java, PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED est référencé sur ces lignes dans ces méthodes. Si le numéro de ligne du code source est suivi d'une chaîne entre guillemets, c'est le message imprimé dans logcat. si le numéro de ligne est suivi d'une expression Java qui est le code qui a provoqué le renvoi de ce code d'erreur, cette fonction doit être examinée pour voir ce qui a provoqué le renvoi du message d'erreur. Dans quelques cas, je n'ai pas pu isoler la cause de l'erreur à un appel de méthode spécifique.

in parsePackage:
  536:  (only used in 'core apps' with no 'pkg')
  973:  "<manifest> has more than one <application>"
  1275: "Bad element under <manifest>: "      --if RIGID_PARSER

in parsePermissionGroup:
  1464: !parsePackageItemInfo(owner, perm.info, outError,
    "<permission-group>", sa,
    com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
    com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
    com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon,
    com.android.internal.R.styleable.AndroidManifestPermissionGroup_logo)
  1482: !parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
    outError)

in parsePermission:
  1506: !parsePackageItemInfo(owner, perm.info, outError,
    "<permission>", sa,
    com.android.internal.R.styleable.AndroidManifestPermission_name,
    com.android.internal.R.styleable.AndroidManifestPermission_label,
    com.android.internal.R.styleable.AndroidManifestPermission_icon,
    com.android.internal.R.styleable.AndroidManifestPermission_logo)
  1530: "<permission> does not specify protectionLevel"
  1541: "<permission>  protectionLevel specifies a flag but is not based on signature type"
  1548: !parseAllMetaData(res, parser, attrs, "<permission>", perm, outError)

in parsePersmissionTree:
  1572: !parsePackageItemInfo(owner, perm.info, outError,
    "<permission-tree>", sa,
    com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
    com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
    com.android.internal.R.styleable.AndroidManifestPermissionTree_icon,
    com.android.internal.R.styleable.AndroidManifestPermissionTree_logo)
  1585: "<permission-tree> name has less than three segments: "+perm.info.name
  1595: !parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, outError)

in parseInstrumentation:
  1625: new Instrumentation(mParseInstrumentationArgs, new InstrumentationInfo())
  1648: "<instrumentation> does not specify targetPackage"
  1654: !parseAllMetaData(res, parser, attrs, "<instrumentation>", a, outError)

in parseApplication:
  1678: buildClassName(pkgName, name, outError) == null
  1851: (Set by various other functions)
  1869: parseActivity(owner, res, parser, attrs, flags, outError, false, hardwareAccelerated) == null
  1878: parseActivity(owner, res, parser, attrs, flags, outError, true, false) == null
  1887: parseService(owner, res, parser, attrs, flags, outError) == null
  1896: parseProvider(owner, res, parser, attrs, flags, outError) == null
    2484: "Heavy-weight applications can not have providers in main process"
    2890: "<provider> does not incude authorities attribute"
  1905: parseActivityAlias(owner, res, parser, attrs, flags, outError) == null
  1917: parseMetaData(res, parser, attrs, owner.mAppMetaData, outError) == null
  1969: "Bad element under <application>: "+tagName

Il est regrettable que vous deviez fouiller dans logcat et dans la source pour déterminer ce qui cause un problème.

Ribo
la source
1
merci de nous aider à comprendre comment résoudre le problème général en plus de donner une solution spécifique.
Vinay W
1
Il y a plusieurs raisons à cette exception. C'est la réponse la plus logique.
Meghal Shah
1
Merci - dans mon cas, j'ai eu un IntentFilter.MalformedMimeTypeExceptionque j'ai manqué.
CzarMatt
C'est de loin la bonne réponse. Quelle est l'utilité de logcat?
Krishnabhadra
10

Vérifiez le nom de votre activité dans le fichier manifeste

ou le nom du package dans l'activité / la classe principale

<activity android:name="MainActivity"></activity>
Diptendu
la source
10

J'ai le même problème mais lorsque j'appelle un processus comme celui-ci:

<service
    android:name="com.dexode.tama.AppService"
    android:process="screen" >
</service>

Quand je change pour:

<service
    android:name="com.dexode.tama.AppService"
    android:process=":screen" >
</service>

Tout commence à fonctionner.

Dawid Drozd
la source
2
En ajoutant le «:», vous avez changé la sémantique du code. Dans le second cas, l'application créera un nouveau processus pour le service qui n'est disponible que pour cette application. developer.android.com/guide/topics/manifest/… . Au lieu de cela, l'erreur peut être corrigée en mentionnant le nom complet du package au lieu du mot «screen».
shshnk
10

J'ai rencontré le même problème il y a un certain temps, dans la documentation Android, ils ont dit que si vous n'utilisez pas ":" comme préfixe, android:processvous devriez utiliser une lettre minuscule, mais ils ne l'ont jamais dit, alors ce devrait être un package comme process nom, commecom.company.app.services.MyService

4gus71n
la source
1
Même moi, j'ai eu le même problème. Ils auraient dû mentionner que nous devons inclure le nom du paquet lorsque vous n'utilisez pas ':'
shshnk
8

Tout nom tel que android:name, android:processdoit être sous forme de nom de package: commence par a..z, se combine avec d'autres avec ., ne se termine pas par ....


la source
@IgorG. Désolé j'ai perdu mon point :-( Mais le nouveau SDK a supprimé ce champ ( ici ).
1
Je vous remercie. J'ai appelé un processus de cette manière: android:process="com.my_pack.services.MyServiceProcess"(com.my_pack.services est le package où se trouve mon service) et l'erreur d'installation ne s'affichera pas après cela.
Maksim Dmitriev
8

Mon problème était que j'avais écrit (notez le - contre le _):

<meta_data ... /> 
<!-- instead of -->
<meta-data ... />

sous une activité. Cela pourrait également être la cause de votre problème.

Ymabob
la source
3

J'ai la même erreur! avait une balise d'autorisation vide et cela causait le problème!

bhumika singh
la source
Veuillez ajouter plus de détails à votre réponse
kolossus
3

Je rencontre le même problème après avoir ajouté des localisations

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.package"
    android:versionCode="10"
    android:versionName="@string/version_name" >

La chaîne est @string/version_nameaccidentellement passée dans l'un des nouveaux fichiers de chaînes localisés ajoutés (elle n'apparaît que dans les nouveaux fichiers). Après avoir vérifié toutes les localisations et supprimé @string/version_namede chaque fichier à l'exception de la locale eng locale, tout a fonctionné à nouveau

virus
la source
3

Lisez les journaux de votre appareil Android pour diagnostiquer cette erreur. Attendez-vous à une ligne «W / PackageParser» expliquant le problème.

Dan Fabulich
la source
3
<activity/>

doit être défini AVANT

<activity-alias/>
Ajvo
la source
J'aurais aimé pouvoir voter à nouveau. Deuxième fois que cette réponse m'a aidé
cottonBallPaws
3

J'ai eu cette erreur car le code ci-dessous

<intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*" android:host="*" android:scheme="content" />
            </intent-filter>

Quand j'ai changé android:mimeType="*"pour android:mimeType="*/*"corriger cette erreur.

Ke Di
la source
3

le dossier de nom de l'activité créé doit être en minuscules, n'utilisez pas de majuscules pour le nom du dossier d'activité .... il est toujours préférable d'utiliser des minuscules.

Khan
la source
3

cela peut être pour de nombreuses raisons, mais pour moi, cela a été résolu en changeant le nom du package avec un nom en minuscule (le nom du package était Activités, résolu avec des activités).

Alex
la source
2

Si vous utilisez multidex dans le manifeste, il doit être ajouté avec une valeur ou une ressource. Comme..

<meta-data android:name="android.support.multidex.MultiDexApplication"
android:value="@string/yourValue" />

OU

<meta-data android:name="android.support.multidex.MultiDexApplication"
android:resource="@string/yourValue" />

puis nettoyez le projet et réinstallez l'application.

Sam
la source
2

Dans mon cas, je faisais référence à une icône utilisant un attribut comme celui-ci:

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="?attr/ic_notify" />

au lieu du dessinable:

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_notify" />

J'utilise cet attribut à plusieurs endroits mais il semble que cela ne fonctionne pas dans le manifeste.

M. Sameer
la source
Exactement mon cas. J'ai besoin que ce soit une couleur différente selon les préférences de l'utilisateur. Malheureusement, Android: la ressource n'accepte pas les attributs ...
Elyakim Levi
2

Je crée une nouvelle application et la cible sur Android Pie . Tout fonctionnait bien et ces derniers temps, j'ai constaté que mon application ne s'installe pas sur Android Naught et sous la version Android OS.

Lors de l'installation, je vois un message d'échec

L'installation a échoué avec le message INSTALL_PARSE_FAILED_MANIFEST_MALFORMED.

Donc, les corrections que j'ai apportées sont les suivantes et elles doivent toutes être effectuées AndroidManifest.xmluniquement dans un fichier.

Pour l'activité, le service, le récepteur et tous

Instead of:
    android:name=".service.MyService"

Used: 
    android:name="com.complete.appicationID.service.MyService"

Pour les autorisations de manifeste

Instead of: 
     <uses-permission android:name="{applicationId}.permission.MAPS_RECEIVE" />
     <permission
         android:name="{applicationId}.permission.MAPS_RECEIVE"
         android:protectionLevel="signature" />

Used:
     <uses-permission android:name="com.complete.appicationID.permission.MAPS_RECEIVE" />
     <permission
         android:name="com.complete.appicationID.permission.MAPS_RECEIVE"
         android:protectionLevel="signature" />

Ce sont tous les changements que j'ai dû effectuer pour que cela fonctionne également pour les appareils de version inférieure.

Harpreet
la source
Dans Xamarin android corrigé sur l'attribut de nom d'activité. C'est du travail pour moi
Sovary
2

La cible <activity>doit être spécifiée avant le <activity-alias>.

Eugen Pechanec
la source
1

Il peut y avoir d'autres fichiers mal formés mais qui ne sont pas mis en surbrillance dans l'EDI, par exemple les res / values ​​/ strings auxquels le manifeste peut faire référence pour des choses comme les étiquettes.

m_cheung
la source
1

Dans mon cas, la cause était l'absence d'attribut android: name dans <activity-alias>. Il est obligatoire pour <activity-alias> bien qu'il ne doive pas nommer une classe existante. Le plus drôle, c'est que le projet se compile sans problème.

Gena Batsyan
la source
1

Mon problème était le suivant:

Je spécifiais mes autorisations de la manière suivante et cela ne fonctionnait pas.

<permission android:name="android.permission.INTERNET">
    <meta-data />
</permission>
<permission android:name="android.permission.ACCESS_NETWORK_STATE">
    <meta-data />
</permission>

Cela fonctionnait bien lorsque je l'ai changé comme suit:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
shahensha
la source
1

J'avais cette erreur parce que j'avais la ligne ci-dessous.

android:protectionLevel="developer"

Après que je l'ai changé en

android:protectionLevel="signature"

le problème a été résolu

Swalih
la source
1

Après avoir lutté avec ce problème, j'ai découvert que toutes les valeurs utilisées comme valeur de ressource de chaîne (aka @ string /) dans les manifestes (des bibliothèques que vous utilisez également) ne sont pas autorisées à faire partie de strings.xml de localisations . Exemple: si votre fichier manifeste utilise @ string / app_name, la définition de string / app_name n'est autorisée que dans vos valeurs par défaut / strings.xml et non dans le fichier string.xml alternatif que vous fournissez pour les localisations. J'espère que cela aide ...

Ozzz
la source
1

J'ai eu la même erreur. Je n'avais pas de caractère majuscule dans le nom de mon package / application et nettoyer le projet et d'autres solutions ne m'ont pas non plus aidé. après tout, j'ai créé un nouveau projet et copié mes affaires dans le nouveau étape par étape et vérifiez si le problème apparaît. après tout, j'ai eu un projet agréable et sans erreur sans aucune redondance. Parfois, il est difficile de trouver la source de cette erreur, il est donc plus facile d'adopter une autre approche.

j'espère que cela aide quelqu'un!

Mehran Zamani
la source
1

J'ai rencontré cette erreur lorsque j'ai mis la classe Application dans un mauvais package!

farhad.kargaran
la source
1

Vous n'avez probablement pas suivi les règles de syntaxe d'une balise. par exemple:

<meta-data
      android:name="preloaded_fonts"/>

Cette balise est incomplète et provoque cette erreur.

Présentation du manifeste d'application

gadolf
la source
1

Utiliser android:resourceau <meta-data>lieu de android:srcetandroid:srcCompat

Bibin Johny
la source
1

Je sais qu'il est tard pour répondre ici mais je fais une erreur étrange alors postez ma réponse si cela aide quelqu'un, dans mon cas par erreur, j'ai ajouté l'activité du lanceur principal en tant qu'alias

   <activity-alias
        android:name=".activities.SplashActivity"
        android:targetActivity=".activities.SplashActivity">

        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity-alias>

Donc, lorsque j'essaie d'exécuter mon application, une erreur s'affiche

Erreur lors de l'installation de l'APK

Échec [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]

Je viens de supprimer le mot «-alias» de l'enregistrement d'activité et mon application démarre avec succès.

Ajay Pandya
la source