由于GCM SenderId Android,无法生成APK发布版

8

我已在我的应用中实现了GCM(Google云端消息传输)。谷歌播放服务库自动生成了values.xml文件,其中我的senderId是:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="gcm_defaultSenderId">123</string>
</resources>

问题在于我有其他语言环境,在App发布期间,Lint出现了一个错误: Error:(3) Error: "gcm_defaultSenderId" is not translated in "fr" (French) [MissingTranslation] 由于它是自动生成的,我无法设置translable = false。我应该如何解决这个问题?
5个回答

15
在您的项目应用程序根目录(app/下)添加一个 lint.xml 文件,并在其中添加需要忽略的缺少翻译的内容。
<lint>
    <issue id="MissingTranslation">
        <ignore regexp="ga_trackingId"/>
        <ignore regexp="gcm_defaultSenderId"/>
        <ignore regexp="google_app_id"/>
    </issue>
</lint>

现在这些属性将被Lint忽略 - 您可以配置要忽略的属性,而且您不必等待google-services团队更新未考虑到的属性。

Lint仍会捕获所有其他错误,因此您仍然可以享受其他功能。


2
完美地按照描述工作。对我来说,这似乎是最正确的解决方案。直截了当,而不像其他答案中的一些方法那样是一个hack。提示:将lint.xml放在app/文件夹中。 - nilsmagnus
@Thanos 请确保lint.xml文件位于正确的位置 - 我每周都会使用Android Studio进行几次部署,而不需要任何其他特殊处理。 - MatsLindh
@MatsLindh 我试过几次了,但没有起作用。我唯一找到适用于我的解决方案是在构建过程中禁用翻译。示例 lintOptions { disable 'MissingTranslation' } 谢谢你的时间和帮助。 - Thanos
@Thanos 请参考 https://developer.android.com/tools/debugging/improving-w-lint.html 中的示例,了解如何手动运行 lint - 这可能有助于找出失败原因。我强烈建议保留警告,因为它会在打包时捕获错误。 - MatsLindh
@MatsLindh 我会看一下,再次感谢您提供链接和如何继续的信息。 - Thanos

6

我假设你正在使用Android Studio。

我也曾遇到过在Android Studio 1.4上的同样的问题。

我首先尝试的是编辑“文件-设置-编辑器-检查-Android Lint-不完整翻译”的严重程度设置,将其改为除“错误”以外的其他选项。

然而这并没有帮助!我仍然无法构建发布APK。

最终,我把XML“翻译”如下:

  1. in the folder .../android/res create a new language folder values-de (replace de with your language code).

  2. create a file named google-services.xml in the language folder.

  3. Insert into the xml file:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <string name="gcm_defaultSenderId"><YOUR_SENDERID></string>
    </resources>
    

    After that I was able to build the release.


1
这个问题已经被记录在这里:https://code.google.com/p/analytics-issues/issues/detail?id=733。请给它点赞,以便引起注意并得到修复。 - Oliv
问题已经在2.0.0-alpha3版本中得到了修复,如果您不介意使用alpha渠道,我可以确认它在2.0.0-alpha6版本中正常工作。 - yuval

3
自从Android Studio(1.5)上次更新以来,我也遇到了这个问题。我通过将Google服务依赖更新到最新版本来解决它。
根据这个链接

这个问题应该已经在8.3.0的Google Play服务和1.5.0-beta2依赖中得到解决。

希望这能有所帮助! :)
编辑 集成:事实上,虽然gcm_defaultSenderId字符串现在被正确生成(带有translatable ="false"属性),但例如google_app_idga_trackingID字符串却没有。
对于仍然存在问题的人,我得出结论,我们必须等待谷歌的开发者们修复此问题,并在此期间通过添加到应用级build.gradle文件来忽略错误。
...
android {
    lintOptions {
        abortOnError false
    }
}
...

0

如果您想要/需要升级以下内容的新版本:

  • lint(内置于Android Studio的lint)
  • 构建工具
  • compileSdkVersion
  • Gradle插件
  • Gradle
  • Google服务(插件)
  • Google服务依赖项(例如play-services-gcm)
  • (不幸的是)其他依赖项,如果它们在传递依赖于Google服务

您需要明智地选择所有这些部分的版本,因为它们都需要相互兼容。不幸的是,没有兼容性表(我找到的唯一一张表已有一年多的时间,所以我不会在此处提供链接。如果有人知道,请分享链接)。

因此,解决方案是研究哪个部分的哪个版本会阻止其他任何部分。这可能是噩梦,因此很多建议是恢复到最后已知的功能配置。但是,迟早我们都将被迫升级。

我检查了每个部分的主页以查找任何版本信息,但最终仍然通过测试和尝试方法解决了问题。

以下是对我而言可用的功能:

  • androidstudio 1.5
  • 构建工具 23.0.2
  • 编译版本 23
  • gradle插件 1.5.0
  • gradle 2.8
  • google服务插件 1.5.0
  • google服务依赖 8.3.0
  • 幸运的是,没有其他外部GS依赖(显然所有内部模块需要使用相同版本)

0

你可能会有另一段类似于这样的自动生成代码:

String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

从谷歌云控制台获取有效的发送者 ID,然后您可以从上面的代码中删除 R.string.gcm_defaultSenderId 以及资源文件中的 gcm_defaultSenderId。

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