如何在Android中创建一个共享库

12

我有一个名为LIB的库,为应用程序开发人员提供了许多API和类。

如果手机上有多个使用LIB的应用程序,我只希望创建和运行一个LIB实例。这与Android平台服务(如LocationManager、SensorManager、PackageManager等)非常相似。

具体来说,需要解决两个问题:

  1. 如何确保只有一个LIB实例?
  2. 如何部署LIB(单独的apk文件/与每个使用它的应用程序捆绑在一起,但只有一个应用程序随时创建库实例)等。
  3. 除了service/AIDL之外,是否还有其他方法可以确保无论使用它的应用程序数量如何,都只运行一个LIB实例。

4
你是在谈论共享库,还是更像一个共享服务?对于共享库,它必须包含在每个应用程序中。如果这是一个共享服务,并且已经安装为单独的应用程序,你可能可以做一些事情。你可以创建一个StartupIntent,如果该服务已经在运行,则会忽略它。否则,它将进行初始化。 - Austen Holmes
我肯定是在谈论共享库。我不想使用共享服务。在Android中有没有其他创建和使用共享库的方法? - Robin
在Android文档中,它说你可以创建一个共享库,但它并不是真正的共享(以SO或DLL的意义上来说)。每个需要它的应用程序都需要单独安装它,这样会导致存储空间浪费。我记得在某处看到他们可能会添加这个功能,但找不到链接了。请参考: http://developer.android.com/guide/developing/projects/index.html - Austen Holmes
是的,我也发现Android SDK中缺少这个东西。现有机制中的库项目会导致资源浪费 - 包括CPU和存储。无论如何,我可以选择将库封装在服务中,然后让应用程序绑定到我的服务。但是,在这种情况下,如果我的库项目向开发人员公开了n个类,那么通过Serivce接口/AIDL公开所有这些类将非常繁琐!是否有其他替代方案? - Robin
我不确定。对于可重用库,安卓开发还太新了,没有太多经验。我的应用程序都很小,大多数是自包含的。但是,随着我构建一些好的小部件/服务,我肯定需要找到一个好的解决方案来解决这个问题。 - Austen Holmes
2个回答

6

好的,在花费时间后,这是我问题的答案:

Q. 如何确保只有一个LIB实例? - 只能通过通过服务公开LIB功能来实现。

Q. 如何部署LIB(单独的apk / 与使用它的每个应用程序捆绑在一起,但只有其中一个在任何时刻创建库实例)等。 -

对于服务,将有一个单独的apk(或可能与其中一个服务客户端应用程序捆绑在一起)。

Q. 是否有其他方法(除了服务/AIDL)可以确保无论使用它的应用程序数量如何,都只运行一个LIB实例。

是的,那就像将LIB与每个应用程序捆绑在一起。 但这需要使用意图之间的强大通信协议,以便其中一个充当主控,并与其他库共享数据。有效地,打包在apk中的LIB仅在没有其他实例运行时启动其引擎。完成此操作的一种方法是使用广播,并为涉及的广播操作分配权限以维护安全性。


嗨,Robin,我在我的库中遇到了完全相同的问题。现在有更好的解决方法吗(因为现在已经过去5年了)?此外,当您说“通过服务”时,您指的是什么?Android服务?还是API端点? - Sid

0

使用库项目,您可以静态包含库项目中的类和资源。不需要运行任何不必要的内容。

这可能会增加应用程序的大小,但是像ProGuard这样的技术可以从最终的.apk文件中删除未使用的类。

如果您希望库独立于其他应用程序运行,则确实是一个服务,并且您应该考虑其生命周期(例如由应用程序启动,开机启动等)。

如果您的库包含要运行的活动,则Android操作系统已经处理了这一点 - 其他应用程序只需创建意图并调用您的活动即可。这就是Android的工作方式 - 应用程序可以使用意图无缝地在彼此之间共享数据和工作流程。

如果有服务,则情况相同 - 调用应用程序将与正在运行的服务交互或触发服务启动。

对于大多数开发人员来说,库项目处理了很多问题,但如果您有一个非常大的共享代码包,您将希望将其安装为单独的应用程序。

例如,Google地图是一个单独的应用程序,但其他应用程序可以触发意图以从该应用程序加载活动。短信和其他活动也可以由不同的应用程序处理。


我的库非常消耗CPU资源,我只想让所有应用程序运行单个实例。库中没有用户界面。它每秒生成输出,我不确定广播是否是理想的通道。如果我将库封装在服务中,则只能使用侦听器。但该库已经为应用程序公开了n个不同的类/接口。将其封装在服务中将意味着通过服务提供这么多接口! - Robin
也许你应该研究一下 NDK,以便进行更低级别的实现,这可能会拥有更多你所需要的功能(并减少 CPU 负载)。看起来你正在尝试做一些复杂的事情,在 Android 框架中没有干净的方法可以完成。顺便说一句,你可能不需要使用广播来共享实际数据 - 可以研究一下内容提供者。 - ProjectJourneyman

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