下面是实际应用中的例子。
因为需要准确时间,所以导入了TrueTime的第三方库,而这个库会声明一个自启动权限BOOT_COMPLETED,来自于AndroidManifest.xml: com.instacart.library.truetime.BootCompletedBroadcastReceiver
第一次看到我没在意,我删除了自己APP中的这个权限。
再次被上架驳回后我发现这是第三方库的权限。在解决这个问题之前,或者说我们上架之前是需要先自查的,下面是自查方案:
- 使用apktool反编译后查看打包之后的
AndroidManifest.xml文件内是否存在敏感权限
# 反编译APK到指定目录
apktool d your_app.apk -o apk_decompile
# 查看合并后的AndroidManifest.xml
cat apk_decompile/AndroidManifest.xml | grep -i "BOOT_COMPLETED"
- 在源码中排除第三方库的该声明
<?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="com.your.package.name">
<!-- 1. 移除开机自启权限(如果有的话) -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"
tools:node="remove"/>
<application>
</application>
</manifest>
- Gradle 构建时排查依赖
# 查看所有依赖(Android项目)
./gradlew app:dependencies --configuration releaseRuntimeClasspath
# 结合grep筛选(Mac/Linux)
./gradlew app:dependencies | grep -i "boot"
- 我使用的方案,也是最简单的方案:使用jadx反编译后查看配置文件中的权限
下面是解决这个问题的方案:
1. 删除第三方库
简单见效快
2. 移出权限
<?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="com.miaoyuyin.miao">
<!-- 保留你原有所有配置,仅添加以下移除声明 -->
<!-- 1. 移除开机自启权限(如果第三方库声明了) -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"
tools:node="remove"/>
<application
<!-- 保留你原有所有application属性和子组件 -->
>
<!-- 2. 精准移除TrueTime库的开机广播接收器 -->
<receiver
android:name="com.instacart.library.truetime.BootCompletedBroadcastReceiver"
tools:node="remove" />
<!-- 你原有所有Activity/Service/Provider等组件 -->
</application>
</manifest>
在修改之后,再次提交之前,你可以使用上面的自查方案再次验证是否已经修改完善!

发表回复