Google播放-505安装错误

Google Play -505 install error

我在 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" />

有什么想法吗?

答案对每个使用 Android Studio 和 Gradle 和外部库的应用程序开发人员都很有用。有些受到影响,有些没有,但是例如 Google-Play-Services(在当前 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 field must be unique...如果您在应用程序中声明 applicationId上面的示例将是:

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

这对于 shure 在整个系统中是唯一的,因为它应该是 :) 请注意,引用 ${applicationId} 也可能在其他 must-be-unique-in-whole-system 字段中声明,例如 permissions, 也不能复制。

在我的例子中:Google-Play-Services 和 Google 云消息传递库(我知道 shure v 8.3 和 8.4)。上面的示例第一个片段来自推送消息提供商。我的应用程序在 lib 更新后从 7.x(这个版本没有使用 appId 引用,也许 ${packageName} 代替?)到 8.4(使用 appId ref)开始崩溃安装 -505 在设备上,已经安装了另一个应用程序(与我完全无关)也缺少 applicationId 声明并使用相同的 GPS 库。首次安装的应用程序 "reserves" 原始 Google 云消息传递提供商 authority 字段使用其 "original" 库 applicationId(导致应用程序's/developer 丢失)和这个字段在整个系统中必须是唯一的,所以我的应用程序(安装后)得到 -505...

解法:

Here is doc with proper declaration of both packageName and applicationId. 在您的应用程序中定义此字段,它永远不会 "interferre" 与其他应用程序(真正自己的提供商在系统中唯一)。

高级作业:

反编译或 "guess" 其他应用程序 Provider(或任何其他 should-be-unique 生物)并在您自己的应用程序中声明它。您可能根本不会使用它,但它可能会锁定此原始应用程序的安装。似乎是锁定竞争对手(例如最大的竞争对手)安装的好方法。没试过,希望这个可能性已经"solved"...