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