我在Google Play中有一个应用程序,该应用程序是使用工具和API 22构建的。一切运行正常,但是最新的API 23更新(工具23.1)显示了Android 6.0错误代码为“-505”的用户(在Google Play应用程序中或通知)。但是......它真的是随机的......我知道两个相同的设备 - Nexus 5 with 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" />

有任何想法吗?

最佳答案

回答对每个使用带有 Gradle 和外部库的 Android Studio 的应用程序开发人员有用。有些受到影响,有些不受影响,但例如 Google-Play-Services (在当前的 8.4.0 版本中,就我而言)受到影响,并且这个库非常受欢迎......

描述:

每个应用 都有 来在 Gradle 中声明自己的 applicationId ,在 manifest 中也有 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} 也可能在其他必须在整个系统中唯一的字段中声明,例如 permissions ,它不能重复还。

就我而言:Google-Play-Services 和 Google Cloud Messaging lib(我知道 shure v 8.3 和 8.4)。上面的示例第一个 fragment 来自推送消息提供程序。我的应用程序从 7.x(这个版本不使用 appId 引用,可能是 ${packageName} 代替?)到 8.4(使用 appId 引用)后开始崩溃安装,设备上已经安装了另一个应用程序(与我的无关)-505完全)它也错过了 applicationId 声明并使用相同的 GPS 库。首先安装的应用程序使用其“原始”库 authority 来“保留”原始的 Google Cloud Messaging 提供程序 applicationId 字段(导致应用程序/开发人员丢失),并且该字段在整个系统中必须是唯一的,因此我的应用程序(安装后)获得 -505。 ..

解决方案:

Here is doc with proper declaration of both packageName and applicationId. 在您的应用程序中定义此字段,它永远不会“干扰”另一个应用程序(真正拥有系统中唯一的提供程序)。

高级作业:

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

10-08 19:08