据我所知,每个android进程都在" sandbox"环境,如果Android应用程序是一个多进程应用程序会发生什么?所有进程都使用单个沙箱,因为所有进程都使用相同的用户ID吗?
答案 0 :(得分:4)
由于Android使用Linux内核进行sanboxing,真正的沙箱是per(unix)用户ID,而不是每个进程。而Dalvik VM本身并没有尝试沙盒。
当然,由相同用户id拥有的进程在某种程度上是相互隔离的,但是诸如kill(),ptrace()和/ proc文件系统之类的工具可以用来刺穿进程隔离 - 并且主要由用户id隔离来管理。 / p>
关于代码映射到进程的方式有几个奇怪之处:</ p>
可以在清单中指定活动或服务以在不同的流程中运行,但这仍然是包用户ID所拥有的流程
具有相同签名证书的不同应用程序包可以使用共享用户ID功能来共享沙箱;在某些情况下,这可能导致他们的代码在同一个进程中运行。
<activity>
标记的multiprocess属性表示该活动可以在任何启动过程中运行 - 如果这可能意味着它将结束,则不完全清楚在外部用户ID下运行(对于调用者来说,这个想法似乎比被调用者更危险)。
<service>
的{{3}}属性表示它在一个独立的进程中运行服务,其中没有自己的权限&#34; - 虽然它没有明确地说出来,但我怀疑这可能意味着这将是一个独特的,具有最低权限的用户ID所拥有的进程。
对这最后两点的更明确的解释是好的。或许,当我有更多时间时,我会查看实施代码。
答案 1 :(得分:0)
每个进程都与Android中的单独运行时(JVM)和沙箱相关联。
例如,如果您将一些活动调整为在单独的进程上运行(以利用具有不同的内存空间),那么在启动应用程序时最终会有2个沙箱,并且必须在需要时管理IPC
另一个例子是 - 如果你设置两个不同的应用程序来共享相同的用户ID,那么你不会需要IPC,因为他们可以看到彼此的数据,但这并不意味着他们运行在相同的进程或沙箱上。您需要在清单中设置application元素的process属性。
在上下文中,您还可以将多个组件属于单独的应用程序,以便轻松共享和节省内存。