为什么HMS PushKit需要android.permission.REQUEST_INSTALL_PACKAGES

Why HMS PushKit needs android.permission.REQUEST_INSTALL_PACKAGES

最近我用这个gradle代码添加了HMS PushKit SDK:

implementation "com.huawei.hms:push:5.0.4.302"

在那之后我注意到我的应用程序添加到应用程序列表中,可以从未知来源安装应用程序(特殊权限)。我检查了这个库的一个依赖项 (com.huawei.hms.base.availableupdate) 的 AndroidManifest.xml 文件,发现它有这个特殊权限:

<!-- If it is Android 8.0, the targetSdkVersion of the application compilation configuration>=26, please be sure to add the following permissions --> 
<uses-permission  android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

那么为什么 PushKit 需要这个权限?我不希望我的应用程序使用此权限。如果我用这段代码删除它会不会有问题(崩溃):

<uses-permission
        android:name="android.permission.REQUEST_INSTALL_PACKAGES"
        tools:node="remove"/>

android.permission.REQUEST_INSTALL_PACKAGES 是允许 Android 上的框架或组件引用外部(最常见的 maven)存储库的权限,以最小化最终安装的 apk 大小最终用户通过远程安装源代码,而不是将其全部打包在同一个 apk 中(用于初始下载)。

谨慎使用此权限,因为如果启用它,不是在您的应用程序上,而是在依赖项上,它将被拒绝。这是因为如果您的依赖项存在任何安全问题,当您将应用程序包上传到商店时,google 无法识别它。这是因为源代码是远程下载的,而不是打包在 google 可以剥离的同一个 apk 中。

因此google不会接受这个apk,会被拒绝(只是因为google不知道,也无从知晓是否有恶意代码被包含在内在最终用户包中)。

你可以尝试fork这个库,把manifest的权限去掉,但是会遇到方法缺失的异常。

在这种情况下,您最好的选择是找到另一个不从远程 Maven 存储库安装额外源代码的库,以避免 google Play 商店拒绝。

看看这个包,它看起来像是一个构建在 Android SDK 之上的 SDK。如果你有办法解决这个问题,直接在 google android sdk 上工作,同时让客户不会注意到,那应该没问题。归根结底,客户并不关心你是怎么做的,只要它有效。

更新

取消权限后,华为手机不受影响,但非华为手机可能无法安装HMS Core APK

会不会导致我们的应用因为升级失败而崩溃?--不会,只会使应用无法自动升级,必须卸载并下载新版本。


<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

该权限用于更新HMS Core和推送包APK。推送服务强依赖HMS Core和推送服务APK。如果不授予该权限,可能会导致应用安装失败,导致HMS和推送包APK升级失败。

因此,此权限是强制性的。