为什么 android.hardware.telephony 功能会自动添加到 android 应用中

why android.hardware.telephony feature is being added automatically in android app

在将 apk 发布到 Play 商店时,我发现我的应用程序需要 android.hardware.telephony 功能,但我没有在清单中的任何地方添加它。我还检查了 android studio 中的合并清单,它也不包含此功能,因此我认为没有第三方 sdk 添加此功能。此功能的来源是什么?

作为参考,我在清单中声明了以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

此外,当我使用以下代码将其设为可选时,该应用程序可在没有此功能的设备上使用:

<uses-feature
    android:name="android.hardware.telephony"
    android:required="false" />

那么为什么默认需要而不在任何地方添加它?

您的项目正在使用的一个或多个依赖项/模块/库正在将该要求添加到您的 Android Manifest

要进行调查,请打开 Android Studio 中的主 Android Manifest 文件,然后单击页面底部的 Merged Manifest 选项卡。

这将向您展示最终合并清单的视图,以及每一行的来源。

在此处阅读更多相关信息:https://developer.android.com/studio/build/manifest-merge#inspect_the_merged_manifest_and_find_conflicts

如何修复

如果您希望避免将该要求添加到您的最终清单中,您可以在您的清单中使用节点标记来控制合并的工作方式。

在此处阅读有关节点标记的更多信息:https://developer.android.com/studio/build/manifest-merge#node_markers

例如试试这个:

<uses-feature
    android:name="android.hardware.telephony"
    android:required="false"
    tools:node="replace" />

Google Play 会自动添加一些功能,具体取决于您请求的权限。

由于您请求了 READ_SMSRECEIVE_SMS 权限,这意味着您使用了 telephony 功能。因此,Google Play 的反应就好像您在 AndroidManifest.xml 中有以下内容:

<uses-feature
    android:name="android.hardware.telephony"
    android:required="true" />

当您手动添加并声明它 required="false" 时,这会告诉 Google 播放当您请求许可时,您可以处理用户没有 telephony 特征。

这已通过 this note in the docs 确认:

Note: Some system permissions implicitly require the availability of a device feature. For example, if your app requests permission to access to BLUETOOTH, this implicitly requires the FEATURE_BLUETOOTH device feature.

完整的权限列表和隐含的功能要求是 available here,包括您的情况:

最后,对于 ACCESS_COARSE_LOCATION,您还声明了对 android.hardware.location 的功能要求,仅供参考。

the GameDev StackExchange 上还有更详细的信息。