【问题标题】:Android - Multiple .apk file from single code baseAndroid - 来自单个代码库的多个 .apk 文件
【发布时间】:2011-12-29 12:09:48
【问题描述】:

我在 android 中开发了 3 个主要功能相同但 UI 看起来不同的应用程序。画面的图像和背景颜色不同。

现在,我想创建一个代码库,我可以从中为 3 个应用程序生成多个 .apk 文件。

我尝试为 3 个应用程序的 src 文件夹创建 3 个不同的包。但我不知道如何为这些应用程序设置 res 文件夹。

需要有关创建单个代码库的指针,我们可以从中生成多个 .apk 文件,其中仅包含各自的 src 和 res 文件夹。

【问题讨论】:

  • 为什么不创建一个适用于所有三种类型设备的 apk?
  • 这是不可能的,因为这 3 个应用程序中的每一个都有不同的图像。
  • 是的 - 这是可能的。我猜图片是基于设备的大小,对吧?
  • 不抱歉。让我解释。应用程序 1 - 主页有欢迎文字 - “欢迎使用第一个应用程序”,带有图像 123 和按钮。单击按钮后,会出现带有文本“成功”的吐司。应用程序 2 - 主页有欢迎文字 - “欢迎使用第二个应用程序”,带有图像 abc 和按钮。单击按钮后,会出现带有文本“成功”的吐司。应用程序 3 - 主页有欢迎文字 - “欢迎使用第三个应用程序”,带有图像 xyz 和按钮。单击按钮后,会出现带有文本“成功”的吐司。使用相同的代码库,应该为这 3 个不同的应用生成 3 个 apk。

标签: android apk


【解决方案1】:
  • 使用包含所有常用代码的Android Library Project
  • 创建引用库项目的单独 Android 项目(您需要将清单复制到每个项目中,并确保使用完整的 Java 包名称声明所有组件)。
  • 将特定于每个应用程序的任何资源(可绘制对象、颜色等)放入各个项目资源文件夹中,它们将在构建时覆盖库项目中类似命名的资源。

【讨论】:

  • 您好,安装应用程序后,会创建 3 个不同的应用程序
  • Hi Das,安装应用程序后,我们将只有一个应用程序。原因是......我们首先将所有公共代码放在库项目中。在其他项目中,我们参考代码。所以,我们在eclipse中有3个项目,对应3个apk文件。
  • “在此服务器上找不到请求的 URL”链接:(
【解决方案2】:

我认为最好的选择是使用ant,您需要为每个构建添加一个 ant 目标并更改资源文件夹。 如果你使用生成的 build.xml,res 文件夹是这样定义的 <property name="resource.absolute.dir" location="res" /> 所以你会想要覆盖它

【讨论】:

  • 谢谢,但我想创建输出 apk 文件而不是战争文件。这可以使用 ant 选项吗?
  • 使用 ant,您可以做的不仅仅是创建战争文件 :) Android 对 ant 的支持非常好,您可以使用一个命令生成 build.xml 文件。阅读本文了解更多详情:developer.android.com/guide/developing/building/…
  • 这不是一个好主意。您想在那里使用库项目和资源文件。
【解决方案3】:

难道您不能将所有通用代码放入一个库项目中,然后只从 3 个各自包含相关资源的独特项目中引用该项目。

更新:使用 Gradle 构建系统时,此答案现已过时。

【讨论】:

    【解决方案4】:

    您为什么不使用单个应用程序,它根据用户设置的 SharedPreferences 值或安装时的上下文执行三种不同的操作。如果你真的想分开,你可以拥有三个不同的活动,然后你决定从一个静默的主活动启动哪一个,该活动会重定向到不同的活动中的任何一个。

    另一种方法是拥有一个独特的活动,在onCreate 时间从 3 个不同的布局动态地膨胀自己。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (...custom check for layout... equals(layout1)) {
            setContentView(R.layout.main_layout1);
        } else if (... equals(layout2)) {
            setContentView(R.layout.main_layout2);
        } else if (... equals(layout3)) {
            setContentView(R.layout.main_layout3);
        } else {
            throw new IllegalStateException("Unknown layout!");
        }
        ... your onCreate stuff....
    }
    

    它将使代码维护更容易(只需修改一个代码源,只需维护一个版本列表和变更集)

    检查这里: How to use SharedPreferences in Android to store, fetch and edit values

    【讨论】:

    • 这不是android的做法,不推荐
    【解决方案5】:

    我建议使用Gradle flavors

    它似乎很好地解释了所有基础知识。我今天刚完成转换为Gradle,效果很好。自定义应用图标、名称和字符串等。

    正如该网站所解释的,此设计背后的部分目的是使其更具动态性,并更轻松地允许使用基本相同的代码创建多个 APK,这听起来与您正在做的事情相似。

    另请参阅我的recent question,指的是您的项目结构并为每个应用程序使用自定义代码。

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多