为什么安装的时候总是要求两个权限?

Why are two permissions always requested during installation?

我正在使用命令行(没有 gradle)构建一个小型虚拟应用程序,只有一个空白 activity,没有权限,没有支持库(或任何其他库,Google 播放等)但 Android 在安装过程中总是提示这两个权限:

我了解在构建过程中包含其他库时如何以及为何合并权限,但我的应用程序没有包含任何内容。我已经从生成的 APK 中提取并解码了已编译的 AndroidManifest.xml,并且其中没有任何 <uses-permission> 标记。

根据 this question,如果未输入 minSdkVersion 值,则会添加 READ_PHONE_STATE,但我在清单中声明了一个(我也可以在编译的清单中看到). 这是源清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dummy.testapp"
    versionCode="1">

    <uses-sdk minSdkVersion="20" targetSdkVersion="22" />

    <application
        android:label="TestApp No Perms"
        android:icon="@drawable/ic_launcher">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

单个 activity (MainActivity) 只是在空白布局上调用 setContentView()

任何人都可以阐明为什么总是请求这些权限或如何防止提示这些权限?

答案归结为 minSdkVersiontargetSdkVersion 属性缺少 android: 前缀。

没有 android: 前缀不会导致资源编译器发出任何警告或错误,但由于缺少前缀,在安装过程中解析 A​​PK 清单时会忽略该值。

最终结果是 Android 认为没有 minSdkVersion 设置,并且如 Why does my app has the READ_PHONE_STATE permission although it's not declared in manifest? 中所报告的那样,自动提示权限。

添加 android: 前缀解决了这个问题,并允许在没有权限提示的情况下安装应用程序。