kotlin 我应用使用的权限申请介绍

xzbxzb 安卓 2026-01-23 70 0

明明在应用清单(Manifest)里只声明了网络、存储、相机等少数权限,还主动移除了位置权限,但上架检测却测出了更多权限请求(比如之前提到的后台位置、悬浮窗、修改系统设置等),想知道这种权限不匹配的根本原因。

核心原因分析

这种 “声明的权限” 和 “检测出的权限” 不一致的情况,在安卓开发中非常常见,核心原因是权限会通过非主工程的渠道被引入,而非你手动声明的部分,具体分以下几类:

1. 第三方 SDK / 依赖库自动引入权限(最常见)

你用到的 “激光推送” SDK(以及可能的其他依赖,比如图片选择、相机封装库等),其自身的 AndroidManifest.xml 中可能声明了额外权限,安卓构建时会自动合并所有依赖的 Manifest,最终打包的 APK 中会包含这些 “隐式引入” 的权限。
  • 举例:

    • 激光推送 SDK 可能为了实现后台推送、唤醒设备,额外声明了 ACCESS_BACKGROUND_LOCATION(后台位置)、SYSTEM_ALERT_WINDOW(悬浮窗)等;

    • 某些相机 / 相册库可能为了兼容旧版本,声明了 READ_PHONE_STATE(读取通话状态)等无关权限。

  • 验证方式:

    打开安卓工程的 build/outputs/logs/manifest-merger-xxx-report.txt(构建日志),搜索 “permission”,能清晰看到每个权限的来源(主工程 / 某个依赖库)。

2. tools:node="remove" 生效失败

你用了 tools:node="remove" 移除位置权限,但如果缺少必要的命名空间声明,这个属性会失效,导致移除操作没生效:
  • 错误场景:Manifest 根节点未添加 xmlns:tools="http://schemas.android.com/tools",此时 tools:node="remove" 是无效的,位置权限仍会被保留 / 合并。

  • 正确写法示例:

  • <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"  <!-- 必须加这个命名空间 -->
        package="你的包名">    <!-- 此时remove才会生效 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/></manifest>

3. 上架检测不仅检测 “Manifest 声明的权限”,还检测 “运行时申请的权限”

部分应用商店的检测工具会扫描 APK 的代码(反编译),如果代码中存在 Context.checkSelfPermission()Activity.requestPermissions() 等动态申请权限的逻辑,即使 Manifest 没声明,也会被标记为 “请求了该权限”。
  • 举例:如果激光推送 SDK 的代码里包含申请 ACCESS_BACKGROUND_LOCATION 的逻辑,即使你没声明,检测工具也会判定应用 “请求了该权限”。

4. 权限的 “隐式关联”(少数情况)

安卓中某些 uses-feature 或系统 API 调用,会被检测工具判定为 “需要对应权限”:
  • 比如声明 android.hardware.camera(即使 required=false),部分检测工具会关联到 “相机权限” 之外的辅助权限;

  • 调用 Settings.System.putInt() 等修改系统设置的 API,即使没声明 WRITE_SETTINGS,也会被标记为 “请求修改系统设置权限”。

解决方案(按优先级)

1. 排查并移除依赖库引入的多余权限

在 Manifest 中对所有非必要的、由依赖引入的权限,统一用 tools:node="remove" 移除(确保命名空间正确):
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="你的包名">

    <!-- 你原有声明的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <!-- 主动移除所有非必要的、由依赖引入的权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/>
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" tools:node="remove"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" tools:node="remove"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:node="remove"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="remove"/>
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:node="remove"/></manifest>

2. 检查第三方 SDK 的配置,关闭不必要的功能

联系激光推送 SDK 的开发者,或查看其文档,关闭 SDK 中不需要的功能(比如后台位置、悬浮窗推送等),从源头减少权限引入。

3. 验证最终打包的 Manifest

构建 APK 后,用 Android Studio 的 “Build> Analyze APK” 功能打开 APK,查看 AndroidManifest.xml,确认所有多余权限已被移除。

4. 针对 “运行时申请权限” 的检测结果

如果检测报告是因为代码中存在动态申请权限的逻辑,需:
  • 移除代码中无关的权限申请逻辑;

  • 若 SDK 内置了该逻辑且无法移除,需在应用商店的上架说明中解释 “该权限为 SDK 内置,但应用未实际使用,已通过 Manifest 移除”。

总结

  1. 权限不匹配的核心原因是第三方 SDK / 依赖库隐式引入权限,其次是 tools:node="remove" 命名空间缺失导致移除失效。

  2. 解决关键是:补全 tools 命名空间,主动移除所有非必要权限,验证最终 APK 的 Manifest。

  3. 若检测结果包含 “运行时申请权限”,需要么移除对应代码,要么在审核时说明权限未实际使用。


 您阅读本篇文章共花了: 

版权声明

本文章如果涉及侵权,请联系我。
部分文章系本人原创未经许可,不得转载。

喜欢0发布评论

评论列表

发表评论

  • 昵称(必填)
  • 邮箱
  • 网址