xml详解 - tools:replace android:authorities




Android清单重复权限 (2)

我们有一个由第三方库(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" />

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

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

在app模块中,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库chamge中的权限,或将来被删除,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" />




altbeacon