Błąd instalacji: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED?


95

Tworzę małą aplikację, która zawiera listę wszystkich aplikacji obecnych / zainstalowanych na urządzeniu z systemem Android. Ale pojawia się poniższy błąd, gdy próbuję uruchomić kod.

Błąd instalacji: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

Czy ktoś może mi pomóc rozwiązać ten błąd.


1
W pliku manifest.xml jest wiele błędów, które mogą powodować ten kod błędu. Zobacz odpowiedź na listę błędów PackageParser.java poniżej.
Ribo

1
Nie przyjąłeś odpowiedzi?
shieldgenerator7

Kliknij ten link Otrzymasz odpowiedź stackoverflow.com/questions/16015033/ ...
Sritam Jagadev

Sprawdź ten link, aby uzyskać jasną odpowiedź
Vishnuvathsan

Jeśli masz różne pakiety i zajęcia w swojej project.Change nazwą pakietu z listów do obniżenia górnych nazwę letters.Package powinien zaczynać się od niższych liter
Waheed Akhtar

Odpowiedzi:



69

Nazwa działania powinna być poprzedzona przedrostkiem „.” w pliku manifestu.


w Manifeście zadeklarowałeś atrybut pakietu z pakietem, więc podczas tworzenia aktywności wstawiasz "." aby być poprzedzona nazwą pakietu, możesz również wpisać pełną nazwę działania, na przykład: „com.example.test.Activity_Name” lub „
.Activity_Name

43

Miałem ten błąd, ponieważ nazwa mojego pakietu zawierała duże litery

Com.Example.packagename

po tym, jak zmieniłem to na coś takiego

com.example.packagename

został rozwiązany


to rozwiązało mój problem. Moja klasa aktywności znajdowała się w pakiecie o nazwie Działania i dodaję ją do manifestu, zanim pojawił się ten błąd. kiedy zmieniłem nazwę pakietu działań na działania, rozwiązano. Dzięki
alicanbatur

2
Myślę, że w nazwie paczki mogą znajdować się duże litery, jednak pierwsza litera w nazwie paczki nie może być wielką literą. Tak więc „myActivity” = OK, ale „MyActivity” = Nie OK
Gene

29

Kod błędu INSTALL_PARSE_FAILED_MANIFEST_MALFORMED jest zwracany przez PackageParser.java, gdy wykryje dowolny z dużej liczby błędów w pliku manifest.xml.

Aby zidentyfikować błąd, zajrzyj do logcat (po wykonaniu polecenia „adb install foo.apk”). W napotkanym problemie logcat zawierał:

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

W czwartym wierszu powyżej widać, że PackageParser zgłasza skargę, że wiersz 214 pliku manifest.xml „<provider> nie zawiera atrybutu uprawnień” . Zobacz poniższą listę wszystkich przypadków w PackageParser, które zwracają ten kod błędu. (PackageParser jest jedyną klasą, która generuje kod błędu PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED)

W moim przypadku komunikat „<provider> nie zawiera atrybutu uprawnień” jest generowany w linii 2490 PackagerParser.java w funkcji parseProvider wywoływanej przez parseApplication.


Z wersji 4.1.1 frameworks / base / core / java / android / content / pm / PackageParser.java w tych metodach znajdują się odwołania do PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED. Jeśli po numerze linii kodu źródłowego występuje ciąg znaków w cudzysłowie, to jest to komunikat drukowany w logcat. jeśli po numerze wiersza następuje wyrażenie Java będące kodem, który spowodował zwrócenie tego kodu błędu, należy zbadać tę funkcję, aby zobaczyć, co spowodowało zwrócenie komunikatu o błędzie. W kilku przypadkach nie mogłem wyodrębnić przyczyny błędu do jednego wywołania metody.

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

Szkoda, że ​​musisz przeszukać logcat i źródło, aby dowiedzieć się, co powoduje problem.


1
dziękujemy za pomoc w zrozumieniu, jak rozwiązać ogólny problem, oprócz podania konkretnego rozwiązania.
Vinay W

1
Ten wyjątek ma wiele powodów. To najbardziej logiczna odpowiedź.
Meghal Shah

1
Dziękuję - w moim przypadku miałem to IntentFilter.MalformedMimeTypeException, co przegapiłem.
CzarMatt

To zdecydowanie poprawna odpowiedź. Jak przydatny jest logcat?
Krishnabhadra

10

Sprawdź nazwę swojego działania w pliku manifestu

lub nazwa pakietu w głównym działaniu / klasie

<activity android:name="MainActivity"></activity>

10

Mam ten sam problem, ale kiedy dzwonię do tego procesu:

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

Kiedy zmieniam na:

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

Wszystko zaczyna działać.


2
Dodając „:” zmieniłeś semantykę kodu. W drugim przypadku aplikacja utworzy nowy proces dla usługi, która jest dostępna tylko dla tej aplikacji. developer.android.com/guide/topics/manifest/… . Zamiast tego błąd można naprawić, podając pełną nazwę pakietu zamiast samego słowa „screen”.
shshnk

10

Napotkałem ten sam problem jakiś czas temu, w dokumentach Androida powiedzieli, że jeśli nie używasz ":" jako prefiksu android:process, powinieneś użyć małej litery, ale nigdy tego nie powiedzieli, to powinien być pakiet podobny do procesu imię, na przykładcom.company.app.services.MyService


1
Nawet ja miałem ten sam problem. Powinni byli wspomnieć, że musimy dołączyć nazwę pakietu, gdy nie używamy ':'
shshnk

8

Dowolna nazwa taka jak android:name, android:processpowinna mieć formę nazwy pakietu: zaczyna się od a..z, łączy się z innymi ., nie kończy się na ....


@IgorG. Przepraszam, że straciłem punkt :-( Ale nowy SDK usunął to pole ( tutaj ).

1
Dziękuję Ci. android:process="com.my_pack.services.MyServiceProcess"Nazwałem proces w taki sposób: (com.my_pack.services to pakiet, w którym znajduje się moja usługa) i błąd instalacji nie pojawi się po tym.
Maksim Dmitriev

8

Mój problem polegał na tym, że napisałem (zwróć uwagę na - w porównaniu z _):

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

w ramach działania. Może to być również przyczyną Twojego problemu.


3

Mam ten sam błąd! miał pusty znacznik pozwolenia i to powodowało problem!


Dodaj więcej szczegółów do swojej odpowiedzi
kolossus

3

Po dodaniu lokalizacji napotykam na ten sam problem

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

Ciąg @string/version_nameprzypadkowo przeszedł do jednego z nowo dodanych zlokalizowanych plików łańcuchowych (pojawił się tylko w nowych plikach). Po sprawdzeniu wszystkich lokalizacji i usunięciu @string/version_namez każdego pliku oprócz lokalizacji eng, wszystko znów działało


3

Przeczytaj dzienniki urządzenia z Androidem, aby zdiagnozować ten błąd. Spodziewaj się wiersza „W / PackageParser” wyjaśniającego problem.


3
<activity/>

należy zdefiniować PRZED

<activity-alias/>

Chciałbym móc ponownie zagłosować za tym. Drugi raz pomogła mi ta odpowiedź
cottonBallPaws

3

Miałem ten błąd, ponieważ kod poniżej

<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>

Kiedy zmieniłem, android:mimeType="*"aby android:mimeType="*/*"naprawić ten błąd.


3

nazwa folderu utworzonego działania musi być małymi literami. Nie używaj wielkich liter jako nazwy folderu działań .... zawsze lepiej jest używać małych liter.


3

może to być z wielu powodów, ale dla mnie zostało to rozwiązane poprzez zmianę nazwy pakietu z nazwą małymi literami (nazwa pakietu to Działania, rozwiązane za pomocą działań).


2

Jeśli używasz multidex w manifeście, należy dodać do niego wartość lub zasób. Lubić..

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

LUB

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

następnie wyczyść projekt i ponownie zainstaluj aplikację.


2

W moim przypadku odnosiłem się do ikony przy użyciu takiego atrybutu:

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

zamiast rysowanego:

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

Używam tego atrybutu w kilku miejscach, ale wygląda na to, że nie działa w manifest.


Dokładnie moja sprawa. Potrzebuję innego koloru w zależności od preferencji użytkownika. Niestety, android: resource nie akceptuje atrybutów ...
Elyakim Levi,

2

Tworzę nową aplikację i kieruję ją na Android Pie . Wszystko działało dobrze i dobrze, a ostatnio odkryłem, że moja aplikacja nie instaluje się na Androida Naught i starszej wersji systemu operacyjnego Android.

Podczas instalacji widzę komunikat o błędzie

Instalacja nie powiodła się z komunikatem INSTALL_PARSE_FAILED_MANIFEST_MALFORMED.

Więc jakie poprawki, które zrobiłem, są następujące i wszystkie muszą być zrobione AndroidManifest.xmltylko w pliku.

Za działalność, usługę, odbiorcę i wszystko

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

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

Dla uprawnień Manifest

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" />

To były wszystkie zmiany, które musiałem wprowadzić, aby działał również na urządzeniach z niższą wersją.


W systemie Xamarin Android naprawiono atrybut nazwy działania. To działa dla mnie
Sovary


1

Mogą istnieć inne pliki, które są zniekształcone, ale nie są wyróżnione w środowisku IDE, na przykład res / values ​​/ strings, do których manifest może się odnosić w przypadku etykiet.


1

W moim przypadku przyczyną był brak atrybutu android: name w <activity-alias>. Jest to obowiązkowe dla <alias-aktywności>, chociaż nie może nazywać istniejącej klasy. Zabawne jest to, że projekt kompiluje się bez problemów.


1

Mój problem był następujący:

Określałem swoje uprawnienia w następujący sposób i to nie działało.

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

Działało dobrze, kiedy zmieniłem to na następujący:

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

1

Miałem ten błąd, ponieważ miałem wiersz poniżej.

android:protectionLevel="developer"

Po zmianie na

android:protectionLevel="signature"

problem został rozwiązany


1

Po zmaganiu się z tym problemem odkryłem, że wszystkie wartości, które są używane jako wartość zasobu ciągu (aka @ string /) w manifestach (bibliotek, których również używasz), nie mogą być częścią strings.xml lokalizacji . Przykład: jeśli twój plik manifestów używa @ string / nazwa_aplikacji, definicja ciągu / nazwa_aplikacji jest dozwolona tylko w domyślnych wartościach / strings.xml, a nie w alternatywnym pliku string.xml, który podajesz do lokalizacji. Mam nadzieję że to pomogło..


1

Miałem ten sam błąd. nie miałem wielkich liter w nazwie mojego pakietu / aplikacji i wyczyściłem projekt, a inne rozwiązania również mi nie pomogły. w końcu stworzyłem nowy projekt i krok po kroku kopiowałem swoje rzeczy do nowego i sprawdzałem, czy problem się pojawia. w końcu miałem ładny i wolny od błędów projekt bez żadnej redundancji. czasami trudno jest znaleźć źródło tego błędu, więc łatwiej jest zastosować inne podejście.

mam nadzieję, że to komuś pomoże!





1

Wiem, że jest późno na odpowiedź, ale popełniam dziwny błąd, więc napisz moją odpowiedź, jeśli komuś to pomoże, W moim przypadku przez pomyłkę Dodałem główną aktywność programu uruchamiającego jako 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>

Więc kiedy próbuję uruchomić aplikację, pojawia się błąd

Błąd podczas instalowania APK

Błąd [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]

Po prostu usunąłem słowo „-alias” z rejestracji aktywności i pomyślnie uruchomiłem moją aplikację.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.