Android Manifest重复权限
我们有一个由第三方库(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将从我们的应用程序中丢失。
有关如何正确解决此问题的任何建议?
在您的应用清单文件中添加下面的合并规则。
<uses-permission-sdk-23
tools:node="removeAll" />
确保您已添加位置权限。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
这有效,但带有警告。在所有清单中删除了所有使用权限-sdk-23标记,因此请确保您在AndroidManifest.xml文件中删除的每个uses-permission-sdk-23标记在主应用AndroidManifest.xml中添加了uses-permission标记。库组件。 – BitByteDog
Android Studio说,名称属性丢失: '
只需将下面的行替换为您现有的使用权限即可解决问题。
这是什么原因造成的,因为您在清单中添加了重复权限,但是在行下分割了权限。
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="22"/>
这为我修好了!谢谢! – green0range
这对我不起作用。在合并的AndroidManifest.xml文件中,两行仍然保留。我明白了你想达到的目标,但是我们库的许可权将被用于API级别22,然后API级别23将使用来自altbeacon的许可权限。即使它起作用了,它也不会解决我的担忧,即如果没有警告,altbeacon的更改现在可能会影响我们的应用程序。 – BitByteDog
我有完全相同的问题。 – green0range
我已经向Google提交了一个缺陷 - https://issuetracker.google.com/issues/62267639 – BitByteDog
够搞笑的是,我们现在正面对与这个完全相同的库完全相同的问题! –