很多包一装上权限就“满汉全席”,杀软直接打上“风险应用”的标签。其实大多数场景根本用不到那么多。下面按实战思路把怎么查、怎么减、常见坑说清楚,顺手附上高频权限的中文释义,方便你照着
AndroidManifest.xml
逐项体检。
——截图里那种 Manifest 文件,一眼能看见 <uses-permission …/>
一串,排查就从这里开刀。
先做三件事
- 看清目标 SDK 与编译 SDK
compileSdkVersion / targetSdkVersion
影响权限行为。比如 Android 6.0 起“危险权限”要运行时动态申请,仅写在 Manifest 不生效。 - 用最小集原则删到只剩“必需”
Manifest 里能删的先删,真的要在运行时再申请。经验法则:先跑、看崩点、再加权限,而不是先全开。 - 把“潜在拉警报”的权限先下线
像READ_SMS/RECEIVE_SMS/WRITE_APN_SETTINGS/SYSTEM_ALERT_WINDOW/QUERY_ALL_PACKAGES
等,除非强需求,否则一律去掉或做白名单申请说明。
高频权限怎么判断要不要
INTERNET
网络应用必备,别删。本地纯离线应用才可去掉。
ACCESS_NETWORK_STATE / ACCESS_WIFI_STATE / CHANGE_WIFI_STATE
只要你要判断网络类型或切换 Wi-Fi才需要;普通联网不必全要。READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE
Android 10+ 用分区存储;能走MediaStore
、SAF
就别申请外部存储的读写大权。实在要写外部盘,最起码只留READ
或只留WRITE
,别两个都上。CAMERA / RECORD_AUDIO
涉及拍摄、录音才申请;运行时弹窗要给清晰用途文案。用完记得释放资源,避免后台“偷吃麦克风”嫌疑。ACCESS_COARSE_LOCATION / ACCESS_FINE_LOCATION / ACCESS_BACKGROUND_LOCATION
只在前台需要定位就别申后台定位;Android 10+ 后台定位是“红线权限”,极易触发风控。READ_PHONE_STATE / READ_PHONE_NUMBERS / READ_PRECISE_PHONE_STATE
读取设备/蜂窝信息。没有电话相关需求基本都可以移除。QUERY_ALL_PACKAGES
会被认为“过度枚举”。若只是查某些 app,改为包名白名单 +queries
节点。SYSTEM_ALERT_WINDOW
(悬浮窗)
需要去设置里手动授权,审核/风控风险高。能不用就不用。POST_NOTIFICATIONS
(Android 13+)
发通知就申;否则别要。BLUETOOTH_CONNECT / BLUETOOTH_SCAN / NEARBY_WIFI_DEVICES
(Android 12+)
真连接/扫描才需要;只做本地逻辑,直接删。WAKE_LOCK
后台保活类权限。滥用会被系统限流,除非确实要长时任务。
怎么做一次干净的权限体检
- 粗排除:打开 Manifest,把“短信/通话/位置/存储/悬浮窗/包枚举”等高风险条目先标记,确认是否真有业务场景。
- 运行时拦截:在关键入口加检查与兜底提示,拒绝则降级功能,不要崩。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 1001) }
- 灰度验证:拉一台“干净机”装包跑全链路,
adb logcat | grep denied
看权限拒绝与崩点。 - 静态扫描:用
aapt dump badging app.apk
或apkanalyzer manifest print
列出最终生效的权限,和你预期清单对齐。 - 精简 third-party SDK:很多“莫名权限”都来自 SDK。能不开的模块别引,必要模块用不带电话/定位的无埋点版。
一个常见“瘦身”示例
<!-- 原来一长串 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<!-- 精简后(典型只联网 + 写缓存的应用) -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <!-- Android 13+ 如需通知 -->
你给的权限大表怎么用
- 当对照字典:遇到陌生项,先看它中文释义和系统版本要求(比如
BIND_*
多为系统/特权,普通 App 不该出现)。 - 当风险清单:凡是涉及短信、电话、后台定位、悬浮窗、包枚举、系统设置修改的,都优先评估可替代方案。
- 当沟通材料:和安全/审核/渠道对齐权限用途说明,减少上架驳回。
最后
权限越少,风控越低、通过率越高、用户更敢装。做功能不是靠“把权限全开”,而是按需开启 + 运行时解释 + 拒绝可降级。
转载请注明出处,若转载请保留作者署名与出处链接,感谢支持开源精神与知识传播。
仅限技术交流,禁止商用!