设置应用程序如何启动一个未导出的应用程序活动?

16

Android N可以将你的activity关联到应用程序在设置中的页面。只需添加<intent-filter>并为android.intent.action.APPLICATION_PREFERENCES设置,Android N的设置应用程序将查找具有该<intent-filter>的应用程序中的活动。如果设置找到一个,它将在设置中添加一个齿轮图标,并且如果用户点击齿轮图标,则会进入您指定的活动。

我很担心安全问题,所以我提交了问题,寻找我们可以使用android:permission来允许设置启动我们的活动而不允许其他应用程序启动我们的活动(例如WRITE_SECURE_SETTINGS)的权限。

cketti随即指出,通过android:exported="false"将其标记为未导出的活动就可以了。出乎我的意料,这是有效的。

设置应用程序如何启动标记为未导出的活动?

我确实认为可能存在一种控制此类情况的权限。但是,对设置应用程序清单文件的简要阅读(主分支n-developer-preview-5分支)没有找到任何明显的内容。

  • 是否存在一种允许应用程序启动另一个应用程序中未导出组件的权限?如果有,是什么?

  • 如果没有,设置应用程序是如何做到这一点的?


你在这里回答了类似的问题:https://dev59.com/MmzXa4cB1Zd3GeqPQB_z - Shaishav
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - CommonsWare
2个回答

9
我猜测在清单中没有给应用程序授予调用导出活动的权限。我认为它实现这个功能的方式是在设置应用程序的Android.mk文件中设置LOCAL_PRIVILEGED_MODULE := true。此标志将授予应用系统级别权限,并在操作系统编译期间将其放置在system/priv-app/目录中。
如果您查看frameworks/base/core/java/android/app/ActivityManager.java方法checkComponentPermission,您可以看到如果UID是SYSTEM,则无论导出设置如何,都会授予组件权限。

我理解这个概念是基于设置应用程序的UID。但我并不完全相信checkComponentPermission()是做出决定的地方,因为我不认为SDK类应该决定您是否可以启动活动。 - CommonsWare
@CommonsWare 你是什么意思 - 我不会期望一个SDK类来决定你是否允许启动一个活动?你会期望什么呢? - Vikram
@Vikram:我本来以为这个是在系统服务(ActivityManagerService?)内部或类似的地方确定的。现在,他们有可能使用SDK中相同的checkComponentPermission()方法。 - CommonsWare
我确实同意这有点奇怪,可能可以在其他地方确定。我进行了一些调查,似乎AOSP的其他领域确实会调用ActivityManagercheckComponentPermission方法。例如ActivityManagerService,它具有完全相同的方法,但将逻辑委托给ActivityManager - Bobbake4
@CommonsWare 我明白你的意思。它被注释为 @hide,这告诉我它不是公共消费品,而且它应该是 ActivityManagerService 的一部分 - 而 ActivityManagerService 又依赖于 ActivityManager.checkComponentPermission(...)。虽然有点奇怪,但 Bobbake4 的答案看起来是正确的。 - Vikram

0

虽然@Bobbake4的答案是基于UID进行检查的,但是:

如果您查看frameworks/base/core/java/android/app/ActivityManager.java中的checkComponentPermission方法,您会发现如果UID是SYSTEM的,则无论导出设置如何,组件权限都将被授予。

我认为关于LOCAL_PRIVILEGED_MODULE的第一部分是不相关的。目录位置不控制UID设置,而是由清单中的sharedUserId设置。正如文档所述,只有使用与平台相同的证书签名的应用程序才能起作用。


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