Android 清单重复权限

Android Manifest Duplicate Permissions

我们的应用程序包含第三方库 (altbeacon)、本地构建的 Android 库和应用程序组件。所有三个组件都有一个 AndroidManifest.xml ,它们在构建期间合并。该应用程序是使用 gradle.

构建的

此应用已在 Google Play 商店上发布了很长时间。在上一次迭代中,我们从 API 级别 22 升级到 25。所有构建都没有错误,APK 在真实设备上安装和测试没有错误,但是当我们在 Google Play 上更新应用程序时,APK 上传失败,出现错误:

Upload failed
Duplicate declarations of permission android.permission.ACCESS_COARSE_LOCATION with different maxSdkVersions.

分析 AndroidManaifest.xml 我们发现 org.altbeacon.beacon 具有以下权限:

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="23" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />

我们本地的Android库模块build.gradle中targetSdkVersion设置为25并且AndroidManifest.xml包含:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

在应用程序模块中,targetSdkVersion 在 build.gradle 中设置为 25。

app模块中生成的AndroidManifest.xml包含:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />

为了确认,查看 APK 本身并提取二进制清单:

~/.android-sdk/build-tools/25.0.3/aapt l -a app-release.apk | grep -B1 COARSE
    E: uses-permission (line=62)
      A: android:name(0x01010003)="android.permission.ACCESS_COARSE_LOCATION" (Raw: "android.permission.ACCESS_COARSE_LOCATION")
--
    E: uses-permission-sdk-23 (line=76)
      A: android:name(0x01010003)="android.permission.ACCESS_COARSE_LOCATION" (Raw: "android.permission.ACCESS_COARSE_LOCATION")

所以有一个重复的标签,我认为清单合并应该已经认识到这一点并将其从 altbeacon 库中删除。我的问题是如何从 altbeacon 库中删除权限?

我在应用程序模块中尝试了以下 AndroidManifest.xml:

<uses-permission-sdk-23
   android:name="android.permission.ACCESS_COARSE_LOCATION"
   tools:node="remove"
   tools:selector="org.altbeacon.beacon"/>

这导致:

AndroidManifest.xml:12:5-15:48 Warning:
        uses-permission-sdk-23 was tagged at AndroidManifest.xml:12 to remove other declarations but no other declaration present

<uses-permission
   android:name="android.permission.ACCESS_COARSE_LOCATION"
   tools:node="remove"
   tools:selector="org.altbeacon.beacon"/>

这导致:

AndroidManifest.xml:12:5-15:48 Warning:
        uses-permission was tagged at AndroidManifest.xml:12 to remove other declarations but no other declaration present

以下确实有效,但它删除了错误的标签,它删除了我们作为应用程序的一部分构建的本地 Android 库中的标签。

 <uses-permission
      android:name="android.permission.ACCESS_COARSE_LOCATION"
      tools:node="remove"/>

还剩org.altbeacon.beacon权限:

~/.android-sdk/build-tools/25.0.3/aapt l -a app-release.apk | grep -B1 COARSE
E: uses-permission-sdk-23 (line=72)
  A: android:name(0x01010003)="android.permission.ACCESS_COARSE_LOCATION" (Raw: "android.permission.ACCESS_COARSE_LOCATION")

这是不令人满意的,因为如果 org.altbeacon.beacon 库中的权限更改或将来删除,我们的应用程序中将缺少 ACCESS_COARSE_PERMISSION。

关于如何正确解决这个问题有什么建议吗?

只需将以下行替换为您现有的使用权限即可解决问题。

这是什么原因,因为您在清单中添加了重复的权限,但在下面一行拆分了权限。

<uses-permission
      android:name="android.permission.ACCESS_COARSE_LOCATION"
      android:maxSdkVersion="22"/>

在您的应用清单文件中添加以下合并规则。

<uses-permission-sdk-23
        tools:node="removeAll" />

确保您已经添加了位置权限。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

如本 post 中所述,您必须指定清单应如何处理权限。您可能包含了一个传递性已经需要此权限的库,例如 READ_PHONE_STATE。

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

如果您在清单中重新声明此权限,它会发出警告,因为它不知道如何处理这两个声明(即使它们可能只是声明相同)。

如果你愿意在你的应用中转发这个权限,你可以这样修改:

<uses-permission tools:node="merge" android:name="android.permission.READ_PHONE_STATE" />

如果您不愿意在您的应用中转发该权限,您可以明确删除该权限:

<uses-permission tools:node="remove" android:name="android.permission.READ_PHONE_STATE" />