【问题标题】:Configure specific package for generated classes in ADT / ant build在 ADT / ant build 中为生成的类配置特定的包
【发布时间】:2013-08-23 21:35:13
【问题描述】:

我正在为使用完全相同代码的不同客户开发一个应用程序(它只显示一个WebView)。唯一的区别是一个配置文件、图标和 android 包名称,都是通过自定义 ant 任务生成的。

如果我在 Eclipse 中运行 ant 发布目标或构建项目,生成的 Java 类(如 R)会在名为 android 包的包中生成。因此,我的项目中这些类的导入无效,因为它们的包已更改。

Newsnet.java

package ch.newsnet.app;

import ch.newsnet.app.R; // <- cannot be found after build

public class Newsnet extends FragmentActivity {
    //...
}

运行我的自定义 ant 目标会将我的 android 包设置为 ch.customer1.app,这使 R 成为包 ch.customer1.app 的一个类。但我希望它始终是ch.newsnet.app。如何在 a) ant build 和 b) eclipse builder 中实现这一点?当我可以在一个代码库中拥有所有内容时,我不想设置 20 多个项目并维护它们的构建文件和资源。

【问题讨论】:

  • 我强烈建议您设置一个包含所有逻辑的库项目 - 然后为每个客户创建一个 shell 项目。
  • 这正是我想要避免的。我会有很多重复的配置代码
  • Class R 是由 Android 自动生成的,它始终位于应用程序的包中 - 您无法控制它。之后您可以尝试重命名/移动/编辑它,但我不建议这样做。
  • 那么图书馆项目将如何帮助我呢?我会在我的活动中使用生成的R 的导入,我当然会在库项目中使用,所以我仍然面临同样的问题

标签: java android ant adt


【解决方案1】:

对于那些面临同样问题的人,我解决了这个问题如下(虽然这不是最好的解决方案,但它对我有用):

我创建了 ant 目标 moveGeneratedFiles,在其中将生成的包复制到正确的包,替换包名并删除生成的包(这在 eclipse 中实际上不起作用,因为会再次生成类)。

<target name="moveGeneratedFiles">
    <loadproperties>
      <file file="assets/customer.properties"/>
    </loadproperties>
    <copy todir="gen/ch/newsnet/app" overwrite="true">
        <fileset dir="gen/ch/${customer.name}/app" />
    </copy>
    <replace dir="gen/ch/newsnet/app" token="package ch.${customer.name}.app;" value="package ch.newsnet.app;" />
    <delete>
        <fileset dir="gen/ch/${customer.name}/app" />
    </delete>
</target>

在项目属性中,我添加了一个执行此目标的 ant builder,因此生成的类将在保存后同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2020-11-11
    • 2015-07-14
    相关资源
    最近更新 更多