管理 Android 应用商店(谷歌/亚马逊/等)的代码/构建?

Posted

技术标签:

【中文标题】管理 Android 应用商店(谷歌/亚马逊/等)的代码/构建?【英文标题】:Manage code/build for Android app stores (Google/Amazon/etc)? 【发布时间】:2012-04-06 14:05:02 【问题描述】:

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

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

诚然,我不是 Eclipse/Java 专家,所以请随意指导我。

我在解决方案中寻找什么:

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

这是您专门针对 Android 应用程序或其他基于 Java/Eclipse 的项目解决的问题吗?建议从哪里开始?

【问题讨论】:

Eclipse ADT 插件有一个相当不灵活的构建生命周期 IMO,它没有提供太多配置选项。考虑采用一些命令行构建工具,例如 Ant 和 Maven,您可以在构建过程中的每个步骤(编译、dexing、打包等)中获得更多的微控制 【参考方案1】:

在最新版本的 ADT(版本 17)中很容易做到这一点,尽管我确实发现它会使编译时间更长:

    创建一个新的 Android 项目 (proj-A) 进入Project->Properties,选择Android,勾选“Is Library” 将所有常用代码移至proj-A,导入所有必要的库 为 Google Play 创建一个新的 Android 项目 (proj-B) 进入 Project->Properties,选择 Android,然后将 Proj-A 添加到库中 Amazon 版本重复 #4&5

如果您有一些变量应该为每个子项目设置不同(即布尔 GOOGLE_PLAY_VERSION 以启用 Google Play 特定功能),您必须创建另一个项目来包含这些值,因为您不能拥有引用一个的项目-另一个以循环方式。您可以通过添加以下步骤来解决此问题:

    将所有子项目特定变量放入一个或多个类中,这些类仅用作这些变量的容器 创建一个“虚拟”Java 项目(dummy) 配置 proj-A 以将新的 Source 链接添加到 dummy 的 bin 目录 在每个子项目中添加配置类,并进行项目特定的更改 利润!

注意dummy中的变量不能设置为final,否则会覆盖子项目的设置。

这似乎是一项相当多的前期工作,但就版本控制而言,这对我来说效果很好。

编辑: 现在随着 Google 迁移到 Android Studio 和 Gradle,如果您要开始一个新项目,如果您想支持多个 APK,那么迁移到它可能会更好,请参阅 Android 开发网站的 Building Your Project with Gradle#Work with build variants。在决定之前评估该选项绝对没有什么坏处。

【讨论】:

这很好用,但您必须维护清单和嵌入式资产的单独副本,并为每个应用使用不同的包名称。 对于清单来说,它并没有那么糟糕,因为一旦你的应用稳定下来,它就不应该经常改变。对于不同的包名称,我所做的是:1. 通过简单地扩展原始 Activity 类,为清单中存在的每个 Activity/Service 创建一个包装类,2. 创建一个 ClassProvider 类,它只提供正确的 Class 实例。 例如,如果我的“基础”包名称是 com.test,带有一个名为 com.test.MainActivity 的 Activity,并且我有一个包名称为 com.test.version_one 的版本,那么我将创建 @987654324 @ 只是扩展了com.test.MainActivity。我将创建一个名为com.test.version_one.ClassProvider 的类,并使用public Class getMainActivity() 方法和代码return com.test.version_one.MainActivity.class。最后,对于我需要 MainActivity.class 的所有实例,我调用 com.test.version_one.ClassProvider.getMainActivity() 这听起来可能有点复杂,但它都是简单的样板代码,它允许我将所有与版本无关的代码保存在一个地方。一旦为第一个项目设置了它,它只需复制粘贴项目并让 Eclipse 自动修复任何错误(由为新项目使用不同的包名称引起)。对于资产,我什么都没有,最好的建议是在您的第一个项目中放置一个副本,以便将其复制到新项目上,并且可能编写一个简单的脚本以在将来根据命令自动更新它们。 .. 如果有帮助,我可以提供我的项目设置的示例屏幕截图。【参考方案2】:

不幸的是,在运行时根据 C/C++ 条件编译中的内容更改流程是 Android 中的一种约定。

我们的应用必须针对不同的 API 级别维护不同的行为,因此我们创建了一些应用级别的常量,这些常量根据我们可用的 API 级别信息进行静态初始化,并在整个代码中使用。这就是 Google 在他们的示例中做事的方式(例如,参见 ActionBarCompat 兼容性库,尤其是使用的工厂方法 here)。

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

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

那么,在构建之间切换时,您只需担心工厂中的一两行代码,以及维护您希望在哪些版本中启用哪些功能。或者,您可以为每个构建包含不同版本的静态类 CustomBuild。

我将支持上述其他人的建议:切换到 Maven 之类的东西进行构建;设置好后,它应该会让您的生活更轻松。

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

【讨论】:

【参考方案3】:

我还没有真正尝试过,但这是我考虑过的。

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

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

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

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

如果无法进行子类化或扩展,那么显然您必须复制原始源文件并对其进行修改。如果您真的对此有强迫症,您可能只需要维护一个补丁集,而不是一整套冗余的文件。

你怎么看,它会起作用吗?

【讨论】:

维护重复文件很糟糕,但即使克服了这个问题,这里也没有任何东西可以帮助有条件地启用/禁用项目的任何一种风格的功能(运行时除外,这不是一个好的解决方案)。这是我希望解决的三个主要场景之一,我认为这个解决方案没有帮助。【参考方案4】:

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

那么两个Ant目标使用属性从javac文件集中切换排除文件就足够生成对应的jar文件了。

目的是为每个目标获得一个干净的应用程序,而无需其他目标的任何代码。

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

【讨论】:

是否有可能知道投反对票的原因以便我改进我的答案? 我没有投反对票,所以我只能推测。我不知道“在属性文件或 XML 配置中列为可插入行为的功能”是什么意思,而且我也不知道 jar 与 apk 是否重要(Android 应用程序是 APK 而不是 JAR,但我猜这无关紧要)。不过,作为 OP,我不知道如何实际执行您的建议(此处为 Eclipse 新手),因此我也无法将其标记为答案。

以上是关于管理 Android 应用商店(谷歌/亚马逊/等)的代码/构建?的主要内容,如果未能解决你的问题,请参考以下文章

要提交多少个 Android 应用商店...?

如果我在亚马逊,9apps和Getjar等其他商店上传应用程序而不是谷歌游戏商店,Admob会工作吗?

Windows 11运行Android应用得到保障,亚马逊应用商店将支持AAB

海外都有哪些著名的第三方 Android 应用市场

发布到谷歌和亚马逊

是否可以在运行时可靠地检测到哪个商店安装了 Android 应用程序(Google Play 或亚马逊市场)?