从相同的代码生成略有不同的 APK

Posted

技术标签:

【中文标题】从相同的代码生成略有不同的 APK【英文标题】:Generate slightly different APKs from the same code 【发布时间】:2015-07-06 00:49:09 【问题描述】:

我开发了一个使用Parsepush notifications(GCM,Google Cloud Messaging)的小游戏。但是,当我尝试将我的应用上传到亚马逊商店时,他们说它不会在某些设备上发布,因为它使用 GCM。

所以,解决方法很简单,只需删除 notifications。 我遇到的问题是我想尽可能多地自动化 apk 生成。 在 ios 下(我是 iOS 开发人员,android 新手),我只创建 2 个目标并使用 DEFINE 我可以根据目标修改代码。 我想要类似的东西,所以我在亚马逊版本中使用了另一个manifest,当然我删除了推送代码。

使用Android Studio 时,我该怎么做? 我怀疑我必须使用gradle或者模块的概念,因为在Android Studio中创建signed apk时我必须选择“app” module

您有什么想法、建议或链接吗?谢谢。

【问题讨论】:

单个应用程序应包含单个 Manifest。 你不能肯定有两个清单。我猜你可以有两个应用程序模块,但我建议有两个单独的 VCS 分支,而不是复制整个代码。 【参考方案1】:

您可以使用产品风味来完成此操作。每个产品风格都可以有自己的 AndroidManifest,每个风格的清单将在编译时与主应用程序清单合并。请参阅文档的 build variants 部分。

例如,您可以定义以下产品风味

productFlavors 
    amazon
    googleplay

然后你可以设置以下清单文件

src/main/AndroidManifest.xml
src/amazon/AndroidManifest.xml
src/googleplay/AndroidManifest.xml <-- put GCM permissions here

您还可以将所有 Google Play 服务代码和依赖项放入您的 googleplay 风格中,例如:

dependencies 
    googleplayCompile 'com.google.android.gms:play-services-location:7.0.0'

【讨论】:

谢谢!我不知道构建变体。这正是我想要的。【参考方案2】:

在使用 Android Studio 时如何做到这一点?

这是product flavors 的工作。创建 google 风味和 amazon 风味。那么:

使用 googleCompile,而不是 compile,作为您的 Play Services SDK 依赖项。

仅在您的 google 风格的清单版本中包含播放服务元数据。

将依赖于 Play 服务 SDK 的代码放在 google 风格的源集中。请注意,您可能需要将该代码的一些挂钩抽象到您在每种风格中实现的 NotificationStrategy 类中,其中 google 用于播放服务工作,amazon 风格用于其他(或什么都不做) .然后,您在 main 中的代码可以引用 NotificationStrategy 并为每种风格获得正确的实现。

【讨论】:

以上是关于从相同的代码生成略有不同的 APK的主要内容,如果未能解决你的问题,请参考以下文章

同时上传具有相同代码库但签名不同的两个版本的 apk

如何从 APK 中提取准确的编码? [复制]

iText 使用相同的代码生成不同的 pdf

无法从您的 Ionic 应用生成 Android App Bundle(没有 Android Studio)

您需要为您的 APK 或 Android App Bundle 使用不同的版本代码

如何使用略有不同的 $ref 使用相同的组件模式?