【问题标题】:Creating demo and full version app based on one code base/project基于一个代码库/项目创建演示版和完整版应用程序
【发布时间】:2012-10-18 20:41:17
【问题描述】:

我在一个项目中使用 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? 它将解决图书馆的问题

【问题讨论】:

    标签: android build android-library conditional-compilation


    【解决方案1】:

    我目前在eclipse中做这个,不难。

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

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

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

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

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 非常感谢您的额外澄清-我将在接下来的几天内尝试此操作(到目前为止,我还没有在 GooglePlay 上发布这两种方法中的任何一种-幸运的是,我从您的评论中了解到:- )
    • 我喜欢这个。下次一定要注意。
    • 我试过这种方法。这里的主要问题是您必须复制代码并且最终拥有三个项目!更好的方法实际上是使用口味。这是一个很好的教程,对我有帮助:youtube.com/watch?v=7JDEK4wkN5I
    【解决方案2】:

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

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

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

    所以逻辑是这样的:

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

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

    【讨论】:

    • 虽然可以这样做,但无需将包装器活动传递给库。您可以将库活动直接实例化到发布包清单中。请参阅我的答案以了解更多详细信息。
    【解决方案3】:

    在 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 中的“构建变体”选项卡在版本之间切换:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      相关资源
      最近更新 更多