2017-06-01 83 views
12

我们有一个由第三方库(altbeacon),本地构建的Android库和应用程序组件组成的应用程序。所有这三个组件都有一个AndroidManifest.xml,它们在构建期间被合并。该应用程序使用gradle构建。Android Manifest重复权限

该应用长期以来一直在Google Play商店上发布。在最后一次迭代中,我们将API级别从22级升级到了25级。所有内容都没有错误地构建,APK安装并在真实设备上测试,没有错误,但是当我们在Google Play上更新应用时,APK上传失败错误:

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

Anaylyzing的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设置为25的build.gradle和AndroidManifest.xml包含:

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

在app模块中,targetSdkVersion在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" /> 

,只是确认,看在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将从我们的应用程序中丢失。

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

+0

我有完全相同的问题。 – green0range

+2

我已经向Google提交了一个缺陷 - https://issuetracker.google.com/issues/62267639 – BitByteDog

+0

够搞笑的是,我们现在正面对与这个完全相同的库完全相同的问题! –

回答

7

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

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

确保您已添加位置权限。

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

这有效,但带有警告。在所有清单中删除了所有使用权限-sdk-23标记,因此请确保您在AndroidManifest.xml文件中删除的每个uses-permission-sdk-23标记在主应用AndroidManifest.xml中添加了uses-permission标记。库组件。 – BitByteDog

+0

Android Studio说,名称属性丢失: '' 但是,当我构建它时,一切正常。 – egmontr

4

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

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

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

+0

这为我修好了!谢谢! – green0range

+2

这对我不起作用。在合并的AndroidManifest.xml文件中,两行仍然保留。我明白了你想达到的目标,但是我们库的许可权将被用于API级别22,然后API级别23将使用来自altbeacon的许可权限。即使它起作用了,它也不会解决我的担忧,即如果没有警告,altbeacon的更改现在可能会影响我们的应用程序。 – BitByteDog