设备是否会保存多个版本的Google Play服务?

3
我几个月前更新了我的一个应用程序到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),这就是当时导致编译问题的原因。
我遇到的问题是由于Google Play服务的8.1版本不再兼容旧版(因为上述更改),因此我使用的所有库都必须使用8.1+构建,如果其中一个库使用旧版本,则编译将失败,并显示以下错误:
java.lang.IncompatibleClassChangeError:预期类型为接口的方法'boolean com.google.android.gms.common.api.GoogleApiClient.isConnected()',但实际上是虚拟类型(声明'java.lang.reflect.ArtMethod'出现在/system/framework/core-libart.jar中)
编辑2:
尽管我面临的问题与已删除的API无关,但我找到了一个在Google Play服务版本7中被删除的API的示例:GooglePlayServicesClient(请参见无法解决符号'GooglePlayServicesClient')。
2个回答

0

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

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


如果你的应用程序有旧版的Google Play服务,而设备有新版:不必担心,因为你的应用程序已经在APK中包含了Google Play服务代码。(设备在升级到新版本时不会保留旧版本的Google Play服务代码)。


如果您的应用程序有新版本的Google Play服务,而设备却是旧版:那么您必须要求用户在其设备上更新Google Play服务,然后您的应用程序才能在他/她的设备上正常工作。


所以,设备不必拥有多个版本的Google Play服务


编辑日期:2015年12月1日

我已经回答过你了,但是我还是会给你一个例子。

我在我的应用程序中使用了Google Play服务(版本为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,但是我的应用程序仍然可以正常工作,为什么呢?因为一些Google Play服务代码与我的应用程序代码相结合,请参见下面的图片。

enter image description here

我从APK文件中提取了代码。看到APK中有Google Play服务代码,包名为com.google.android.gms,这就是为什么我的应用程序可以正常运行而没有任何问题。

您也可以生成您的应用程序代码,请参阅answer以获取更多详细信息;


我认为你没有理解我的观点,如果我在我的应用程序中使用版本6.5,而我的设备有8.3呢?8.3破坏了一些API的向后兼容性,但我的应用程序仍然可以正常工作,鉴于你所解释的情况,这怎么可能呢? - Franco
我的错,实际上没有任何API被破坏,只是某些方法的类型发生了变化,可能是因为某些接口在8.1版本中被转换为抽象类(如此处所述https://developers.google.com/android/guides/releases#september_2015_-_v81),我在我的问题中添加了更多信息。 - Franco
是的,你的答案是正确的,但并不适用于我遇到的问题。我已经知道了你所解释的理论(在Google文档中看到过)。 但实际上,当我尝试将编译版本早于8.1的库集成到我的应用程序中时,我遇到了编译问题(我现在编辑了我的问题,以提供更多关于我面临的核心问题的信息),这就是我所说的。 对于之前关于API的混淆,我感到抱歉。 - Franco
我刚刚添加了另一个编辑,其中包含一个在第7版中被删除的API示例。现在我有一个使用Google Play服务6.5的应用程序和一个安装了Google Play服务8.4的设备。该应用程序正在使用GooglePlayServicesClient类,但在Google Play服务8.4版本中不可用。 - Franco
@Franco:如果您在Gradle文件中添加了新的Play服务库并生成了APK,则必须修改代码,例如GooglePlayServicesClient不可用,则有一种新的实现方式。请查看此答案https://dev59.com/vl4b5IYBdhLWcg3wVgC9。 - Dhaval Parmar
是的,我知道如何修复这个问题,我早就解决了。我想要理解的是,当我的应用程序使用GooglePlayServicesClient版本6.5,而我的手机版本为8.3(不包含该类)时,为什么一切都正常工作?谢谢你的帮助,但如果你无法回答这个问题,那么你并没有回答我的问题,我没有时间继续解释它。 - Franco

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

你说得很对,我混淆了,因为我的一个同事之前遇到了类似的问题,我误解了他的情况。在版本8中破坏向后兼容性的是一种方法的类型发生了变化。我已经编辑了我的问题并附上了错误日志。 - Franco
我发现在版本7中,Google Play服务中的一个类被删除了,但是我的应用程序使用该类并运行在版本8.3的Google Play服务上,效果很好 :/ (请查看我的第二次编辑)。 - Franco

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