如何在Android中创建共享库

如何在Android中创建共享库,android,deployment,shared,Android,Deployment,Shared,我有一个库,比如LIB,它公开了相当多的api和类供应用程序开发人员使用 如果手机上有多个使用LIB的应用程序,我只希望创建并运行一个LIB实例。它有点类似于Android平台服务,如LocationManager、SensorManager、PackageManager等 具体而言,有两个问题需要解决:- 如何确保只有一个LIB实例 如何部署LIB(单独的apk/与使用它的每个应用程序捆绑在一起,但在任何时候都只有一个应用程序创建库实例)等等 是否有其他方法(service/AIDL除外)确保

我有一个库,比如LIB,它公开了相当多的api和类供应用程序开发人员使用

如果手机上有多个使用LIB的应用程序,我只希望创建并运行一个LIB实例。它有点类似于Android平台服务,如LocationManager、SensorManager、PackageManager等

具体而言,有两个问题需要解决:-

  • 如何确保只有一个LIB实例
  • 如何部署LIB(单独的apk/与使用它的每个应用程序捆绑在一起,但在任何时候都只有一个应用程序创建库实例)等等
  • 是否有其他方法(service/AIDL除外)确保只运行一个LIB实例,而不考虑使用它的应用程序的数量

  • 对于库项目,您可以静态地包含库项目中的类和资源。没有不需要的东西会运行

    这可以增加应用程序的大小,但ProGuard等技术可以从final.apk中删除未使用的类

    如果你想让你的库独立于其他应用程序运行,那么它确实是一个服务,你应该考虑生命周期应该是什么(例如,由应用程序启动,在启动时启动,等等)。p> 如果你的lib包含要运行的活动,Android操作系统已经处理了——另一个应用程序只是创建一个意图并调用你的活动。这就是安卓系统的工作原理——应用程序可以使用intents在彼此之间无缝地共享数据和工作流

    如果有服务,这是一样的-调用应用程序要么与正在运行的服务交互,要么触发服务启动

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


    例如,谷歌地图是一个独立的应用程序,但其他应用程序可以触发从该应用程序加载活动的意图。消息和其他可以由不同应用程序处理的活动也是如此。

    好的,在花了时间之后,这里是我问题的答案:-

    如何确保只有一个LIB实例 仅通过服务公开LIB功能

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

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

    问:是否有其他方法(service/AIDL除外)确保只有一个LIB实例运行,而与使用它的应用程序的数量无关

    是的,这就像LIB与每个应用程序捆绑在一起一样。
    但这需要使用意图的库之间有一个强大的通信协议,以便其中一个充当主库,并与其他库共享数据。实际上,只有在没有其他实例运行的情况下,apk中打包的LIB才会启动其引擎。实现这一点的一种方法是使用广播,为了维护安全性,权限可以与所涉及的广播操作相关联。

    您是说共享库,还是更像是共享服务?对于共享库,它必须包含在每个应用程序中。但是,如果将共享服务作为一个单独的应用程序安装,则您可能可以使用该服务执行某些操作。您可以创建一个StartupIntent,如果服务已经在运行,它将忽略它。否则它将初始化。我肯定谈论的是共享库。我不想使用共享服务。有没有其他方法可以在Android中创建和使用共享库?在Android文档中,它说你可以创建一个共享库,但它不是共享的(在SO或DLL的意义上)。每个需要它的应用程序都会单独安装,所以你最终会用副本浪费存储空间。我相信我在某个地方读到他们可能会添加它,但找不到链接。请看:是的,我也发现Android SDK中缺少这个东西。现有机制中的图书馆项目将导致CPU和存储资源的浪费。无论如何,我可以选择在服务中包装库,然后让应用程序绑定到我的服务。但是在这种情况下,如果我的库项目向开发人员公开n个类,那么通过Serivce接口/AIDL公开所有类将是乏味的!有别的选择吗?我不确定。对于android开发来说太新了,没有太多可重用库的经验。我的应用程序很小,而且大部分都是独立的。当我建立一些好的小部件/服务时,尽管我肯定要找到一个解决这个问题的好方法。我的库非常CPU密集,我只希望它的一个实例能为所有应用程序运行。库中没有UI。它以每秒的速度生成输出,我不确定广播是否是理想的使用频道。仅当我将库封装在服务中时,才可以使用侦听器。但该库为这些应用程序公开了n个不同的类/接口。将其封装在服务中意味着通过服务提供那个么多接口!也许您应该在NDK中寻找较低级别的实现,它可能具有更多您想要的功能(并减少CPU负载)。看起来你正在尝试做一些复杂的事情,在Android框架中没有一个干净的方法来完成。顺便说一句,您可能不需要使用广播来共享实际数据-查看内容提供商。嗨,Robin,我的库也有同样的问题。现在有没有更好的解决方法(已经5年了)?另外,当你说“通过服务”时,你的确切意思是什么?安卓服务?还是API端点?