设置应用程序如何启动应用程序的非导出活动?
Android N允许您将您的活动链接到您的应用页面 设置。只需为android.intent.action.APPLICATION_PREFERENCES
添加<intent-filter>
即可。 Android N的“设置”应用将在您的应用中查找 拥有该<intent-filter>
的活动。如果设置找到一个,它会在设置中为您的应用的页面添加一个齿轮 图标,并且如果用户点击该齿轮,他们将会被带到您指定的活动。设置应用程序如何启动应用程序的非导出活动?
我很担心安全问题,所以我申请an issue,寻找我们可以用android:permission
使用,允许设置开始我们的活动权限,但不允许其他应用程序来启动我们的活动(例如,WRITE_SECURE_SETTINGS
)。
cketti然后指出you could just mark the activity as not exported, via android:exported="false"
。令我惊讶的是,这很有效。
设置应用程序如何启动标记为未导出的活动?
我当然可以看到有一个权限来控制这个。但是,快速阅读设置应用程序的清单(master branch,n-developer-preview-5分支)并没有明显的变化。
所以:
是否有允许应用程序启动另一个应用程序的非出口部件的许可?如果是这样,那是什么?
如果不是,Settings如何解决这个问题?
我猜想在清单中没有任何内容给予应用程序调用导出活动的权限。我相信它完成这个的方式是在设置应用程序的Android.mk文件中设置LOCAL_PRIVILEGED_MODULE := true
。此标志将给予应用程序系统级权限,并在操作系统编译期间将其放入system/priv-app/
目录。
如果你看frameworks/base/core/java/android/app/ActivityManager.java
的方法checkComponentPermission
你可以看到,如果UID是SYSTEM的,那么不管导出的设置如何,授予组件许可。
我购买了它基于设置应用程序的UID的概念。我不是100%确信'checkComponentPermission()'是决定的地方,因为我不希望SDK类决定是否允许你开始一个活动。 – CommonsWare
@CommonsWare你是什么意思 - “我不希望SDK类正在决定你是否被允许开始一个活动”?你会期望什么? – Vikram
@Vikram:我预料它会在系统服务('ActivityManagerService'?)内部确定,或者是这个效果。现在,他们可能会使用SDK中的相同'checkComponentPermission()'方法。 – CommonsWare
你在这里回答了类似的问题:http://*.com/questions/13892721/activity-exported-false-listed-in-activity-chooser – Shaishav
@Shaishav:虽然它是在一个相关的主题(保护与''),它没有解决我在这里提出的问题。 –
CommonsWare