如何修复在我的安卓应用中出现的INSTALL_PARSE_FAILED_MANIFEST_MALFORMED错误

27

大家好,我正在尝试使用GCM进行实验,但无法使其正常工作。我不知道出了什么问题,下面是我得到的错误信息。我正在尝试直接在设备上部署我的应用程序并从那里进行调试,但每当我尝试部署时都会出现此错误。

Waiting for device.
Target device: HT24LW108632
Uploading file
    local path: D:\Data\Android\AndroidTest\out\production\AndroidTest\AndroidTest.apk
    remote path: /data/local/tmp/Android.Test
Installing Android.Test
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/Android.Test"
pkg: /data/local/tmp/Android.Test
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="Android.Test"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="14"/>

    <permission
            android:name="Android.Test.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
    <uses-permission android:name="Android.Test.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />



    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <receiver
                android:name="com.google.android.gcm.GCMBroadcastReceiver"
                android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="Android.Test" />
            </intent-filter>
        </receiver>
        <service android:name=".GCMIntentService" />
    </application>
</manifest>

我的设备是HTC OneX

  • Android版本:4.03
  • HTC Sense版本:4.0
  • 软件编号:1.29.110.11
  • HTC SDK API级别:4.12
  • HTC扩展版本:HTCExtension_403_1_GA_7

由于我是Android的新手,请指导我。

编辑-1: 我注意到如果我注释掉下面这行代码,应用程序就可以部署和执行,但显然我不能没有下面提到的权限继续前进...请帮忙....

<permission android:name="Android.Test.permission.C2D_MESSAGE"  android:protectionLevel="signature" />

当你遇到这个错误时,检查logcat输出总是一个好主意,因为它可能由不同的原因引起。消息(标签PackageParser)将给出具体的行号和描述性错误。 - mmigdol
12个回答

60

将名称包从大写字母更改为小写字母。


但是每当我开始配置GCM相关内容时,它就会报错,尽管我能够成功部署应用程序。 - Shax
1
imperator_sp,你是正确的,它确实起作用了。使用小写字母创建一个包,项目成功运行。谢谢。 - Shax

9

你的

android:name="MainActivity"

更改为

android:name=".MainActivity"

或者在类名前加上小写的完全限定包名

android:name="thepackage.MainActivity"

请按照我的建议更改activity标签内所有命名为android:name的属性。


在清单文件中,由于活动名称未以(.)点开头,因此出现错误。 - K Guru

4

改为:

<permission android:name="android.permission.C2D_MESSAGE" android:protectionLevel="signature"/>

to:

<uses-permission android:name="android.permission.C2D_MESSAGE" android:protectionLevel="signature"/>

试试看。


3
<activity android:name="MainActivity"

应该像这样形成。
<activity android:name="com.company.appname" 

为了避免错误,请执行以下操作:右键单击包名,选择“Android 工具”>“重命名应用程序包”。


1

尝试编写活动名称,后跟“。”而不是

<activity android:name="MainActivity"
                  android:label="@string/app_name">

使用
<activity android:name=".MainActivity"
                  android:label="@string/app_name">

1
我在Android Studio中遇到了同样的问题。解决方法是将公司域名全部改为小写。

1
在Android 12(Android",API Level 31)中,您可能会因行为变化而遇到相同的错误。
要消除这个问题,您必须向应用程序的AndroidManifest.xml文件中具有<intent-filter>声明的任何<activity><activity-alias><service><receiver>组件添加android:exported="true"(或false*)。
*更多信息:相关官方文档

0
在我的情况下,我只使用小写字母提到了包名。但是对于一些活动,我使用了部分名称来命名,即android:name=".ContactUs"。解决方法是在清单文件中在所有活动名称、服务名称和广播提供程序名称之前加上完整的包名前缀。
工作代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="vcan.doit.com">

<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<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/Theme.DesignDemo">
    <activity
        android:name="vcan.doit.com.LoginActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="vcan.doit.com.MainActivity"
        android:theme="@style/Theme.DesignDemo" />
    <activity
        android:name="vcan.doit.com.CheeseDetailActivity"
        android:parentActivityName="vcan.doit.com.MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="vcan.doit.com.MainActivity" />
    </activity>

    <service android:name="vcan.doit.com.PushNotification.MyAndroidFirebaseMsgService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    <service android:name="vcan.doit.com.PushNotification.MyAndroidFirebaseInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <activity
        android:name="vcan.doit.com.AboutUs"
        android:label="@string/abt_us"
        android:parentActivityName="vcan.doit.com.MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="vcan.doit.com.MainActivity" />
    </activity>
    <activity
        android:name="vcan.doit.com.ContactUs"
        android:label="@string/contact_us"
        android:parentActivityName="vcan.doit.com.MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="vcan.doit.com.MainActivity" />
    </activity>
    <activity android:name="vcan.doit.com.WriteToUs"
        android:label="@string/write_us"
        android:parentActivityName="vcan.doit.com.MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="vcan.doit.com.MainActivity" />
    </activity>
</application>


0

这里有一个问题:http://code.google.com/p/android/issues/detail?id=37658 在权限中不能使用大写字母作为包名。当你部署了一个像这样的包名并且需要使用GCM时,你会遇到困难(和我一样)。 我尝试使用某种形式的权限缩写:

<permission android:name=".permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name=".permission.C2D_MESSAGE" />

我也以同样的方式定义了服务。它必须在应用程序包中。 它在Android 4.3上运行。可能在4.2上也可以。我知道在4.0.3上不行。


0

请确保您的包名使用小写字母... 这对我有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接