GCM注册适用于调试APK但不发布APK

时间:2015-08-21 05:00:42

标签: android google-app-engine google-cloud-messaging

我的APK的调试版本始终成功注册GCM。我刚刚构建了我的APK的第一个发布版本。我可以通过Android Studio在我连接USB的设备上安装和运行发布版本。但是,发布版本的GCM注册总是失败。

private static final String TAG = "GcmRegIntentService";
MyRegistrationEpt backendRegService = getRegistrationService();

try {
    synchronized (TAG) {
        InstanceID instanceID = InstanceID.getInstance(appContext);
        String token = instanceID.getToken(GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
        Log.i(TAG, "before register, token: " + token);

        backendRegService.register(token).execute();
    }
} catch (Exception ex) {
    Log.i(TAG, "Error: " + ex.getMessage());
}

private MyRegistrationEpt getRegistrationService() {

    MyRegistrationEpt.Builder builder = new MyRegistrationEpt.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null)
            .setRootUrl("https://some_valid_app.appspot.com/_ah/api/")
            .setApplicationName(getResources().getString(R.string.app_name));

    return builder.build();
}

当此代码运行时,这是日志:

08-21 12:52:54.225   4145-13398/technology.grandma.margriver I/GcmRegIntentService﹕ before register, token: <some_long_string>
08-21 12:52:55.430   4145-13398/technology.grandma.margriver I/GcmRegIntentService﹕ Error: 404 Not Found

我已经缩小了与我的构建中需要GCM类的proguard剥离相关的问题。如果我设置&#34; minifyEnabled false&#34;在build.gradle中,问题消失了。我使用的是Google Play服务API级别7.8.0。第https://developers.google.com/android/guides/setup页说:

  

&#34; ProGuard指令包含在Play服务客户端库中以保留所需的类。用于Gradle的Android插件会自动将ProGuard配置文件附加到AAR(Android ARchive)包中,并将该包附加到ProGuard配置中。在项目创建期间,Android Studio会自动为ProGuard创建ProGuard配置文件和build.gradle属性。要在Android Studio中使用ProGuard,必须在build.gradle buildTypes中启用ProGuard设置。有关详细信息,请参阅ProGuard指南。&#34;

我将此解释为意味着我不需要手动为GCM添加​​任何proguard规则。任何人都可以解释这个错误的原因,并建议我如何解决它?

2 个答案:

答案 0 :(得分:6)

我解决了这个问题。问题不是由proguard剥离GCM类引起的,而是由Google App Engine API客户端连接所需的proguard剥离类型和注释引起的。为了解决这个问题,我将这些行添加到了我的proguard规则中:

#  Needed by google-api-client to keep generic types and @Key annotations accessed via reflection

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault

-keepclassmembers class * {
   @com.google.api.client.util.Key <fields>;
}

请参阅https://developers.google.com/api-client-library/java/google-http-java-client/setup#proguard

答案 1 :(得分:0)

可能需要在API控制台中添加SHA1证书。对于调试和发布