使用jadx反编译时AndroidManifest移除的权限仍显示问题求助
可能的原因及对应解决方法
未引入tools命名空间
这是最容易忽略的细节:如果AndroidManifest.xml根<manifest>标签里没声明tools命名空间,所有带tools前缀的属性都会被系统忽略。检查并补充命名空间声明:<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="你的应用包名">单个remove无法覆盖所有来源的权限
这些权限大概率是第三方依赖库的Manifest文件带入的,仅用tools:node="remove"只能移除当前Manifest中主动声明的权限,无法清除依赖库引入的权限。换成tools:node="removeAll"强制移除所有来源的对应权限:<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" tools:node="removeAll" /> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" tools:node="removeAll" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="removeAll"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:node="removeAll"/> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" tools:node="removeAll"/>编译缓存导致旧配置残留
Gradle的构建缓存可能保留了旧的Manifest合并结果,清理后重新构建即可:- Android Studio操作:顶部菜单栏点击
Build -> Clean Project,完成后再点击Build -> Rebuild Project - 命令行操作:执行
./gradlew clean assembleRelease(根据你的打包需求,将Release替换为Debug等变体)
- Android Studio操作:顶部菜单栏点击
依赖库带入权限未被处理
可以先定位权限来源:执行./gradlew 你的模块名:mergeReleaseManifest(比如app模块就是app:mergeReleaseManifest),然后去构建目录找到合并后的Manifest文件(路径一般为模块名/build/intermediates/merged_manifests/变体名/AndroidManifest.xml),查看权限对应的android:origin属性,就能知道是哪个依赖库引入的。
除了用removeAll,也可以在依赖声明时排除该库的权限,但这种方式通用性不如removeAll:implementation('com.example.library:xxx:1.0.0') { exclude group: 'com.android.support', module: 'support-v4' // 示例,实际根据权限来源调整 }多渠道/产品风味的Manifest覆盖
如果应用使用了产品风味(productFlavors)或多渠道打包,每个风味的Manifest可能单独声明了这些权限,需要确保每个风味的Manifest也添加了removeAll,或者在主Manifest中用removeAll强制覆盖所有风味的配置。
验证方法
不要只依赖jadx的结果,建议直接解压APK,取出里面的AndroidManifest.xml(二进制格式,可使用AXMLPrinter2等工具转换为可读文本),确认权限是否真的残留,避免jadx缓存导致的误判。
内容的提问来源于stack exchange,提问作者Adriano Araujo

