如果多个应用程序包含相同的服务 class 作为外部依赖项,将使用 AIDL 返回哪个服务
Which service will be returned using AIDL, if multiple apps contain the same Service class as an external dependency
我正在为 Android 创建一个 .aar 依赖项,它包含一个 class MyService (packageName: "com.example.MyService"),它将 运行 在它自己的进程中。我已经使用 AIDL (IMyService) 到 return 使用 AIDL 接口存根的活页夹对象,因此具有 AIDL 接口的其他应用程序只能访问该服务。 MyService 还有一个带有 action="com.example.myservice.action".
的 intent-filter
假设在同一台设备上安装了具有相同依赖项 class (com.example.MyService) 和 IMyService.aidl 的两个应用程序 App1 和 App2。
(1) 根据文档,如果多个服务具有相同的 intent-filter 操作,则使用该操作的应用程序绑定将随机绑定到任何一项服务。在我的例子中,com.example.MyService 在 App1 和 App2 中都可用(在它们各自的包中)。那么假设 App1 已经启动了服务,App2 会绑定到同一个已经创建的 MyService 还是创建自己的 MyService 并绑定到它?请注意,App1 和 App2 将使用相同的意图(操作:"com.example.myservice.action")和相同的 AIDL。
(2) 我想确保设备上只有一个 MyService 服务实例 运行ning。因此,如果首先安装 App1,它将使用上述指定的操作意图绑定到服务(如果不是 运行ning,则创建它)。现在,当 App2 使用相同的意图操作调用 bindservice() 时,它应该绑定到 App1 创建的同一个 MyService。这可能吗?
will App2 bind to the same already created MyService or create its own MyService and bind to it?
它将绑定到您明确 Intent
指定的任何服务。在 Android 5.0+ 上,您必须使用显式 Intent
来绑定到服务。 "explicit" 我的意思是你在 Intent
上使用 setComponent()
或 setClass()
之类的东西,或者 Intent
构造函数将 Class
作为范围。这将表明您是绑定到 App1 还是 App2。
Is this possible?
不容易。在 PackageManager
(找出哪些应用在服务 <intent-filter>
中有您想要的操作字符串)和 ActivityManager
(尝试确定哪些服务是 运行)之间,您可能能够确定是否有 运行 服务满足您的需求。我从来没有尝试过这个,所以我不知道它有多简单以及可能需要什么权限。
但是,您的计划存在问题,例如:
竞争条件。如果两个应用几乎同时尝试与该服务通信,并且都确定没有服务实例 运行,因此它们都启动了自己的实例,会发生什么情况?
入站安全。由于您的服务必须接受来自任意其他应用程序的请求,您将如何防止恶意软件利用您的服务,例如通过发送欺骗请求?
出站安全。由于您的客户必须盲目地接受任何可能的应用程序作为服务的主机,您将如何防止恶意软件使用您的操作字符串创建自己的服务来拦截您的通信?
我正在为 Android 创建一个 .aar 依赖项,它包含一个 class MyService (packageName: "com.example.MyService"),它将 运行 在它自己的进程中。我已经使用 AIDL (IMyService) 到 return 使用 AIDL 接口存根的活页夹对象,因此具有 AIDL 接口的其他应用程序只能访问该服务。 MyService 还有一个带有 action="com.example.myservice.action".
的 intent-filter假设在同一台设备上安装了具有相同依赖项 class (com.example.MyService) 和 IMyService.aidl 的两个应用程序 App1 和 App2。
(1) 根据文档,如果多个服务具有相同的 intent-filter 操作,则使用该操作的应用程序绑定将随机绑定到任何一项服务。在我的例子中,com.example.MyService 在 App1 和 App2 中都可用(在它们各自的包中)。那么假设 App1 已经启动了服务,App2 会绑定到同一个已经创建的 MyService 还是创建自己的 MyService 并绑定到它?请注意,App1 和 App2 将使用相同的意图(操作:"com.example.myservice.action")和相同的 AIDL。
(2) 我想确保设备上只有一个 MyService 服务实例 运行ning。因此,如果首先安装 App1,它将使用上述指定的操作意图绑定到服务(如果不是 运行ning,则创建它)。现在,当 App2 使用相同的意图操作调用 bindservice() 时,它应该绑定到 App1 创建的同一个 MyService。这可能吗?
will App2 bind to the same already created MyService or create its own MyService and bind to it?
它将绑定到您明确 Intent
指定的任何服务。在 Android 5.0+ 上,您必须使用显式 Intent
来绑定到服务。 "explicit" 我的意思是你在 Intent
上使用 setComponent()
或 setClass()
之类的东西,或者 Intent
构造函数将 Class
作为范围。这将表明您是绑定到 App1 还是 App2。
Is this possible?
不容易。在 PackageManager
(找出哪些应用在服务 <intent-filter>
中有您想要的操作字符串)和 ActivityManager
(尝试确定哪些服务是 运行)之间,您可能能够确定是否有 运行 服务满足您的需求。我从来没有尝试过这个,所以我不知道它有多简单以及可能需要什么权限。
但是,您的计划存在问题,例如:
竞争条件。如果两个应用几乎同时尝试与该服务通信,并且都确定没有服务实例 运行,因此它们都启动了自己的实例,会发生什么情况?
入站安全。由于您的服务必须接受来自任意其他应用程序的请求,您将如何防止恶意软件利用您的服务,例如通过发送欺骗请求?
出站安全。由于您的客户必须盲目地接受任何可能的应用程序作为服务的主机,您将如何防止恶意软件使用您的操作字符串创建自己的服务来拦截您的通信?