INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解决

在写Android 测试程序的时候,安装Apk突然遇到 Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED] 这个错误。

这个错误的意思是AndroidManifest.xml这个文件有问题。

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

    <application
        android:allowBackup="true"
        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=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Main2Activity"
            android:process="activity2" />
        <activity android:name=".Main3Activity"/>
    </application>

</manifest>

我的 AndroidManifest.xml 就这点代码,当时一脸懵逼。错误信息也没说我的Manifest哪行出错了,首先我怀疑是依赖库中的Manifest文件和我的Manifest在合并的时候发生了冲突。

为了验证我的想法我把所有的第三方依赖都去掉了,只留系统的依赖。然而依然无法安装。当时一度怀疑是AS的问题。

后来发现我的Main2Activity这个Activity设置了 android:process="activity2"这个属性。改了一下process的名字android:process=".activity2 加了一个.,于是顺利安装成功了!

原来导致这个错误的原因是process命名不规范!!!

截取谷歌官方对 android:process 这个属性的解释

image.png

应在其中运行 Activity 的进程的名称。正常情况下,应用的所有组件都在为应用创建的默认进程名称内运行,您无需使用该属性。 但在必要时,您可以使用该属性替换默认进程名称,以便让应用组件散布到多个进程中。 如果为该属性分配的名称以冒号(“:”)开头,则会在需要时创建应用专用的新进程,并且 Activity 会在该进程中运行。如果进程名称以小写字符开头,Activity 将在该名称的全局进程中运行,前提是它拥有相应的权限。这可以让不同应用中的组件共享一个进程,从而减少资源占用。
这个解释并没有说我原来的命名是不规范的!!!坑啊~!

最后还是总结一下android:process的命名规则吧

  1. 不能以数字开头;
  2. 冒号(“:”)只能用于开头;
  3. 不以冒号(“:”)开头必须含有"." ;
  4. 不能含有特殊字符。

大概就在这样了吧。

当然,发生[INSTALL_PARSE_FAILED_MANIFEST_MALFORMED] 这个错误也可能是其他原因引起的,所以需要大家静下心来查找原因,总会找到的。

推荐阅读更多精彩内容