【问题标题】:Multiple Apps with a shared code base具有共享代码库的多个应用程序
【发布时间】:2012-03-01 11:19:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

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

    我假设您的各个版本之间的差异很小,涉及资源、应用名称和软件包等内容,以及为付费版本打开某些功能而在免费版本中关闭这些功能的开关。

    即使情况并非如此,通过以下述方式使用多态性,您的各种应用程序可能会有显着差异,但仍共享一个公共项目库。

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

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

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

    我已经使用这种方法创建了多个共享一些相同功能的 Android 应用程序,并且对我来说效果很好。

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

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

    http://winmerge.org/

    但是,如果我处于您的位置,我只会使用此工具来手动识别差异,而不会尝试使用它来自动将您的代码重构为库项目。这最好由您自己(手动)控制。

    最后,作为替代方案,您可以考虑使用一个免费的应用程序,该应用程序默认具有您的免费应用程序的功能,并可以通过一个选项升级到您的完整应用程序的功能(在同一 APK 中提供)应用程序支付,而不是拥有单独的免费和付费应用程序。在过去的几个月里(随着 IAB 第 3 版的发布),应用内支付有了很大的改进,尽管仍然存在一些小故障,但它们已成为比免费/完全二分法更实用的替代方案。首先。

    【讨论】:

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

      2. 是的,我认为您应该使用这种方法。使用库项目来处理免费/付费应用问题是很常见的。

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

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

      【讨论】:

      • 酷!使用常规的差异工具进行合并实际上非常轻松。我真正遇到的唯一事情是我对包名称进行了硬编码,以及 在库项目中不起作用的一个已知问题;两者都很容易解决。
      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 2012-01-03
      • 2012-07-07
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多