我的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规则。任何人都可以解释这个错误的原因,并建议我如何解决它?
答案 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证书。对于调试和发布