ข้อผิดพลาดในการติดตั้ง: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED?


95

ฉันกำลังพัฒนาแอปพลิเคชันขนาดเล็กที่แสดงรายการแอปพลิเคชันทั้งหมดที่มีอยู่ / ติดตั้งบนอุปกรณ์ Android แต่ฉันได้รับข้อผิดพลาดด้านล่างในขณะที่ฉันพยายามเรียกใช้รหัส

ข้อผิดพลาดในการติดตั้ง: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

ได้โปรดผู้ใดก็ได้ช่วยฉันในการแยกแยะข้อผิดพลาดนี้


1
มีข้อผิดพลาดมากมายในไฟล์ manifest.xml ที่อาจทำให้เกิดรหัสข้อผิดพลาดนี้โปรดดูคำตอบรายการข้อผิดพลาด PackageParser.java ด้านล่าง
Ribo

1
คุณไม่ยอมรับคำตอบ?
shieldgenerator7

ตามลิงค์นี้คุณจะได้รับคำตอบ stackoverflow.com/questions/16015033/…
Sritam Jagadev

ตรวจสอบลิงก์นี้เพื่อดูคำตอบที่ชัดเจน
Vishnuvathsan

หากคุณมีแพ็คเกจและคลาสที่แตกต่างกันในโปรเจ็กต์ของคุณเปลี่ยนชื่อแพ็กเกจจากตัวอักษรตัวบนเป็นตัวอักษรตัวล่างชื่อแพ็กเกจควรขึ้นต้นด้วยตัวอักษรตัวล่าง
Waheed Akhtar

คำตอบ:


80

อาจมีสาเหตุอื่นสำหรับข้อผิดพลาดนี้ แอตทริบิวต์

android:taskAffinity="string" 

ควรขึ้นต้นด้วยจุดเสมอเช่น:

android:taskAffinity=".string" 

4
ปัญหาได้รับการแก้ไขสำหรับฉัน แต่ฉันจะหาข้อมูลนี้ในเอกสารได้ที่ไหน ไม่มีอะไรเกี่ยวกับ DOT ที่นี่: developer.android.com/guide/topics/manifest/…
Beto Caldas

คุณช่วยวันของฉัน
Waldmann

69

ชื่อกิจกรรมควรขึ้นต้นด้วย "." ในไฟล์รายการของคุณ


ใน Manifest คุณได้ประกาศแอตทริบิวต์ของแพ็กเกจพร้อมแพ็กเกจดังนั้นเมื่อคุณสร้างกิจกรรมคุณใส่ "." นำหน้าด้วยชื่อแพ็กเกจคุณยังสามารถพิมพ์ชื่อเต็มของกิจกรรมเช่น "com.example.test.Activity_Name" หรือ ".Activity_Name"
Amt87

43

ฉันพบข้อผิดพลาดนี้เนื่องจากฉันมีตัวพิมพ์ใหญ่ในชื่อแพ็คเกจของฉันเป็นแบบนี้

Com.Example.packagename

หลังจากที่ฉันเปลี่ยนเป็นสิ่งที่ชอบ

com.example.packagename

มันได้รับการแก้ไข


สิ่งนี้ช่วยแก้ปัญหาของฉันได้ คลาสกิจกรรมของฉันอยู่ภายใต้แพ็คเกจที่เรียกว่ากิจกรรมและฉันเพิ่มลงในรายการก่อนที่ข้อผิดพลาดนี้จะปรากฏขึ้น เมื่อฉันเปลี่ยนชื่อแพ็กเกจ Activities เป็นกิจกรรมจะได้รับการแก้ไข ขอบคุณ
alicanbatur

2
ฉันคิดว่าคุณสามารถใช้ตัวพิมพ์ใหญ่ในชื่อแพ็กเกจได้อย่างไรก็ตามตัวอักษรตัวที่ 1 ในชื่อแพ็กเกจไม่สามารถเป็นตัวพิมพ์ใหญ่ได้ ดังนั้น "myActivity" = ตกลง แต่ "MyActivity" = ไม่ตกลง
Gene

29

รหัสข้อผิดพลาด INSTALL_PARSE_FAILED_MANIFEST_MALFORMED ถูกส่งคืนโดย PackageParser.java เมื่อตรวจพบข้อผิดพลาดจำนวนมากในไฟล์ manifest.xml

หากต้องการแยกข้อผิดพลาดให้ดูใน logcat (เมื่อคุณใช้คำสั่ง 'adb install foo.apk') ในปัญหาที่ฉันพบ logcat มี:

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

ในบรรทัดที่สี่ข้างต้นจะเห็นได้ว่า PackageParser บ่นบรรทัดที่ # 214 ของไฟล์ manifest.xml "<ผู้ให้บริการ> ไม่รวมถึงเจ้าหน้าที่แอตทริบิวต์" ดูรายการด้านล่างของกรณีทั้งหมดใน PackageParser ที่ส่งคืนรหัสข้อผิดพลาดนั้น (PackageParser เป็นคลาสเดียวที่สร้างรหัสข้อผิดพลาด PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED)

ในกรณีของฉันข้อความ "<provider> ไม่รวมแอ็ตทริบิวต์ทางการ" ถูกสร้างโดยบรรทัด 2490 ของ PackagerParser.java ในฟังก์ชัน parseProvider ที่เรียกโดย parseApplication


จากเวอร์ชัน 4.1.1 ของ frameworks / base / core / java / android / content / pm / PackageParser.java, PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED ถูกอ้างอิงบนบรรทัดเหล่านี้ในวิธีการเหล่านี้ หากหมายเลขบรรทัดของซอร์สโค้ดตามด้วยสตริงที่ยกมาซึ่งเป็นข้อความที่พิมพ์ใน logcat หากหมายเลขบรรทัดตามด้วยนิพจน์ Java ที่เป็นรหัสที่ทำให้รหัสข้อผิดพลาดนั้นถูกส่งกลับให้ตรวจสอบฟังก์ชันนั้นเพื่อดูว่าอะไรเป็นสาเหตุของข้อความแสดงข้อผิดพลาดที่จะส่งคืน ในสองกรณีฉันไม่สามารถแยกสาเหตุของข้อผิดพลาดกับการเรียกใช้เมธอดเฉพาะวิธีเดียวได้

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

เป็นเรื่องน่าเสียใจที่คุณต้องโผล่เข้าไปใน logcat และแหล่งที่มาเพื่อหาสาเหตุของปัญหา


1
ขอบคุณที่ช่วยให้เราเข้าใจวิธีแก้ปัญหาทั่วไปนอกเหนือจากการแก้ปัญหาเฉพาะ
Vinay W

1
มีเหตุผลหลายประการสำหรับข้อยกเว้นนี้ นี่คือคำตอบที่สมเหตุสมผลที่สุด
Meghal Shah

1
ขอบคุณ - ในกรณีของฉันฉันมีสิ่งIntentFilter.MalformedMimeTypeExceptionที่ฉันพลาด
CzarMatt

นี่คือคำตอบที่ถูกต้องโดยไกล Logcat มีประโยชน์อย่างไร?
Krishnabhadra

10

ตรวจสอบชื่อกิจกรรมของคุณในไฟล์รายการ

หรือชื่อแพ็กเกจในกิจกรรมหลัก / ชั้นเรียน

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

10

ฉันมีปัญหาเดียวกัน แต่เมื่อฉันเรียกกระบวนการเช่นนี้:

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

เมื่อฉันเปลี่ยนเป็น:

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

ทุกอย่างเริ่มทำงาน


2
การเพิ่ม ":" คุณได้เปลี่ยนความหมายของรหัส ในกรณีที่สองแอปพลิเคชันจะสร้างกระบวนการใหม่สำหรับบริการซึ่งมีให้สำหรับแอปพลิเคชันนั้นเท่านั้น developer.android.com/guide/topics/manifest/… . แต่สามารถแก้ไขข้อผิดพลาดได้โดยการพูดถึงชื่อแพ็กเกจที่สมบูรณ์แทนที่จะเป็นเพียงคำว่า 'หน้าจอ'
shshnk

10

ฉันพบปัญหาเดียวกันเมื่อครั้งก่อนในเอกสาร Android พวกเขาบอกว่าถ้าคุณไม่ใช้ ":" เป็นคำนำหน้าandroid:processคุณควรใช้ตัวอักษรตัวพิมพ์เล็ก แต่พวกเขาไม่เคยพูดอย่างนั้นมันควรจะเป็นแพ็คเกจเหมือนกระบวนการ ชื่อเช่นcom.company.app.services.MyService


1
แม้แต่ฉันก็มีปัญหาเดียวกัน พวกเขาควรได้กล่าวถึงการที่เราต้องใส่ชื่อแพ็กเกจเมื่อไม่ใช้ ":"
shshnk

8

ชื่อใด ๆ เช่นandroid:name, android:processควรจะอยู่ในรูปแบบของชื่อแพคเกจ: เริ่มต้นด้วยa..z, รวมกับคนอื่น ๆ ด้วย.ไม่ได้จบลงด้วย....


@IgorG. ขออภัยฉันหลงประเด็น :-( แต่ SDK ใหม่ลบฟิลด์นั้นออก ( ที่นี่ )

1
ขอบคุณ. ฉันเรียกกระบวนการดังกล่าวว่า: android:process="com.my_pack.services.MyServiceProcess"(com.my_pack.services คือแพ็คเกจที่บริการของฉันอยู่) และข้อผิดพลาดในการติดตั้งจะไม่ปรากฏขึ้นหลังจากนั้น
Maksim Dmitriev

8

ปัญหาของฉันคือฉันได้เขียน (สังเกต - เทียบกับ _):

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

ภายใต้กิจกรรม นี่อาจเป็นสาเหตุของปัญหาของคุณเช่นกัน


3

มีข้อผิดพลาดเดียวกัน! มีแท็กสิทธิ์ว่างเปล่าและนั่นเป็นสาเหตุของปัญหา!


โปรดเพิ่มรายละเอียดเพิ่มเติมในคำตอบของคุณ
kolossus

3

ฉันพบปัญหาเดียวกันหลังจากเพิ่มการแปล

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

สตริง@string/version_nameถูกส่งผ่านไปยังไฟล์สตริงที่เพิ่มเข้ามาใหม่โดยไม่ได้ตั้งใจ (ปรากฏเฉพาะในไฟล์ใหม่) หลังจากตรวจสอบการแปลทั้งหมดและลบออก@string/version_nameจากทุกไฟล์ยกเว้นภาษาอังกฤษทุกอย่างทำงานอีกครั้ง


3

อ่านบันทึกอุปกรณ์ Android ของคุณเพื่อวินิจฉัยข้อผิดพลาดนี้ คาดว่าจะมีบรรทัด "W / PackageParser" อธิบายปัญหา


3
<activity/>

จะต้องกำหนดก่อน

<activity-alias/>

ฉันหวังว่าฉันจะโหวตให้คะแนนอีกครั้ง ครั้งที่สองคำตอบนี้ช่วยฉันได้
cottonBallPaws

3

ฉันมีข้อผิดพลาดนี้เนื่องจากรหัสด้านล่าง

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

เมื่อฉันเปลี่ยนandroid:mimeType="*"เพื่อandroid:mimeType="*/*"แก้ไขข้อผิดพลาดนี้


3

โฟลเดอร์ชื่อที่สร้างกิจกรรมต้องเป็นตัวอักษรขนาดเล็กอย่าใช้ตัวพิมพ์ใหญ่สำหรับชื่อโฟลเดอร์กิจกรรม .... ควรใช้ตัวอักษรขนาดเล็กเสมอ


3

อาจเป็นได้จากหลายสาเหตุ แต่สำหรับฉันแล้วมันได้รับการแก้ไขโดยการเปลี่ยนชื่อแพ็กเกจด้วยชื่อตัวพิมพ์เล็ก (ชื่อแพ็กเกจคือ Activities แก้ไขด้วยกิจกรรม)


2

หากคุณใช้ multidex ในรายการควรเพิ่มมูลค่าหรือทรัพยากร ชอบ..

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

หรือ

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

จากนั้นทำความสะอาดโครงการและติดตั้งแอปใหม่


2

ในกรณีของฉันฉันอ้างถึงไอคอนโดยใช้แอตทริบิวต์ดังนี้:

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

แทน drawable:

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

ฉันใช้แอตทริบิวต์นี้ในหลายที่ แต่ดูเหมือนว่าจะใช้ไม่ได้ในไฟล์ Manifest


ตรงกับกรณีของฉัน ฉันต้องการให้เป็นสีอื่นขึ้นอยู่กับความชอบของผู้ใช้ น่าเศร้าที่ android: resource ไม่ยอมรับคุณสมบัติ ...
Elyakim Levi

2

ฉันจะสร้างแอพลิเคชันใหม่และกำหนดเป้าหมายไปยังAndroid พาย ทุกอย่างทำงานได้ดีและดีเมื่อเร็ว ๆ นี้ฉันพบว่าแอปพลิเคชันของฉันไม่ได้ติดตั้งลงในAndroid Naught และ Android OS เวอร์ชันต่ำกว่า

ขณะติดตั้งฉันเห็นข้อความแจ้งข้อผิดพลาด

การติดตั้งล้มเหลวด้วยข้อความ INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

ดังนั้นการแก้ไขที่ฉันทำมีดังนี้และทั้งหมดต้องทำในAndroidManifest.xmlไฟล์เท่านั้น

สำหรับกิจกรรมบริการผู้รับและทั้งหมด

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

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

สำหรับ 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" />

นั่นคือการเปลี่ยนแปลงทั้งหมดที่ฉันต้องดำเนินการเพื่อให้ใช้งานได้กับอุปกรณ์รุ่นที่ต่ำกว่าเช่นกัน


ใน Xamarin android แก้ไขในแอตทริบิวต์ชื่อกิจกรรม นั่นได้ผลสำหรับฉัน
Sovary


1

อาจมีไฟล์อื่นที่มีรูปแบบไม่ถูกต้อง แต่ไม่ได้ถูกไฮไลต์ใน IDE ตัวอย่างเช่น res / values ​​/ strings ซึ่งไฟล์ manifest อาจอ้างอิงถึงสิ่งต่างๆเช่น label


1

ในกรณีของฉันสาเหตุคือไม่มี android: name แอตทริบิวต์ใน <activity-alias> เป็นข้อบังคับสำหรับ <activity-alias> แม้ว่าจะต้องไม่ตั้งชื่อคลาสที่มีอยู่ สิ่งที่น่าตลกคือ - โครงการรวบรวมโดยไม่มีปัญหา


1

ปัญหาของฉันมีดังนี้:

ฉันระบุสิทธิ์ของฉันด้วยวิธีต่อไปนี้และใช้งานไม่ได้

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

มันใช้งานได้ดีเมื่อฉันเปลี่ยนให้เป็นดังนี้:

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

1

ฉันมีข้อผิดพลาดนี้เนื่องจากฉันมีบรรทัดด้านล่าง

android:protectionLevel="developer"

หลังจากที่ฉันเปลี่ยนเป็น

android:protectionLevel="signature"

ปัญหาได้รับการแก้ไขแล้ว


1

หลังจากต่อสู้กับปัญหานี้ฉันพบว่าค่าทั้งหมดที่ใช้เป็นค่าทรัพยากรสตริง (aka @ string /) ในรายการ (ของไลบรารีที่คุณใช้ด้วย) ไม่ได้รับอนุญาตให้เป็นส่วนหนึ่งของ strings.xml ของการแปล . ตัวอย่าง: หากไฟล์ Manifest ของคุณโดยใช้ @ string / app_name คำจำกัดความของ string / app_name จะได้รับอนุญาตในค่าเริ่มต้น / strings.xml ของคุณเท่านั้นและไม่ได้อยู่ในไฟล์ string.xml ทางเลือกที่คุณระบุสำหรับการแปล หวังว่าคงจะช่วย ..


1

ฉันมีข้อผิดพลาดเดียวกัน ฉันไม่มีอักขระตัวพิมพ์ใหญ่ในชื่อแพ็กเกจ / แอปพลิเคชันของฉันและทำความสะอาดโปรเจ็กต์และโซลูชันอื่น ๆ ก็ไม่ได้ช่วยฉันด้วย หลังจากทั้งหมดฉันสร้างโครงการใหม่และคัดลอกข้อมูลของฉันไปยังโครงการใหม่ทีละขั้นตอนและตรวจสอบว่าปัญหาปรากฏขึ้นหรือไม่ หลังจากทั้งหมดฉันมีโครงการที่ดีและปราศจากข้อผิดพลาดโดยไม่มีความซ้ำซ้อนใด ๆ บางครั้งก็ยากที่จะหาแหล่งที่มาของข้อผิดพลาดนี้ดังนั้นจึงสามารถใช้แนวทางอื่นได้ง่ายขึ้น

ฉันหวังว่านี่จะช่วยใครสักคน!


1

ฉันพบข้อผิดพลาดนี้เมื่อใส่คลาสแอปพลิเคชันในแพ็คเกจที่ไม่ถูกต้อง!




1

ฉันรู้ว่ามันสายที่จะตอบที่นี่ แต่ฉันทำผิดพลาดแปลก ๆ ดังนั้นโพสต์คำตอบของฉันถ้ามันช่วยใครบางคนในกรณีของฉันฉันเพิ่มกิจกรรมตัวเรียกใช้งานหลักเป็นนามแฝงโดยไม่ได้ตั้งใจ

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

ดังนั้นเมื่อฉันพยายามเรียกใช้แอปของฉันได้รับข้อผิดพลาด

เกิดข้อผิดพลาดขณะติดตั้ง APK

ความล้มเหลว [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]

ฉันเพิ่งลบคำ "-alias" ออกจากการลงทะเบียนกิจกรรมและแอปของฉันเปิดตัวสำเร็จ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.