在写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 这个属性的解释
应在其中运行 Activity 的进程的名称。正常情况下,应用的所有组件都在为应用创建的默认进程名称内运行,您无需使用该属性。 但在必要时,您可以使用该属性替换默认进程名称,以便让应用组件散布到多个进程中。 如果为该属性分配的名称以冒号(“:”)开头,则会在需要时创建应用专用的新进程,并且 Activity 会在该进程中运行。如果进程名称以小写字符开头,Activity 将在该名称的全局进程中运行,前提是它拥有相应的权限。这可以让不同应用中的组件共享一个进程,从而减少资源占用。
这个解释并没有说我原来的命名是不规范的!!!坑啊~!
最后还是总结一下android:process的命名规则吧
- 不能以数字开头;
- 冒号(“:”)只能用于开头;
- 不以冒号(“:”)开头必须含有"." ;
- 不能含有特殊字符。
大概就在这样了吧。
当然,发生[INSTALL_PARSE_FAILED_MANIFEST_MALFORMED] 这个错误也可能是其他原因引起的,所以需要大家静下心来查找原因,总会找到的。
网友评论