为什么 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_SMS
和 RECEIVE_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 上还有更详细的信息。
在将 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_SMS
和 RECEIVE_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 上还有更详细的信息。