谷歌应用商店-505安装错误

7

我在Google Play发布了一个应用程序,该应用程序使用工具和API 22构建。一切都运行正常,但是最近使用API 23(工具23.1)更新后,Android 6.0用户会显示错误代码为“-505”的错误(在Google Play应用程序或通知中)。但是...这真的很随机...我知道有两个相同的设备 - Nexus 5和6.0.1 - 其中一个出现了-505,而另一个则顺利安装升级....

经过大量搜索,我发现了这个错误意味着权限重复,但是哪些权限重复了呢?

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- GCM -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
    android:name="com.dummy.mobile.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.dummy.mobile.permission.C2D_MESSAGE" />

<android:uses-permission
    android:name="android.permission.READ_PHONE_STATE" />
<android:uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<android:uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE" />

任何想法?
1个回答

12

这篇文章对于使用Android Studio和Gradle以及外部库的每个应用程序开发人员都非常有用。一些开发者受到影响,一些则不受影响,但例如Google Play服务(在当前8.4.0版本中,在我的情况下)被涉及,并且该库非常流行......

描述:

每个应用程序必须在Gradle中声明自己的applicationId以及在清单中声明packageName,但这是Android Studio所要求的。Gradle不会强制声明applicationId,但它应该声明,因为一些库在其声明中使用引用${applicationId},例如上面提到的GPS。

<provider
      android:authorities="${applicationId}.google_measurement_service"
      ...

如果您没有声明applicationId,构建系统将使用libs的appId,并且在apk创建后,上面的提供程序将是:

<provider
     android:authorities="com.google.android.gms.measurement.google_measurement_service"
     ...

安装它到系统中与your.lovely.app一起不会有问题。真正的问题出现在另一个第二个应用程序this.app.will.have.minus505使用相同库创建且没有applicationId的情况下。在这个应用程序中也有相同的包(在GPS示例中是com.google.android.gms...),这是编号为-505的重复错误,因为authorities字段必须是唯一的...如果您在您的应用程序中声明applicationId,则上述示例将是:

<provider
      android:authorities="your.lovely.app.google_measurement_service"
      ...

请注意,参考${applicationId}的字段可能还在其他必须唯一的字段中声明,例如权限,这些字段也不能重复。

在我的情况下:Google Play服务和Google Cloud Messaging库(我确定版本为8.3和8.4)。上面的示例代码来自推送消息提供程序。我的应用程序在从7.x(该版本未使用appId引用,可能改用${packageName})更新到8.4后(使用appId引用),在已经安装了另一个应用程序(与我的应用程序无关)并且也缺少applicationId声明并使用相同的GPS库的设备上,会导致安装崩溃(-505)。第一个安装的应用程序使用其“原始”库applicationId来保留原始Google Cloud Messaging提供程序的authority字段(因为应用程序/开发人员缺失),此字段必须在整个系统中唯一,因此我的应用程序(安装后)会收到-505错误...

解决方案:

这里有适当声明packageName和applicationId的文档。在您的应用程序中定义此字段,它将永远不会与另一个应用程序“干扰”(真正在系统中唯一的提供程序)。

高级作业:

反编译或“猜测”其他应用程序的Provider(或任何其他应该是唯一的对象),并在您自己的应用程序中声明它。您可能根本不使用它,但它很可能会锁定此原始应用程序的安装。这似乎是一种很好的方法来阻止竞争对手(例如最大的竞争对手)的安装。我没有尝试过,希望这个问题已经被“解决”了...


3
为了澄清,Gradle将applicationId注入到生成的清单文件中。请查看build / intermediates / manifests以查看生成的清单文件。解决此问题所需的全部操作就是在您的build.gradle文件中提供一个applicationId。`defaultConfig { applicationId“your.app.id” }`实际上,Android Vine应用程序并没有正确执行此操作,因此您可以通过安装Vine和您的应用程序来测试本地是否出现505错误。查看此错误报告 - sauce
就像你所说的那样。我知道Gradle正在注入这个字段,但外部库(如GPS)却看不到它,不知道为什么...只有手动声明(我在最后一段中提供的链接,你的简短回答)才能帮助解决问题。我已经干扰了Houzz应用程序(> 5百万次下载),已经发送了反馈,但回复都是模板... :/ - snachmsm
漂亮的答案,救了我的命。 - Alex Sullivan
这太棒了@snachmsm,你救了我。我能找到的关于-505错误代码的所有信息都是关于Android 5.0的错误,而这些错误在5.0.1中已经修复。我刚在Android 6.0上遇到了这个错误,所以想知道出了什么问题。 - Thermometer
非常感谢您的提示。我在AndroidManifest.xml中忘记了一行android:authorities="com.example.android.datasync.provider"。将其更改为android:authorities="${applicationId}.fileprovider"似乎已经解决了这个问题。 - Alen Siljak

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