多个应用程序之间的Android签名级别权​​限

Posted

技术标签:

【中文标题】多个应用程序之间的Android签名级别权​​限【英文标题】:Android signature level permission among multiple apps 【发布时间】:2018-01-02 17:03:16 【问题描述】:

我的主应用程序 A 使用其他应用程序作为插件,比如说 BCD .我无法控制首先安装哪个应用程序。

如何定义签名级别权​​限,以便只有主应用 A 可以启动插件应用 BCD强>?

插件没有用户界面,因此用户无法手动启动它们,但我需要确保只有我的主应用程序可以启动它们。我尝试在插件中定义权限,如下所示:

<permission
    android:name="my.custom.permission.START_PLUGIN"
    android:protectionLevel="signature"/>

然后在我的主应用程序中:

<uses-permission android:name="my.custom.permission.START_PLUGIN" />

这似乎不是正确的方法。谁能告诉我实现上述目标的正确方法?谢谢。

编辑:我的插件被实现为具有 AIDL 接口的绑定服务。

【问题讨论】:

您的插件是如何实现的?作为绑定服务、内容提供者,还是其他? 绑定服务。更新问题。 所以在您的自定义Binder#onTransact 方法或存根方法实现中使用Binder#getCallingUid() 我想使用权限来解决这个问题。我会看看你的建议,但我更愿意通过签名级别的权限来解决它。 好吧,Android系统应该自己处理这个......但是我似乎找不到正确的方法。 【参考方案1】:

要回答我最初的问题,使我的示例正常工作,您所要做的就是为您想要保护的应用程序组件添加权限属性。这是在 Manifest.xml 文件中完成的。

假设您有一个名为 MyActivity 的活动,您希望只有具有 START_PLUGIN 权限的应用才能启动。所以在你的插件中,你这样做:

<permission
    android:name="my.custom.permission.START_PLUGIN"
    android:protectionLevel="signature"/>

和:

<activity
    android:name=".MyActivity"
    android:permission="my.custom.permission.START_PLUGIN"/>

最后一个将确保只有具有 START_PLUGIN 权限的应用才能访问该活动。所以你需要做的就是在应该启动这个插件的应用程序中使用这样的权限:

<uses-permission android:name="my.custom.permission.START_PLUGIN" />

要决定您是要使用具有签名级别保护的权限,还是要使用 cmets 中 @pskink 建议的 sharedUserId,请考虑以下事项:

sharedUserId 将两个(或更多)应用紧密结合,使它们不仅可以访问特定活动,还可以访问它们的文件(甚至 SharedPreferences)和视图,并且基本上消除了任何级别的分离 自定义权限可以指定要保护应用程序的哪些部分,让您拥有更多控制权,但也需要像 AIDL 这样的 IPC

链接:

sharedUserId Android Reference

How to access data of app with sharedUserId

AIDL Reference

Android permission protection levels

【讨论】:

以上是关于多个应用程序之间的Android签名级别权​​限的主要内容,如果未能解决你的问题,请参考以下文章

具有权限级别签名的Android广播接收器不接收广播

安卓开发之限权管理

Android - 自动系统签名

检测 Android 设备上缺少听筒(仅限扬声器)

如何对Android的APP进行签名

Logcat:日志级别之间的区别? [复制]