将Android项目构建到不同的包

时间:2012-03-21 08:18:00

标签: android ant build-automation

我正在努力寻找为6个以上不同客户构建/打包Android应用的最佳方式。我可以在SVN中为所有客户使用不同的分支,但应用程序之间的唯一区别是资源文件夹中的一些值(drawables,strings等)。

我编写了一个导入标准Android build.xml 的ant脚本。该脚本执行以下操作:

  1. 从属性文件中读取客户名称。
  2. 对于每位客户,完成以下操作:
    1. AndroidManifest.xml 中的包名称已更改(通过挂钩到 -pre-build 目标)。
    2. 将自定义资源复制到构建中的 res 目录中(通过挂钩到 -pre-compile 目标)。
    3. 包名称更改回默认值(通过挂钩到 -post-compile 目标)。
    4. 将APK复制到名为 customer-versionno.apk 的特定位置。
  3. 这似乎工作得很好,直到我刚刚编写了更改包名称的部分。由于包名称更改, R 类的位置也发生了更改,这意味着构建失败,因为Java类从标准包中导入 R 类。

    我不希望有一个更改代码的构建脚本。我希望能够对所有文件进行最少的更改。

    Soo ..问题确实是:

    1. 我的问题有没有好的/简单的解决方案?
    2. 我是以错误的方式解决这个问题吗?有没有更好的方法可以轻松地将同一个应用程序打包到6个以上的不同客户?

2 个答案:

答案 0 :(得分:4)

您真的需要更改包名吗?更改包名称很难自动完成。话虽如此,这是我解决问题的方法:

我的方案是我有一个应用程序可以部署到30-200个不同的已签名APK文件,其中文件之间的唯一区别是一些资源(drawables,字符串,值等)和包名称。

我是通过处理作为模板项目的应用程序的通用版本来实现的。一旦这个工作,我准备部署,我调用一个bash脚本,为每个目标循环执行以下步骤:

  1. 完全清理项目
  2. 使用sed。
  3. 交换res目录和包名称
  4. 构建并签署APK
  5. 这平衡了可怕的匮乏时间和快速发展的时间。我真的没有看到比这更优雅/更强大的解决方案。

    最后一个小提示:在android清单中使用相对包名称,如“.Application”而不是“com.mycompany.myproject.Application”。这样,您只需要在一个位置更改包名称。

答案 1 :(得分:1)

是否有可能通过制作包含主要项目的6个以上不同项目来解决这个问题。这样您就可以覆盖资源并制作不同的apk