Android 重新打包清单后GCM注册失败

Android 重新打包清单后GCM注册失败,android,build,android-manifest,google-cloud-messaging,aapt,Android,Build,Android Manifest,Google Cloud Messaging,Aapt,我正在尝试创建我的应用程序的自定义版本,可以与我的生产应用程序同时安装 通过按照使用AAPT重新打包清单,我已经成功地获得了要并行安装的自定义暂存版本。我的问题是让GCM为这两个应用程序工作 我调用了gcmregistar.register,但我似乎从未收到对该应用程序登台版本的响应(GCM通知对于该应用程序的生产版本仍然可以正常工作) 我已经在我的Google Play开发者帐户中创建了一个新的草稿应用程序(我想测试应用内计费,因此需要在Google Play中将该应用作为草稿托管),并在我的

我正在尝试创建我的应用程序的自定义版本,可以与我的生产应用程序同时安装

通过按照使用AAPT重新打包清单,我已经成功地获得了要并行安装的自定义暂存版本。我的问题是让GCM为这两个应用程序工作

我调用了
gcmregistar.register
,但我似乎从未收到对该应用程序登台版本的响应(GCM通知对于该应用程序的生产版本仍然可以正常工作)

我已经在我的Google Play开发者帐户中创建了一个新的草稿应用程序(我想测试应用内计费,因此需要在Google Play中将该应用作为草稿托管),并在我的Google API控制台中为临时应用程序创建了一个新项目

我尝试使用的域如下所示:

  • production=com.mydomain.myapp
  • staging=com.mydomain.myapp.staging
我遇到的第一个问题是AAPT不会更改GCM权限,因此GCM将失败,原因是:

Application does not define permission com.mydomain.myapp.staging.permission.C2D_MESSAGE
因此,我添加了一个自定义构建步骤来进一步更新我的AndroidManifest.xml。以下是相关章节:

<manifest 
    ...
    package="com.mydomain.myapp">

    <permission
        android:name="com.mydomain.myapp.staging.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.mydomain.myapp.staging.permission.C2D_MESSAGE" />

    <permission
        android:name="com.mydomain.myapp.staging.MESSAGING_PERMISSION"
        android:label="Blah"
        android:protectionLevel="normal" >
    </permission>

    <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="com.mydomain.myapp" />
        </intent-filter>
    </receiver>

让它变得有点难弄明白

有人有什么想法吗?我想知道是“Android应用程序的密钥”导致了这个问题,还是我的登台应用程序是生产应用程序的子域


另一个复杂问题是从Google API控制台传播更改需要多长时间——有人知道我需要等待多长时间才能重新测试以确保更改到位吗?

我不知道
AAPT
如何工作,但我知道应该如何为GCM定义清单

下面标有
包装
的所有位置应包含相同的包装名称

<manifest 
    ...
    package="PACKAGE">

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

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

<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="PACKAGE" />
    </intent-filter>
</receiver>


与您的问题有关。

感谢@Eran的回答!为了帮助其他人,我在下面列出了我的工作配置(在运行自定义构建步骤之后)

标记中的包名称仍然需要保留原始包名称,但所有其他实例都需要使用重新打包的名称

AndroidManifest.xml:

<manifest 
    ...
    package="ORIGINAL_PACKAGE_NAME">

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

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

    <permission
        android:name="NEW_PACKAGE_NAME.MESSAGING_PERMISSION"
        android:label="Blah"
        android:protectionLevel="normal" >
    </permission>

    <service android:name=".MyGCMIntentService" />

    <receiver
        android:name=".MyGCMBroadcastReceiver"
        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="NEW_PACKAGE_NAME" />
        </intent-filter>
    </receiver>

感谢Eran-创建GCMBroadCastReceiver的子类修复了这个问题!我已经在一个单独的答案中发布了我的配置,因为如果使用AAPT重新打包,清单最终看起来会略有不同。
<manifest 
    ...
    package="ORIGINAL_PACKAGE_NAME">

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

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

    <permission
        android:name="NEW_PACKAGE_NAME.MESSAGING_PERMISSION"
        android:label="Blah"
        android:protectionLevel="normal" >
    </permission>

    <service android:name=".MyGCMIntentService" />

    <receiver
        android:name=".MyGCMBroadcastReceiver"
        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="NEW_PACKAGE_NAME" />
        </intent-filter>
    </receiver>
public class MyGCMBroadcastReceiver extends GCMBroadcastReceiver {

    public MyGCMBroadcastReceiver() {
        super();
        Log.d("Creating MyGCMBroadcastReceiver");
    }

    @Override
    protected String getGCMIntentServiceClassName(Context context) {
        String className = MyGCMIntentService.class.getName();
        Log.i("getGCMIntentServiceClassName", className);
        return className;
    }
}