【问题标题】:Manifest merger showing implied permissions why?清单合并显示隐含权限为什么?
【发布时间】:2018-09-08 03:49:53
【问题描述】:

我最近升级到了 android studio 3.1,当我将我的项目构建为签名版本时,google play 控制台告诉我有 3 个新权限我没有添加到我的清单中。

然后我查看了清单合并报告,看到了以下解释:

 uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
IMPLIED from /Users/me/Development/QA/android/myapp/app/src/main/AndroidManifest.xml:2:1-222:12 reason: com.google.android.gms.license has a targetSdkVersion < 4
uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from /Users/me/Development/QA/android/myapp/app/src/main/AndroidManifest.xml:2:1-222:12 reason: com.google.android.gms.license has a targetSdkVersion < 4
uses-permission#android.permission.READ_EXTERNAL_STORAGE
IMPLIED from /Users/me/Development/QA/android/myapp/app/src/main/AndroidManifest.xml:2:1-222:12 reason: com.google.android.gms.license requested WRITE_EXTERNAL_STORAGE

这是什么意思,为什么说许可证类的 targetSdkVersion 小于 4?

这是我的 gradle 依赖版本:

  firebase_version = '12.0.1'

    supportlib_version = '27.0.2'

    room_version = '1.0.0'

    espresso_version = '3.0.1'

    archLifecycleVersion = '1.1.1'

这是我的最低 sdks:

android {
compileSdkVersion 27
defaultConfig {
    minSdkVersion 16

    targetSdkVersion 27
    applicationId "com.mobile.myapp"

    multiDexEnabled true
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

我确实检查了release notes 的 google api 并看到 firebase 已更新到 12.0.1,但我已经在使用它了。我的目标是如果谷歌不需要这些权限,我不想要这些权限。如果只是为了许可证文件,我不想包含这些权限?有任何想法吗 ?我也不知道什么是默示许可。但让我在清单中向您展示我的实际权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mobile.myapp">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />

<!-- firebase analytics needs to hold a wake lock -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- hotline io uses record audio dangerous permission, we will remove it here -->
<uses-permission
    android:name="android.permission.RECORD_AUDIO"
    tools:node="remove" />


<supports-screens
    android:anyDensity="true"
    android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:xlargeScreens="true" />

    //...

更新: 这是我的谷歌播放服务版本:

<integer name="google_play_services_version">12211000</integer>

我在这里使用了两个 google play 服务组件,它们是:

  // Analytics
        implementation "com.google.android.gms:play-services-analytics:$firebase_version"

  implementation("com.google.android.gms:play-services-auth:$firebase_version") {
        force = true
    }

firebase_version = '12.0.1' 是最新的。

这里是顶级依赖项:

 dependencies {
    classpath 'com.android.tools.build:gradle:3.1.0'
    classpath 'com.google.gms:google-services:3.2.0'
    classpath 'io.fabric.tools:gradle:1.25.1'
    classpath "com.newrelic.agent.android:agent-gradle-plugin:5.+"
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

【问题讨论】:

  • 您是否也更新了 play google services 的版本?不仅是 Firebase 版本
  • Umar Hussain,我如何更新 google play 服务。检查我的更新并告诉我是否遗漏了什么?
  • 我看到 com.google.gms:google-services:3.2.0 可用,我试试看。我会尽快回来报告
  • @UmarHussain 我升级到 3.2.0 但仍然没有区别。

标签: android android-permissions


【解决方案1】:

以下步骤纠正了该问题:

将 gradle 包装器更新到最新的 4.6

然后创建以下依赖解析策略,强制所有库遵守最新版本(此时)的 google play 库:

subprojects {
    //todo change this to loop once
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$supportlib_version"
            }
            else if(details.requested.group == 'com.google.android.gms'){
                details.useVersion(firebase_version) //this is critical to resolve the error
            }
        }
        resolutionStrategy {
            forcedModules = [
                    "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version",
                    "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
            ]
        }
    }
}

【讨论】:

    【解决方案2】:

    将您的 Google Play 服务升级到 12.0.1

    在其发行说明 (https://developers.google.com/android/guides/releases) 中,您可以找到以下内容:

    在 -license 工件中添加缺少的 minSdkVersion 以防止自动 包含 READ_PHONE_STATE 和 READ_EXTERNAL_STORAGE 权限。

    【讨论】:

    • 我确实这样做了,并多次清理了项目。它没有帮助。我的解决方案纠正了它。我的问题也已经指向这个链接。
    • 将所有 GPS 和 Firebase 依赖项从 v12.0.0 升级到 v12.0.1 对我来说在全 Java 项目上运行良好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 2012-12-04
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多