如何查找依赖项使用的权限? - 安卓

问题描述 投票:0回答:1

我正在尝试将我的 Android 应用程序上传到 Play 商店,但由于后台位置权限而不断被拒绝:“功能不满足后台位置访问要求”。

我的清单声明了 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION,但包括 ACCESS_BACKGROUND_LOCATION。由于我的应用程序目标 API 30 并且最小 API 是 29,因此我没有隐式使用后台位置。

然而,当我在 Play 商店中上传我的应用程序时,我可以看到我的捆绑包包含 android.permission.ACCESS_BACKGROUND_LOCATION,这让我相信我的应用程序中的某些依赖项正在使用此权限。

这可能吗?如果是这样,我怎样才能找到哪个是?

android google-play android-permissions google-play-console
1个回答
0
投票

有时我们确实需要列出依赖项引入的所有权限。这是我为此编写的脚本。将此脚本添加到您的应用程序 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
================================================================================================
....
© www.soinside.com 2019 - 2024. All rights reserved.