安卓棉花糖,"危险"保护级别和系统组件/应用程序

10

我正在开发一个应用程序,将作为固件的预安装系统应用。

从目前关于系统应用, 新权限模型和保护级别之间关系的文档来看,我不确定系统应用在什么情况下(如果需要的话)需要请求用户权限。

当我尝试使用WRITE_EXTERNAL_STORAGE权限时,我的问题开始了。从文档中可以看出,它被标记为“危险”权限。

- “危险”权限是否自动授予系统应用?

当我作为系统应用使用WRITE_EXTERNAL_STORAGE权限时,我遇到了安全异常,我不知道这是否意味着即使我的应用程序被安装为系统应用 - “危险”权限也必须由用户请求。

另外需要提到的一点:
为了将我的应用程序作为系统应用程序检查,我正在将应用程序APK安装在运行SDK预览3的Nexus 5的sys-priv目录中(设备已获取root权限)。当我尝试使用需要外部存储权限的方法时,我遇到了安全异常。

你好 Tal,你对你的问题有什么结论了吗?我也遇到了同样的情况,发现了一些让我感到困惑的结果。我刚刚给我的 Nexus 5 刷了一个新的 M 映像,并检查了预装应用程序的权限。其中大部分默认被授予了一些危险的权限。例如,Hangouts 可以访问联系人、电话和短信。电话应用程序再次可以访问通话、联系人和电话。照片应用程序可以访问存储。这怎么可能呢?应该有一种方法来授予预装应用程序一些权限,对吧? - mehmet6parmak
@mehmet6parmak:是的,我有结论。就像commonsWare所回答的那样,在开发者预览版3(以及最终的Android 6版本)中,危险权限不会自动授予系统应用程序。即使您的应用程序安装为系统应用程序,您仍需要请求用户授予这些权限。 - Tal Kanel
可能是因为它们使用了与已经拥有此权限的其他谷歌组件相同的证书进行签名(请参阅保护级别定义...),因此您可以看到授予此权限的谷歌应用程序,而无需用户交互。 - Tal Kanel
感谢您的快速回复,即使它们共享相同的签名和sharedUserId,也应该有一个默认拥有这些权限的应用程序,对吧?那个应用程序怎么可能拥有它呢?是哪个应用程序呢? :) - mehmet6parmak
我不知道 :-( 但当你找到答案后,能告诉我吗?我会很高兴听到你的发现。 - Tal Kanel
2个回答

9

经过大量的挖掘和调试,我终于找到了一些在Marshmallow中为系统应用程序授予权限的线索,在这个stackoverflow帖子中获得了很多启发。

关键逻辑在DefaultPermissionGrantPolicy中。SystemReady之后,PackageManagerService检查是否尚未设置此用户的默认运行时权限(即这是一个新用户),如果是,则PackageManagerService调用DefaultPermissionGrantPolicy.grantDefaultPermissions()来检查/授予权限:

public void grantDefaultPermissions(int userId) {
    grantPermissionsToSysComponentsAndPrivApps(userId);
    grantDefaultSystemHandlerPermissions(userId);
}

您的内置应用程序可能会自动获得运行时权限的两种情况:

A> grantPermissionsToSysComponentsAndPrivApps -> 将使用FLAG_PERMISSION_SYSTEM_FIXEDFLAG_PERMISSION_GRANTED_BY_DEFAULT授予权限。

  • 如果您的系统应用程序具有uid<10000,则将为您的用户组授予权限。
  • 如果您的系统应用程序符合以下所有条件,则将授予其权限。

    1. 是特权应用程序(位于/system/priv-app/下)
    2. 是永久性的(android:persistent="true")
    3. 签名使用平台签名。

B> grantDefaultSystemHandlerPermissions -> 将使用FLAG_PERMISSION_GRANTED_BY_DEFAULT授予权限。

  • 如果您的应用程序被视为“默认平台处理程序应用程序”(即您的应用程序“预计可以开箱即用”,例如相机、拨号器、短信、日历等,请在方法grantDefaultSystemHandlerPermissions()中了解更多信息)。

除此之外,只要目标SDK设置为23,您的系统应用程序就需要向用户请求危险权限。


你有没有其他推荐的资源?我正在为定制硬件开发系统/priv-app/应用程序,但没有访问平台密钥。然而,在我测试的Android电视上,我注意到Facebook应用和另一个应用在出厂重置时自动授予权限。这是怎么回事? - parkgrrr
你在Facebook上看到的自动授权权限是运行时权限还是安装权限?你正在使用的Facebook应用程序是否针对23+ SDK? - Gracie

5
引用第二次M预览版的发布说明:

系统镜像中包含的应用将不再自动被授予危险权限。所有应用都应在运行时检查和请求权限。

这符合我第一次使用Nexus 5配备最终版本6.0预览固件的库存相机应用程序时所看到的情况 - 它也要求运行时权限。
因此,据我所知,系统应用程序必须请求运行时权限,非系统应用程序也必须请求运行时权限。

2
@TalKanel: 既然一开始是“不,系统应用程序不需要请求运行时权限”,而后改为“实际上,系统应用程序确实需要请求运行时权限”,如果它再次改回去,我会感到惊讶的。 我认为设备制造商/ROM修改者有一些方法可以预先填充授予的权限数据库。 但由于用户始终可以撤销这些权限,因此您仍需要进行一定量的运行时权限检查。 - CommonsWare
有一件事我不太明白:似乎谷歌应用商店(我验证了它的目标版本是23)不需要要求用户授权写入外部存储器来下载和安装APK文件。当我从谷歌应用商店中点击“安装”按钮时,整个过程都非常顺畅。这是怎么做到的呢? - Tal Kanel
@TalKanel:抱歉,我不知道"Google Play 应用程序"是什么。 - CommonsWare
@TalKanel:你可能需要问问谷歌。话虽如此,据我所知,Play Store应用程序不会写入外部存储器。 - CommonsWare
1
@TalKanel:我会认为Play商店下载到内部存储,并且它有特殊的技巧来以这种方式与包安装程序一起工作。再次强调,您需要问谷歌。 - CommonsWare
显示剩余4条评论

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