Android Manifest重复权限

Bit*_*Dog 12 android google-play android-gradle-plugin altbeacon

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

该应用程序已在Google Play商店中发布.在最后一次迭代中,我们从API级别22升级到25.一切都没有错误构建,APK安装在真实设备上并且在没有错误的情况下进行测试,但是当我们在Google Play上更新应用程序时,APK的上传失败了错误:

上传失败
具有不同maxSdkVersions的权限android.permission.ACCESS_COARSE_LOCATION的重复声明.

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

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="23" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

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

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

在app模块中,build.dkVersion在build.gradle中设置为25.

应用程序模块中生成的AndroidManifest.xml包含:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

并且只是为了确认,查看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")
Run Code Online (Sandbox Code Playgroud)

所以有一个重复的标签,我认为清单合并应该已经识别出并从altbeacon库中删除了一个.我的问题是如何从altbeacon库中删除权限?

我已在appMan模块AndroidManifest.xml中尝试了以下内容:

<uses-permission-sdk-23
   android:name="android.permission.ACCESS_COARSE_LOCATION"
   tools:node="remove"
   tools:selector="org.altbeacon.beacon"/>
Run Code Online (Sandbox Code Playgroud)

这导致:

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
Run Code Online (Sandbox Code Playgroud)

<uses-permission
   android:name="android.permission.ACCESS_COARSE_LOCATION"
   tools:node="remove"
   tools:selector="org.altbeacon.beacon"/>
Run Code Online (Sandbox Code Playgroud)

这导致:

AndroidManifest.xml:12:5-15:48 Warning:
        uses-permission was tagged at AndroidManifest.xml:12 to remove other declarations but no other declaration present
Run Code Online (Sandbox Code Playgroud)

以下工作正常,但它删除了错误的标记,它删除了我们在应用程序中构建的本地Android库中的标记.

 <uses-permission
      android:name="android.permission.ACCESS_COARSE_LOCATION"
      tools:node="remove"/>
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

这是不满意的,因为如果org.altbeacon.beacon库中的权限为chamge,或者将来删除它,则我们的应用程序中将缺少ACCESS_COARSE_PERMISSION.

有关如何正确解决此问题的任何建议?

jib*_*mas 7

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

<uses-permission-sdk-23
        tools:node="removeAll" />
Run Code Online (Sandbox Code Playgroud)

确保您已添加位置权限.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但附带警告.所有清单中都删除了所有uses-permission-sdk-23标记,因此请确保在主应用AndroidManifest.xml中为每个在AndroidManifest.xml文件中删除的uses-permission-sdk-23标记添加一个uses-permission标记.库组件. (2认同)

小智 5

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

这会导致什么原因,因为您在清单中添加了重复的权限,但在行下方分割了权限。

<uses-permission
      android:name="android.permission.ACCESS_COARSE_LOCATION"
      android:maxSdkVersion="22"/>
Run Code Online (Sandbox Code Playgroud)

  • 那对我不起作用。在合并的 AndroidManifest.xml 中,我最终仍然保留了这两行。我明白你想要实现的目标,我们库的权限将被使用到 API 级别 22,然后从 API 级别 23 开始,将使用 altbeacon 的权限。即使它有效,也无法解决我的担忧,即 altbeacon 的更改现在可能会在没有警告的情况下影响我们的应用程序。 (2认同)