管理Androidapp store(Google / Amazon / etc)的代码/构建?

我有一个主要从Android Market(现在是Google Play)下载的Android应用。 我们对源进行了一些调整,并提交给亚马逊app store以了解它获得了什么样的牵引力。 我现在正在寻找一种可持续的方式来从一个共同的代码库开发,然后构建,以便我可以提交给两个/两个。

亚马逊的商店对可用的API有一些限制,因此我想有条件地删除/修改该版本的function。 由于Java不支持传统的条件编译,并且在Eclipse中有条件地包含文件似乎并不简单(甚至可能吗?),我想问其他人正在做些什么来解决这个问题。

不可否认,我不是Eclipse / Java专家,所以我可以随意上学。

我正在寻找解决方案:

  • 使用Eclipse构建/调试。
  • 静态代码文件,环境/设置切换以控制要构建的内容。
  • 代码中没有重复的代码或条件逻辑来在运行时选择代码流

这是您为Android应用专门解决的问题,还是其他基于Java / Eclipse的项目? 建议从哪里开始?

  • 用最新的android sdk使用“ant clean test”。 '$ {renderscript.opt.level}'不是com.android.ant.RenderScriptTask的允许值$ OptLevel
  • Phonegap / Cordova构建android node_modules / q / q.js throw e;
  • 使用Ant进行Android自定义生成
  • Android Studio和MonkeyTalk?
  • 如何配置android map sdk v2使用不同的密钥进行生产和开发?
  • 用ant运行Instrumentationtesting时出现NoClassDefFoundError
  • 如何使用ant在设备上运行android应用程序
  • 如何为Android项目创建build.xml?
  • 在最新版本的ADT(版本17)中很容易做到,虽然我发现它使编译时间更长:

    1. 创建一个新的Android项目( proj-A
    2. 转到Project-> Properties,选择Android,然后选中“Is Library”
    3. 将所有公共代码移动到proj-A ,导入所有必需的库
    4. 为Google Play创建一个新的Android项目( proj-B
    5. 转到项目 – >属性,选择Android,然后将Proj-A添加到库中
    6. 对Amazon版本重复#4和5

    如果你有一些variables应该为每个子项目设置不同(即布尔formsGOOGLE_PLAY_VERSION以启用Google Play特定function),你必须创建另一个项目来包含这些值,因为你不能有一个项目在一个项目中引用一个循环时尚。 您可以通过添加以下步骤来解决此问题:

    1. 将所有子项目特定variables拉入一个或多个类,这些类仅用作这些variables的容器
    2. 创建一个“虚拟”Java项目( 虚拟
    3. 配置proj-A以将新的Source链接添加到dummy的bin目录
    4. 使用特定于项目的更改在每个子项目中添加config Classes
    5. 利润!

    请注意, dummy中的variables不应设置为final,否则将覆盖子项目的设置。

    这可能看起来像是一些前期工作,但就版本控制而言,对我来说效果很好。

    编辑:现在,当Google迁移到Android Studio和Gradle时,如果你想要支持多个APK,如果你要开始一个新项目,可能会更好。请参阅Android开发者网站使用Gradle构建项目#使用构建变体 。 在决定之前评估该选项肯定没有坏处。

    不幸的是,Android中的一种惯例是根据C / C ++中的内容条件编译来改变运行时的流量。

    我们的应用程序必须为不同的API级别维护不同的行为,因此我们创建了一些应用程序级常量,这些常量根据我们可用的API级别信息进行静态初始化,并在整个代码中使用。 这是Google在其示例中执行操作的方式(例如,请参阅ActionBarCompat兼容性库,特别是此处使用的工厂方法)。

    您可以创建一个接口CustomBuild,并在AmazonBuild和GooglePlayBuild中实现它,然后使用静态getBuild()方法根据需要切换function:

     if(getBuild().shouldEnableFeatureX()){ doStuff(); } else { doDifferentStuff(); } 

    然后,您必须担心在构建之间切换是工厂中的一行或两行代码,同时在哪些版本中维护您想要启用的内容。 或者,您可以为每个构建包含不同版本的静态类CustomBuild。

    我将重新提出其他人的建议:转向像Maven这样的建筑; 一旦你完成它,它应该让你的生活更轻松。

    我还要说你应该按照上面的建议把应用程序的核心作为一个库,并且有两个不同的模块(一个用于亚马逊,一个用于游戏商店)依赖于库,但每个只包含一个自定义工厂文件(或者只是每种types的构建的静态类,包含相同的“我应该做这件事吗?”方法……一旦你拥有基础设施,这只是一个偏好的问题)。

    我还没有尝试过这个,但这是我想到的。

    如何使用Eclipse的function链接到工作区外的目录中的文件?

    从一个Eclipse项目开始:为了争论,请说它是Google Play版本。

    现在构建第二个项目,首先要求Eclipse链接(不复制)第一个项目中的源文件。

    要开发第二个项目,请添加从原始项目中inheritance子类的类以实现您的修改。 对于资源,您可以使用包含,属性覆盖和选择器的某种组合。

    如果不可能进行子类化或扩展,那么显然你只需要复制原始的源文件并进行破解即可。 如果你真的是OCD,你可能只是维护一个补丁集而不是整个冗余文件集。

    您怎么看?它会起作用吗?

    您可以在Eclipse中手动创建两个指向相同源文件夹但具有不同包含/排除filter和不同目标目录的项目。

    然后,使用属性从javac文件集切换排除文件的两个Ant目标足以生成相应的jar文件。

    目标是为每个目标获得一个干净的应用程序,而不需要来自另一个目标的任何代码。

    通过在属性文件或XML配置中列为可插入行为的function,您的运行时将通过添加菜单项来适应自身。