【问题标题】:Do devices keep more than 1 version of Google Play services?设备是否保留超过 1 个版本的 Google Play 服务?
【发布时间】:2016-01-11 10:02:48
【问题描述】:

几个月前,我将我的一款应用更新到了 Google Play 服务的 8.3.0 版,该版本破坏了某些与位置相关的 API 的向后兼容性。

所以我的问题是,如果我的设备已经安装了 Google Play 服务 8.3.0,即使我使用 6.5.87 版本运行我的应用程序,它怎么可能仍然工作? (鉴于 6.5.87 上的 API 在 8.3.0 上不再可用)设备是否保留旧版本的 Google Play 服务以支持向后兼容性?或者,被删除的 API 是否在已安装的 Google Play 服务版本中可用,并隐藏在与开发人员共享的库中?

我想在这里了解的是,如果在我的应用上更新 Google Play 服务实际上会为应用带来后台改进(例如使用库中的最新算法),或者这些改进是否在设备上已经可用安装新的 Google Play 服务版本。

编辑:

在更详细地研究之后,我发现实际上没有任何 API 被破坏,但是一些接口被转换为抽象类(参见 https://developers.google.com/android/guides/releases#september_2015_-_v81),这就是我当时遇到的编译问题的原因。

我遇到的问题是因为 8.1 版 Google Play 服务不再与旧版本兼容(因为上面提到的更改),所以我使用的所有库都必须使用 8.1+ 构建,如果其中一个是用旧版本构建的,然后编译失败并出现以下错误:

java.lang.IncompatibleClassChangeError: The method 'boolean com.google.android.gms.common.api.GoogleApiClient.isConnected()' was expected to be of type interface but instead was found to be of type virtual (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)

编辑 2:

尽管我遇到的问题与删除的 API 无关,但我发现了一个在 Google Play 服务版本 7 中被删除的 API 示例:GooglePlayServicesClient(请参阅Cannot resolve symbol 'GooglePlayServicesClient')。

【问题讨论】:

    标签: android google-play-services


    【解决方案1】:

    Google Play Services 8.3 的发行说明中,我没有看到任何关于 API 调用不再可用的说明。我的猜测是这些调用只是被弃用并没有被删除。

    【讨论】:

    • 您实际上是对的,我很困惑,因为一位同事遇到了类似的问题,而我之前也有过类似的问题,但我误解了。破坏向后兼容性的版本 8 的变化是方法的类型。我用错误日志编辑了我的问题。
    • 我发现在第 7 版中,从 Google Play 服务中删除了一个类,但我的应用程序使用该类并在 Google Play 服务的 8.3 版上运行正常:/(检查我的第二次编辑) .
    【解决方案2】:

    它不会自动适用于您的应用

    更新 Google Play 服务版本时,您必须使用新版本的 Google Play 服务代码更新您的应用,然后您的应用才有新算法


    如果您的应用有旧版本的 Google Play 服务并且设备有新版本:不用担心您的应用可以正常运行,因为您的应用已经有 Google Play 服务代码在您的 APK 中。(设备更新到新版本时不要保留 Google Play 服务的旧版本代码)。


    如果您的应用有新版本的 Google Play 服务并且设备有旧版本:那么您必须要求用户在他/她的设备中更新 Google Play 服务,然后您的应用在他/她的设备上运行良好


    因此,设备不必具有多个版本的 Google Play 服务


    编辑:2015 年 12 月 1 日

    我已经给你答案了,但我还是会给你例子

    我在我的应用程序中使用了 Google Play 服务(v 7.8.0)作为位置(com.google.android.gms:play-services-location:7.8.0)和地图(com.google.android.gms:play-services-maps:7.8.0),当前的 Google Play 服务版本是 8.4.0,但我的应用程序仍然可以工作,为什么?因为一些谷歌播放服务代码附有我的APP代码见下图。

    我已从 APK 文件中提取代码。查看 APK 提供的 Google Play 服务代码 查看包名称 com.google.android.gms 这就是为什么我的应用可以正常工作而没有任何问题的原因。

    您还可以生成您的应用代码,请参阅answer 了解更多详情;

    【讨论】:

    • 我不认为你理解我的意思,当我在我的应用程序上使用 6.5 版本并且我的设备有 8.3 时怎么样? 8.3 破坏了某些 API 的向后兼容性,但我的应用程序运行良好,在您解释的情况下如何处理?
    • 我的糟糕,实际上没有 API 被破坏,只是某些方法的类型发生了变化,可能是因为某些接口在 8.1 版上被转换为抽象类(如这里解释 developers.google.com/android/guides/…),我添加了更多信息关于我的问题。
    • 是的,您的答案是正确的,但不适用于我遇到的问题。我已经知道您所解释的理论(在 Google 文档中看到)。但实际上,当我尝试将使用 8.1 之前的版本编译的库集成到我的应用程序时,我遇到了编译问题(我现在编辑了我的问题以提供有关我面临的核心问题的更多信息),这就是我谈论。很抱歉之前对 API 的事情感到困惑。
    • 我刚刚添加了另一个编辑,其中包含在版本 7 中删除的 API 示例。现在我有一个使用 Google Play 服务 6.5 的应用程序和一个安装了 Google Play 服务 8.4 的设备。该应用正在使用 GooglePlayServicesClient 类,该类在 8.4 版的 Google Play 服务中不可用。
    • @Franco:如果您生成 APK 并在 Gradel 文件中添加了新的 Play 服务库,那么您必须修改您的代码,例如 GooglePlayServicesClient 不可用,然后有新的方法来实现它。检查这个答案stackoverflow.com/q/29303427/1168654
    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多