使用 Ant 的 Android 自定义构建

Posted

技术标签:

【中文标题】使用 Ant 的 Android 自定义构建【英文标题】:Android custom build using Ant 【发布时间】:2012-01-21 15:18:30 【问题描述】:

这 4 个文件(build.xml、local.properties、projects.properties、proguard.cfg)是在运行时自动生成的:

android 更新项目 --name TestApp --target 10 -p .

更新了 project.properties

更新了 local.properties

添加文件 ./build.xml

更新文件 ./proguard.cfg

但我希望“auto-gen”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 中,然后修改“编译”目标(可能是另一个名称),例如 ... 嗨,我的意思是“build.xml”是在运行“android update”时自动生成的。我不能在那里粘贴该代码。这是我的问题,我想知道我是否可以将该代码粘贴到其他地方,但在“android 更新”运行时仍然能够包含在内。 build.xml生成后会立即运行吗? 可能会延迟,但是是的,现在它在生成后立即运行。 【参考方案1】:

android 工具(至少在使用 Android SDK r20 时)生成的 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 文件。请注意,在我的测试中,目标需要嵌套在&lt;project&gt; 标记中,因此只需将生成的build.xml 的前两行复制到custom_rules.xml,并且不要忘记关闭&lt;/project&gt; 标记中的结尾。由于custom_rules.xml 不会被android update 覆盖,您的更改将保持不变,并且可以签入您选择的SCM 工具。

【讨论】:

是的,他们似乎已经在新的 SDK 版本中修复了它。【参考方案2】:

也许你可以检查一下这个问题的答案:

Does the ADT plugin automatically create an ant build file?

在答案中有一段说...

或者,您可以直接从 $ANDROID_HOME/tools/lib/build.template 复制 build.xml 模板,然后更改项目名称。

修改这个文件并运行命令看看它是否有效。

更新

另请查看本文的“自定义构建”:http://www.androidengineer.com/2010/06/using-ant-to-automate-building-android.html

【讨论】:

谢谢!但这不起作用,因为我每次构建时总是运行“android更新项目”,它总是生成一个新的“build.xml”并替换现有的。我正在寻找解决方案。 那我不知道为什么它不起作用。由于有一个 build.xml 模板,我认为每次运行“android 更新项目”时它都应该从模板生成一个新的 build.xml,但似乎没有......对不起。 嗨coolcfan,感谢您的回答,但我认为您不理解我的问题。我可以对模板进行更改,但这会影响我所有的“其他”项目,因为它们使用相同的 SDK。我只希望针对此特定构建的特定项目进行自定义更改。 So here is my situation:1. Copy $ANDROID_HOME/tools/lib/build.template to build.xml2. Modify the build.xml3. Run "android update project"4. "android update" generate a new build.xml which now replaced my copy of modified build.xml 一种愚蠢的方法是编写一个脚本,在构建过程开始时覆盖构建模板,然后运行命令,然后,无论构建成功与否,恢复原始构建-模板到底...... 感谢coolcfan,这就是我最初的想法。我只是想知道是否有更好的解决方案,比如让“android 更新项目”在生成它时包含一些自定义的 build.xml 内容..【参考方案3】:

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 中有一个错误。我会用新的更新再试一次。

以上是关于使用 Ant 的 Android 自定义构建的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Next.js 中使用自定义主题配置 Ant Design 并支持 CSS 模块功能

使用 Ant 和 Proguard 编译 Android 应用程序的问题

使用自定义构建器使用 Android 创建发布构建

具有自定义构建的 Android 模拟器不接受键盘输入

从 Maven 运行 Ant 任务

如何自定义 Ant Design 的表单?