多个Android应用程序可以共享一个进程和应用程序上下文吗?

11

我想知道是否可以在多个应用程序之间共享应用程序上下文中的单例?每个应用程序都将位于自己的APK中,但这可能听起来像是糟糕的架构,请先听我解释。

我想这样做的原因是,我有一个现有的库可以通过蓝牙控制外部设备。该库是Java编写的,但底层有很多本地(C / C ++)都包装在Java中。我考虑将所有内容放入服务中,但IPC(我使用的是aidl)很快变得非常麻烦。尝试将对象转换为基元几乎是不可能的(私有字段,JNI指针等),并且尝试使用AIDL包装所有内容非常混乱。

如果每个应用程序都可以在同一进程中运行,并且还具有相同的应用程序上下文,因此允许我在其中保留单例对象,那么事情将变得更加容易。我的Google搜索失败了。也许这是不可能的吗?

2个回答

12

这是可能的,但您会遇到一个问题,即您仍在运行两个不同的APK,每个都有自己的ClassLoader。由于不同的ClassLoader加载的相同类被视为彼此完全不同,因此您无法从APK A创建一个类并期望APK B能够访问该相同的类。然而,一个漏洞是Android 系统类在同一进程中始终由相同的ClassLoader加载,因此解决方案是通过Android 系统类(例如System.set/getProperty)存储数据。您可以在这里阅读关于这种技术的优秀文章。

由于您希望存储比Java原始类型更复杂的数据,并考虑到上述方法严重限制了您可以存储的数据结构,因此仍然可能最好使用AIDL。但是,如果将两个APK放置在同一进程中,则您的数据不需要跨进程边界,因此应该是相当高效的。


10

我该如何指定自定义应用程序上下文以允许单例?我假设android:name与此有关,但是什么保证它们实际上是相同的类? - startoftext
你解决了这个问题吗?我也想做同样的事情。 - Alan
设置共享用户ID并使用相同的证书为两个应用程序签名应该是足够的。android:process属性用于更多额外的内容,如命名或指向正确的进程。 - stdout
@Alan 我最终没有选择这条路。 - startoftext
1
这种方式可以确保多进程运行在同一个进程中。但是下一步如何使它们共享应用程序中的单例对象呢?这个问题还没有得到解答。 - passerbywhu

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