具有共享代码库的多个应用程序

时间:2012-03-01 11:19:54

标签: android

由于在同一个应用程序的Android市场上同时拥有免费和付费版本很受欢迎,我决定也这样做。最初我只是复制了完整的代码库,并在这里和那里调整了一些代码(添加了广告,内置了一些限制等),因为当时没有选项来进行库项目,但这给我留下了两个很难管理修复的项目因为我需要做两次这样的bug。

从r14开始,我们可以使用带有资源的库项目,因此,就我所知,这对于这个特定问题是一个很好的解决方案。因此,我已经阅读了library projects和结论,我很想知道不同版本的项目所需的最小文件数是多少。因此,我的问题是;

  • 我可以拥有共享项目中的所有代码,并且基本上只有一个清单的裸骨项目吗?
    • 如果是的话,我应该吗?这是概念上的最佳方式吗? (除了它取决于我的代码库这一事实外)
  • 我应该如何处理库包命名,是否有特定的规则?
  • 是否有相关的工具可以比较来自两个不同项目的代码,也许可以自动魔法或自动手动合并它们,哪一个更受欢迎?

2 个答案:

答案 0 :(得分:9)

如果我正确理解你的问题,你想要创建多个彼此相似的Android应用程序(即,有很多相同的源代码),但是在特定(次要)方式上有所不同,并且你想要这些应用中的每一个都有一个独特的包,因此可以单独上传并分发到Google Play等应用商店。项目图书馆是实现这些目标的绝佳工具。

我假设您的各种版本之间的差异很小,包括资源,应用程序名称和包等内容,以及为付费版本打开某些功能而将其留给免费版本的开关。

即使不是这种情况,通过以下述方式使用多态,您的各种应用程序可能会有很大不同,并且仍然共享一个共同的项目库。

可以在Eclipse中定义项目库,就像定义任何Android项目一样,但它被标记为项目库(通过选中库的Android页面底部附近的“Is Library”框) “项目属性”对话框)并且无法自行编译和运行。相反,它旨在通过引用包含在一个或多个其他项目中,这些项目是实际应用程序(通过在每个此类应用程序的“项目属性”对话框的Android页面上添加对它的引用)。这些应用程序将使用项目库,因此将共享其代码和功能。

每个这样的引用应用程序都有自己的清单文件(可以声明它们各自的不同包),并且它们还可以定义自己的类(包括从项目库的Activity和/或Application类派生的类) ,以便这些类可以为使用项目库的每个应用程序进行多态化(例如,通过重写方法或为项目库的活动或应用程序派生类中定义为抽象的方法提供定义),尽管你可以通过简单地在使用库的每个应用程序的清单文件(例如,活动或应用程序标签)中引用它们,也可以不经修改地使用这些库类(前提是它们不是抽象的),就像引用活动或应用程序一样 - 在应用程序本身中定义的派生类。

如果您决定使用此方法,那么您可以将主要源文件放在项目库中,并为要生成的每个应用程序创建一个单独的项目,每个应用程序都将引用项目库。项目库的清单文件将被使用该库创建的任何项目的清单覆盖(实际上,我认为项目库自己的清单完全被忽略,而不仅仅是被覆盖,但是创建清单是有用的对于库,您可以手动模板 - 复制和编辑 - 从库自己的清单中使用它的每个项目的清单。)

我已经使用这种方法创建了多个具有相同功能的Android应用程序,并且它对我来说非常有效。

关于软件包命名,任何旧的软件包名称都将工作用于库项目,但当然,对于各个人使用的库项目软件包使用相同的前缀是有意义的(例如使用它的免费与付费应用程序,使用“.library”作为名称的最后一部分,而各种应用程序可能有“.myappfree”和“.myapppaid”等结尾。当然,您可能希望对库的包前缀使用反向域名约定来防止冲突,就像发布应用程序的包名一样。

在Windows中,用于比较代码库的一个不错的开源工具是WinMerge:

http://winmerge.org/

但是,如果我在你的位置,我只会使用此工具手动识别差异,并且不会尝试使用它来自动将代码重构为库项目。这最好在你自己的(手动)控制下完成。

最后,作为替代方案,您可以考虑使用一个免费的应用程序,并且默认情况下具有免费应用程序的功能,并且可以通过以下选项升级到您的完整应用程序的功能(在同一个APK中提供)应用付款,而不是单独的免费和付费应用程序。在过去的几个月里,应用内付款有了很大的改进(IAB第3版的发布),虽然仍然有一些小问题,但它们已经成为一种更实用的替代免费/完全二分法的方法,而不是它们在第一

答案 1 :(得分:8)

  1. 是的,您可以拥有一个项目,它基本上只是一个清单,指定应用程序名称,名称空间,图标等,包含所有实际代码和库项目中99%的资源。

    < / LI>
  2. 是的,我认为你应该使用这种方法。使用库项目来处理免费/付费应用程序问题非常普遍。

  3. 我在命名方面没有任何问题,但您应该注意单独项目中的任何资源,以避免使用相同的名称。

  4. 我不知道有任何工具,如果是我,我想手动完成,以确保我合并需要合并的东西,并将需要分开的东西分开。你有一个重要的重构要做,但一旦删除所有重复,我相信它会更容易。