Android 清单重复权限
Android Manifest Duplicate Permissions
我们的应用程序包含第三方库 (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库模块build.gradle中targetSdkVersion设置为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 本身并提取二进制清单:
~/.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 库中的权限更改或将来删除,我们的应用程序中将缺少 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" />
如本 post 中所述,您必须指定清单应如何处理权限。您可能包含了一个传递性已经需要此权限的库,例如 READ_PHONE_STATE。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
如果您在清单中重新声明此权限,它会发出警告,因为它不知道如何处理这两个声明(即使它们可能只是声明相同)。
如果你愿意在你的应用中转发这个权限,你可以这样修改:
<uses-permission tools:node="merge" android:name="android.permission.READ_PHONE_STATE" />
如果您不愿意在您的应用中转发该权限,您可以明确删除该权限:
<uses-permission tools:node="remove" android:name="android.permission.READ_PHONE_STATE" />
我们的应用程序包含第三方库 (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库模块build.gradle中targetSdkVersion设置为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 本身并提取二进制清单:
~/.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 库中的权限更改或将来删除,我们的应用程序中将缺少 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" />
如本 post 中所述,您必须指定清单应如何处理权限。您可能包含了一个传递性已经需要此权限的库,例如 READ_PHONE_STATE。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
如果您在清单中重新声明此权限,它会发出警告,因为它不知道如何处理这两个声明(即使它们可能只是声明相同)。
如果你愿意在你的应用中转发这个权限,你可以这样修改:
<uses-permission tools:node="merge" android:name="android.permission.READ_PHONE_STATE" />
如果您不愿意在您的应用中转发该权限,您可以明确删除该权限:
<uses-permission tools:node="remove" android:name="android.permission.READ_PHONE_STATE" />