Android list 重复权限

标签 android android-gradle-plugin google-play altbeacon

我们有一个由第三方库 (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 库模块 targetSdkVersion 在 build.gradle 中设置为 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 本身并提取二进制 list :

~/.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")

所以有一个重复的标签,我认为 list 合并应该已经认识到这一点并将其从 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。

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

最佳答案

在您的应用程序 list 文件中添加以下合并规则。

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

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

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

关于Android list 重复权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298951/

相关文章:

Android 市场统计 API?

android - Android中如何限制mp3文件在其他应用程序中播放

android - 从 Android 中的光标填充 ListView

java - Android - 从最近的应用程序刷应用程序时服务停止

android - 如何运行模块的测试以及我的应用程序测试

android - 如何在 Unity3d 中更改包名称

java - LibGDX:如何在主游戏屏幕上重复显示/隐藏覆盖弹出菜单

android - 如何配置SonarRunner属性以读取android单元测试和junit测试的junit报告

Android build.gradle 文件的 adbOptions 方法是做什么用的?

xamarin - 识别测试 GooglePlay 购买