我正在尝试将我的 Android 应用程序上传到 Play 商店,但由于后台位置权限而不断被拒绝:“功能不满足后台位置访问要求”。
我的清单声明了 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION,但不包括 ACCESS_BACKGROUND_LOCATION。由于我的应用程序目标 API 30 并且最小 API 是 29,因此我没有隐式使用后台位置。
然而,当我在 Play 商店中上传我的应用程序时,我可以看到我的捆绑包包含 android.permission.ACCESS_BACKGROUND_LOCATION,这让我相信我的应用程序中的某些依赖项正在使用此权限。
这可能吗?如果是这样,我怎样才能找到哪个是?
有时我们确实需要列出依赖项引入的所有权限。这是我为此编写的脚本。将此脚本添加到您的应用程序 build.gradle 中,
import com.android.build.gradle.AppExtension
import com.android.build.gradle.internal.api.ApplicationVariantImpl
import com.android.build.gradle.internal.publishing.AndroidArtifacts
// Gradle script to list permissions of dependencies.
def androidExtension = project.extensions.findByType(AppExtension.class)
if (androidExtension != null) {
project.afterEvaluate {
tasks.register('listpermissions') {
doFirst {
androidExtension.applicationVariants.forEach {
def variantData = (it as ApplicationVariantImpl).variantData
def manifests = variantData.variantDependencies.getArtifactCollection(
AndroidArtifacts.ConsumedConfigType.RUNTIME_CLASSPATH,
AndroidArtifacts.ArtifactScope.ALL,
AndroidArtifacts.ArtifactType.MANIFEST)
println("================================================================================================")
println('| LIST PERMISSIONS FOR ' + it.name)
manifests.forEach { manifest ->
if (manifest.file.exists()) {
def xml = new XmlSlurper().parseText(manifest.file.text)
def usesPermissions = xml.'uses-permission'
if (usesPermissions.size() > 0) {
println("| LIBRARY: " + manifest.file.parentFile.name + ' (' + usesPermissions.size() + ')')
usesPermissions.each { println("| PERMISSION: " + it.'@android:name') }
println("================================================================================================")
}
}
}
}
}
}
}
}
然后通过
gradlew :app:listpermissions
运行gradle任务来列出每个依赖项使用的所有权限。例如,
================================================================================================
| LIST PERMISSIONS FOR googleRelease
| LIBRARY: jetified-vmlib-3.0.3 (1)
| PERMISSION: android.permission.ACCESS_NETWORK_STATE
================================================================================================
| LIBRARY: jetified-matisse-1.3.1 (2)
| PERMISSION: android.permission.WRITE_EXTERNAL_STORAGE
| PERMISSION: android.permission.READ_EXTERNAL_STORAGE
================================================================================================
| LIBRARY: biometric-1.1.0 (2)
| PERMISSION: android.permission.USE_BIOMETRIC
| PERMISSION: android.permission.USE_FINGERPRINT
================================================================================================
| LIBRARY: jetified-vmlib-network-3.0.1 (2)
| PERMISSION: android.permission.ACCESS_NETWORK_STATE
| PERMISSION: android.permission.INTERNET
================================================================================================
....