安卓自定义构建使用Ant

10

运行以下命令时,会自动生成这4个文件(build.xml、local.properties、project.properties和proguard.cfg):

android update project --name TestApp --target 10 -p .

已更新project.properties

已更新local.properties

已添加文件./build.xml

已更新文件./proguard.cfg

但是我想让“自动生成”的build.xml也包含以下“预编译”代码。是否有方法可以做到这一点?是否存在某个“包含”文件或“模板”文件可以包含它?

  <target name="config">

  <property name="config-target-path" value="${source.dir}/com/androidengineer/antbuild"/>

  <!-- Copy the configuration file, replacing tokens in the file. -->
  <copy file="config/Config.java" todir="${config-target-path}"
        overwrite="true" encoding="utf-8">
   <filterset>
    <filter token="CONFIG.LOGGING" value="${config.logging}"/>
   </filterset>
  </copy>

 </target>

尝试将该代码粘贴到您的 build.xml 文件中,然后修改“compile”目标(它可能是另一个名称),如下所示:<target name="compile" depends="config"> ... - Dante WWWW
嗨, 我的意思是当运行“android update”时,“build.xml”是自动生成的。我无法将代码粘贴在那里。这是我的问题,想知道是否可以将该代码粘贴到其他地方,但仍然能够在“android update”运行时被包含。 - samxiao
生成 build.xml 后,它会立即运行吗? - Dante WWWW
可能会有延迟,但是是的,现在它会在生成后立即运行。 - samxiao
3个回答

13

使用Android SDK r20时,由android工具生成的build.xml包含以下代码:

<!--
    Import per project custom build rules if present at the root of the project.
    This is the place to put custom intermediary targets such as:
        -pre-build
        -pre-compile
        -post-compile (This is typically used for code obfuscation.
                       Compiled code location: ${out.classes.absolute.dir}
                       If this is not done in place, override ${out.dex.input.absolute.dir})
        -post-package
        -post-build
        -pre-clean
-->
<import file="custom_rules.xml" optional="true" />

创建自定义目标或自定义现有目标的方法是创建一个custom_rules.xml文件来包含这些新目标。请注意,在我的测试中,这些目标需要嵌套在<project>标记中,因此只需将生成的build.xml的前两行复制到custom_rules.xml中,并不要忘记结尾处的闭合</project>标记。由于custom_rules.xml不会被android update覆盖,因此您的更改将是持久的,并且可以提交到您选择的SCM工具中。


是的,看起来他们已经在新的SDK版本中修复了它。 - samxiao

3

谢谢!但是这并不起作用,因为每次构建时我都会运行“android update project”,它总是生成一个新的“build.xml”并替换现有的文件。我正在寻找解决方案。 - samxiao
那我不知道为什么它不起作用。由于有一个build.xml模板,我认为每次运行“android update project”时都应该从模板生成一个新的build.xml,但似乎并没有...对此很抱歉。 - Dante WWWW
嗨,coolcfan,感谢您的回答,但我不认为您理解我的问题。我可以更改模板,但这将影响到我“其他”项目,因为它们都使用相同的SDK。我只想为此特定项目进行自定义更改以进行此特定构建。所以这是我的情况:
  1. 将$ANDROID_HOME/tools/lib/build.template复制到build.xml
  2. 修改build.xml
  3. 运行“android update project”
  4. “android update”生成一个新的build.xml,现在替换了我修改后的build.xml的副本
- samxiao
一种愚蠢的方法是编写一个脚本,在构建过程开始时覆盖构建模板,然后运行命令,无论构建是否成功,最后都恢复原始的构建模板...... - Dante WWWW
谢谢coolcfan,这正是我最初的想法。我只是好奇是否有更好的解决方案,例如在生成时让“android update project”包含一些自定义的build.xml内容。 - samxiao
由于您有多个项目...也许没有。 "android update project"命令是否具有让您将build.xml模板作为参数或在属性文件中指定的功能?如果没有...那么“愚蠢”的方法就是唯一的选择 :P - Dante WWWW

1
build.xml 文件本身中,它会告诉你如何做到这一点。请参阅文件中的以下注释:
<!--

    ***********************
    ****** IMPORTANT ******
    ***********************
    In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
    in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->

我尝试过了,但它没起作用 :-( 这可能是因为我在我的Android SDK中有一个错误。 我会在新的更新中再试一次。 - samxiao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接