为什么从AndroidManifest.xml中删除权限不起作用?

4
在Google Play商店中,有一款名为“bodyweight fitness”的应用程序,不需要任何权限。 它也可以在Github上找到: https://github.com/mazurio/bodyweight-fitness-android 我使用来自Github的文件,并使用Android Studio编译了apk(未更改文件)。 当我尝试安装自己编译的app apk时,它告诉我它将要使用INTERNET,尽管Play商店app没有此权限。 这个应用程序没有任何理由需要任何互联网连接。 因此,我从AndroidManifest.xml中删除了这行代码: <uses-permission android:name="android.permission.INTERNET" /> 编译并安装应用程序后,仍然会提示它将使用INTERNET。 有人知道为什么以及如何删除此权限吗?
注:我已经联系开发者,但是还没有得到回复。
更新:
  • 你说得对,这也是从另一个部分添加的:crashlytics。
  • 你也是对的,关于隐藏权限。当应用程序安装后,它在应用程序详情中显示,并且在Play商店中单击“权限”按钮时也会显示。

2
你的gradle文件中至少有一个库也具有像craslytics一样的权限。 - tyczj
当我尝试安装自己编译的应用程序apk时,它告诉我它将使用INTERNET,尽管Play Store应用程序没有报告INTERNET权限已经多年了,因为大多数应用程序都会请求该权限。 - CommonsWare
3个回答

8
每个Android库都包含清单文件,其中包括包、权限、活动等信息,因此您的应用程序将显示来自依赖项的所有权限。您可以在{projectDir}/{moduleDir}/build/outputs/logs/manifest-merger-*-report.txt处检查最终清单创建日志。
此日志将包含类似以下内容的内容:
uses-permission#android.permission.INTERNET
ADDED from {myModulePath}/app/src/main/AndroidManifest.xml:6:5-67
MERGED from [net.hockeyapp.android:HockeySDK:4.1.1] /Users/devindi/.android/build-cache/ce70c6f87efc05633a59a88fccdb712db509e22d/output/AndroidManifest.xml:12:5-67
MERGED from [com.crashlytics.sdk.android:crashlytics:2.6.8] /Users/devindi/.android/build-cache/424d420499b90aec0a26ab1b5f575e318d0342b9/output/AndroidManifest.xml:9:5-67
MERGED from [com.crashlytics.sdk.android:beta:1.2.5] /Users/devindi/.android/build-cache/be2498e53f6aa976b3927954da943b23f0a800f6/output/AndroidManifest.xml:9:5-67
MERGED from [com.crashlytics.sdk.android:crashlytics-core:2.3.17] /Users/devindi/.android/build-cache/e5b1b150113ac2f0789b76a886f379cdafa8af2b/output/AndroidManifest.xml:52:5-67
MERGED from [com.crashlytics.sdk.android:answers:1.3.13] /Users/devindi/.android/build-cache/c86f3a3daec296cb6a32deb0b3d0c3f1370a024f/output/AndroidManifest.xml:9:5-67
MERGED from [io.fabric.sdk.android:fabric:1.3.17] /Users/devindi/.android/build-cache/0a51b13dbc46dc870c598edab9d128bf8f26a8d4/output/AndroidManifest.xml:29:5-67

你可以看到我在manifest文件中请求了网络权限,并且hockeyapp、crashlytics和fabric库也请求了相同的权限。 https://developer.android.com/studio/build/manifest-merge.html

如果想强制移除权限,只需在权限声明中添加tools:node=”remove”即可,如下所示:

<uses-permission android:name=”android.permission.INTERNET” tools:node=”remove” />

1
同时,最终的清单位于此处:{modulePath}/build/intermediates/manifests/full/{flavor/buildType}/AndroidManifest.xml。 - Andrew
1
请注意,阻止权限可能会导致应用程序崩溃,当它使用某些自身使用互联网的东西时(例如Crashlytics)。 - CommonsWare
当某些代码尝试执行网络请求时,安卓系统会抛出安全异常。因此,研究哪个库添加了网络权限到您的应用程序是一个很好的工具。 - Andrew
是的,谢谢。这是由Crashlytics重新添加的。对我来说,“tools:node”部分不起作用。它会导致一个关于“tools”未绑定的错误。但我认为我将简单地忽略此权限。Crashlytics似乎仅在调试构建变体中激活。 - Welcor
通常IDEA/Android Studio会建议添加工具定义。https://developer.android.com/studio/write/tool-attributes.html 在清单文件的根标签中添加xmlns:tools="http://schemas.android.com/tools" - Andrew

1
这是因为INTERNET权限是一个“无害”的权限。这意味着您不必请求用户的许可,且它不会显示在Google Play商店中
自Android 5.0以来,权限具有“保护级别”。有些是危险的,有些是正常的。正常意味着作为应用程序开发人员,您不必请求用户的许可,并且它不会显示在Google Play中。危险意味着Google Play会显示它,您必须请求用户的许可。
来源和进一步阅读:Android Developers

1

通过Android Studio开发安装的应用程序、通过APK安装和通过Google Play商店安装的应用程序之间存在区别。在后一种情况下,某些权限将自动授予,例如互联网或在其他应用程序上绘制。在规划部署策略时,您需要考虑到这一点。


在应用程序上绘制并不会自动授权,互联网也是如此。两者都需要在清单中声明(第一个甚至需要用户明确授予权限),但其中一个是无害的,而另一个则是“危险”的。 - Twometer
啊,是的,你说得对。我的意思是,从Google Play安装的应用程序,在清单中正确声明权限(有些可能是无害的,有些可能是危险的),与从APK或通过Android Studio安装的完全相同的应用程序行为不同。 - Matt from vision.app

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接