如果我正确理解您的问题,您希望创建多个彼此相似的 Android 应用(即,具有许多相同的源代码),但在特定(次要)方式上有所不同,并且您希望这些应用程序中的每一个都有一个不同的包,以便可以单独上传和分发到应用程序商店(如 Google Play)上。项目库是实现这些目标的绝佳工具。
我假设您的各个版本之间的差异很小,涉及资源、应用名称和软件包等内容,以及为付费版本打开某些功能而在免费版本中关闭这些功能的开关。
即使情况并非如此,通过以下述方式使用多态性,您的各种应用程序可能会有显着差异,但仍共享一个公共项目库。
可以像定义任何 Android 项目一样在 Eclipse 中定义项目库,但它被标记为项目库(通过选中库的 Android 页面底部附近的“Is Library”框)项目属性对话框)并且不能单独编译和运行。相反,它旨在通过引用包含在一个或多个实际应用程序的其他项目中(通过在每个此类应用程序的项目属性对话框的 Android 页面上添加对它的引用)。这些应用程序将使用项目库,因此将共享其代码和功能。
每个这样的引用应用程序都有自己的清单文件(可以在其中声明它们各自的不同包),并且它们还可以定义自己的类(包括从项目库的 Activity 和/或 Application 类派生的类) , 以便这些类可以为使用项目库的每个应用程序多态地专门化(例如,通过覆盖方法或通过为在项目库的 Activity 或应用程序派生类中定义为抽象的方法提供定义),尽管您可以也可以通过简单地在使用库的每个应用程序的清单文件(例如,在活动或应用程序标签中)引用它们来使用这些库类而无需修改(前提是它们不是抽象的),就像引用活动或应用程序一样 -应用程序本身中定义的派生类。
如果您决定使用这种方法,那么您可以将主要源文件放在项目库中,并为您要生成的每个应用程序创建一个单独的项目,每个应用程序都将引用项目库。项目库的清单文件将被使用该库创建的任何项目的清单覆盖(实际上,我认为项目库自己的清单被完全忽略,不仅被覆盖,但是创建清单很有用为图书馆,以便您可以手动模板 - 复制和编辑 - 每个项目的清单使用它从图书馆自己的清单)。
我已经使用这种方法创建了多个共享一些相同功能的 Android 应用程序,并且对我来说效果很好。
关于包命名,任何旧的包名都适用 用于库项目,但当然,为库项目的包使用与您用于各种个人相同的前缀是有意义的(例如,免费与付费)使用它的应用程序,名称的最后一部分是“.library”,而各种应用程序的结尾可能是“.myappfree”和“.myapppaid”。自然,您会希望对库的包前缀使用反向域名约定来防止冲突,就像您对已发布应用的包名称所做的那样。
在 Windows 中,用于比较代码库的一个不错的开源工具是 WinMerge:
http://winmerge.org/
但是,如果我处于您的位置,我只会使用此工具来手动识别差异,而不会尝试使用它来自动将您的代码重构为库项目。这最好由您自己(手动)控制。
最后,作为替代方案,您可以考虑使用一个免费的应用程序,该应用程序默认具有您的免费应用程序的功能,并可以通过一个选项升级到您的完整应用程序的功能(在同一 APK 中提供)应用程序支付,而不是拥有单独的免费和付费应用程序。在过去的几个月里(随着 IAB 第 3 版的发布),应用内支付有了很大的改进,尽管仍然存在一些小故障,但它们已成为比免费/完全二分法更实用的替代方案。首先。