5

我使用 Eclipse 在一个项目中开发了一个 Android 应用程序 - 它是结构化的(来自 iPhone),因此一个常量定义了它是演示版还是完整版。

现在我遇到的问题是,每次我想创建演示版本时,我都需要更改常量,但还需要使用不同的包名称制作项目的副本。

显然,原始完整版中的更改代码需要复制到演示中,否则每次提交应用程序时我都必须重新创建演示应用程序。

我看到了三种可能的方法:

1. 虽然我研究了图书馆项目,但我仍然不清楚这在这种情况下如何真正提供一个好的解决方案。

例如,如果我有带有活动结构的完整版本:

A1
A2
A3

使用实用程序类 U1、U2

当然 U1 和 U2 可以在一个库项目中并从两个项目中引用 - 但是需要复制活动、strings.xml、图形、布局(或者还有其他我看不到的方式?)这似乎没有是一个很好的前进方式,不幸的是,在提出这种方法时,在关于这个主题的类似问题中没有得到解释。

2. 另一种方法是根据不同的构建设置(类似于 iPhone)创建不同的包名称,但是,这在 Eclipse 中似乎是不可能的,而不是通过使用一些外部脚本(老实说,我宁愿避免,因为它似乎很容易出错)同时还必须在 Eclipse 之外调用编译

3. 可能最直接的方法(目前也是很少的努力)是手动复制项目,更改一个常量,重命名包并在每次提交时编译/导出。然而,这似乎相当“基本”,而且看起来并不专业(与 iPhone/xCode 构建设置/目标解决方案相比)

最好的方法是什么(需要最少的更改并且仍然稳定且易于使用)?

非常感谢!

编辑

对于尝试过 tim 解决方案的每个人 - 它工作正常,但是我遇到了自定义属性的问题。

检查这个:How to solve Android Libraries custom attributes and package name remapping during build? 它将解决图书馆的问题

4

3 回答 3

8

我目前正在eclipse中这样做,这并不难。

  1. 将现有源转换为库项目。

  2. 创建两个新项目,免费和付费。

  3. 将图书馆项目包括在免费和付费项目中。

免费/付费项目中不需要有单一的活动或资源。您所需要的只是一个清单,每个清单都引用了您图书馆中的活动。我的免费和完整项目目前没有任何类型的单一 java、资源或布局文件,它只是一个引用库中活动的清单。

我对两个项目使用完全相同的代码,并通过以下方式区分它们:

if(getApplicationContext().getPackageName().equals("full version package name")) {
    //do full stuff
} else {
    //do free stuff
}

我遇到了一些问题,特别是如果您已经在市场上发布了您的应用程序:

  • 如果您更改任何活动的全名/路径,它将从您的主屏幕上消失。因此,如果您的库具有与现有版本不同的包名称,您将丢失任何主屏幕图标。它们可以由用户替换,但这并不理想。
  • 类似的 appwidgets,如果你改变他们的接收者名字,他们会在升级时消失。
  • 在任何情况下,您都不得更改已发布应用程序的包名称。

如果您已经发布了免费版和专业版,那就有点遗憾了,因为活动路径需要更改为通用库路径,并且您无法重命名已发布的包以匹配库路径。所以有人将不得不失去他们现有的图标。

就我而言,我在拆分它们之前只发布了一个免费版本,并且我能够使用与免费版本相同的包名称来命名库。我怀疑你是否被允许包含一个与包装器包具有相同包名的库,但显然可以这样做(对我来说很好)。

所以就我而言,我有三个项目:

  • 核心库:包名:com.myname.myapp
  • 免费版:包名:com.myname.myapp
  • 专业版:包名:com.myname.myapp.Pro

免费和完整版清单添加了名为com.myname.myapp.ActivityAor的活动,这些活动com.myname.myapp.ActivityB仅存在于库项目中。

于 2012-10-18T20:58:47.627 回答
2

我认为最简单的方法是拥有三个项目:

  1. 演示
  2. 满的
  3. 图书馆

演示项目和完整项目都将具有其各自的清单文件中定义的唯一包名称。它们的活动只是将信息捆绑发送到库项目中的主要活动的端口。库项目中的 Activity 将读取传入的 Bundle 以获得必要的参数,以确定它是由演示 Activity 还是由完整 Activity 启动的。然后它将相应地进行。

所以逻辑是这样的:

用户启动演示活动->演示活动创建一个包,其中包含说明它是演示活动的信息->演示活动启动库活动,然后在演示模式下执行程序的其余部分。

或者

用户启动完整的 Activity -> 完整的 Activity 创建一个 Bundle,其中包含表明它是完整的 Activity 的信息 -> 完整的 Activity 启动库 Activity,然后以完整模式执行程序的其余部分。

于 2012-10-18T20:50:09.820 回答
1

在 Android Studio 中使用 build.gradle 非常简单。阅读productFlavors。这是一个非常有用的功能。只需在 build.gradle 中添加以下行:

productFlavors {
    lite {
        packageName = 'com.project.test.app'
        versionCode 1
        versionName '1.0.0'
    }
    pro {
        packageName = 'com.project.testpro.app'
        versionCode 1
        versionName '1.0.0'
    }
}

在这个例子中,我添加了两种产品风格:第一种是精简版,第二种是完整版。每个版本都有自己的 versionCode 和 versionName(用于 Google Play 发布)。

在代码中只需检查 BuildConfig.FLAVOR:

if (BuildConfig.FLAVOR == "lite") {
   // add some ads or restrict functionallity

}

要在设备上运行和测试,请使用 Android Studio 中的“构建变体”选项卡在版本之间切换: 在此处输入图像描述

于 2014-12-01T08:16:58.197 回答