使用 Ant 编译 Android

#移动开发 #Android

(转载请注明出处: http://blog.csdn.net/xieyan0811)

使用 Ant 编译 Android 应用程序很方便,在 Window 和 Linux 下均可使用。尤其是将一个软件打成稍有差异的多个包时,非常实用。最近积累了一些小经验,下面分享一下:

1. 如何在 Linux/Window 上安装 Ant|

  1. 在 Linux 下直接用 ant 安装即可)

    1
    $ sudo apt-get install ant

  2. 在 Windows 下安装设置步骤如下(在 XP 及 Win7 可正常使用)

  1. 下载 ant 最新版本的二进制包
    [http://ant.apache.org/bindownload.cgi

](http://ant.apache.org/bindownload.cgi)
此包为压缩包,解包即可直接使用。

  1. 设置环境变量
  1. 我的电脑 ->右键 ->属性 ->高级 ->环境变量(Win7 类似)

  2. 在系统变量中加入 ANT_HOME,设置为 ant 解压的目录,形如: C:Files-ant-1.9.4

  3. 在系统变量 Path 中加入 Ant 可执行程序路径,形如: C:Files-ant-1.9.4

2. 如何为已存在的开发包建立 ant 编译环境

(除 Ant 还需要安装 JDK 和 Android

SDK,请参考 http://wenku.baidu.com/link?url=NN8HYiTx7113MVK2KDDOHT3gRPLbLcFRCIg28UOrhnsI6_litOGKbuU5oAH1ubpMrS6JRtJacpjgl4sQD002lG2v8OE3RAw-

zgIq1tokHCK)

  1. 在 Linux 下执行(android 程序在 AndroidSDK 的 tools 目录下)

    1
    android update project --name app_name -t 1 -p /home/xieyan/appsrcdir

  2. 在 Windows 下执行(android.bat 程序在 AndroidSDK 的 tools 目录下)

    1
    android.bat update project --name app_name -t 1 -p c:\xieyan\appsrcdir

3. 如何自动签名生成 Release 包

  1. 在源码目录下,建立 ant.properties 文件,将签名信息写入其中,形如:

    1
    2
    3
    4
    key.store=xxx/yyy.keystore
    key.alias=zzz.keystore
    key.store.password=123456
    key.alias.password=123456

  2. 再运行 antrelease,即可在 bin 目录下生成签名后的 apk 文件

4. 如何设置和使用 Ant 中的变量

  1. 在 ant.properties 中可以设置 Ant 中使用的变量,其格式为 name=value

  2. 也可以生成其它 properties 文件,在 build.xml 中使用以下命令包含该配置文件:

    1
    <property file=”文件路径”/>

5. 如何扩展 build.xml 文件以添加更多方法,如何调用方法

在源码目录下建立 custom_rules.xml,将自定义方法放在其中即可使用;也可以将自定义方法加入 build.xml 中,但由于更换编译环境,有时需要重新生成 build.xml,新加入的方法就被覆盖了。

  1. custom_rules.xml 同 build.xml 格式相同,形如:

    1
    2
    3
    4
    5
    <project name="custom_rules">
    <target name="testme">
    <echo message="testtest!" />
    </target>
    </project>

  2. 此时使用 ant testme,即可执行该方法,看到 test test!的显示信息

  3. 在一个方法中调用另一个或多个方法,使用 depends,形如:

    1
    <target name="testme" depends=”fun1,fun2”>

6. 如何在 Ant 中复制文件

  1. 先用 delete 删除原文件,再使用 copy 复制,形如:

    1
    2
    3
    <delete file="res/drawable-hdpi/logo.png"/>
    <copy file="xxx/logo.png"
    tofile="res/drawable-hdpi/logo.png"/>

7. 如何在 Ant 中执行二进制程序

  1. 使用 exec 执行二进制程序,每个参数放在一个 arg 中,形如:

    1
    2
    3
    4
    <replaceregexp file="src/com/xxx/yyy/zzz.java"
    match='(.*)public static final StringXXX=(.*)'
    replace=' public static final String XXX = "${YYY}";'
    byline="true"/>

8. 如何在源码中替换字符串

  1. 使用 replaceregexp 替换字符串,可使用通配符

    1
    2
    3
    4
    <replaceregexp file="src/com/xxx/yyy/zzz.java"
    match='(.*)public static final StringXXX=(.*)'
    replace=' public static final String XXX = "${YYY}";'
    byline="true"/>

9. 如何修改字体串及 Window/Linux 下中文乱码问题的解决

一般字符串定义在 strings.xml 中,它是一个 xml 文件,而 replaceregexp 中不能直接处理尖括号,需要使用转符;另外需要注意含有中文的文件,需要将编译指定为 utf-8,形如:

1
2
3
4
<replaceregexp encoding="utf-8"file="res/values/strings.xml"
match='(.*)string name="app_name"(.*)'
replace=' <string name="app_name">${APP_NAME}</string>'
byline="true"/>

上例中的 APP_NAME 是 ant 中定义的一个变量,中文可能产生乱码,如果直接写在 build.xml 或 custom_rules.xml 中,可用直接使用 utf8 字符,如果放在 properties 变量文件中,需要使用 native2ascii 进入编码转换。native2ascii 是 java 工具,用于将本地字符转为 ascii 字符,因此其源数据文件 (native) 在不同系统中也需要使用不同编译,例如在 linux 下默认源编码为 utf-8,在 Windows 下为 gbk,如果想多平台通用,需要在使用 native2ascii 命令时加入

--encoding 参数,形如:

1
2
3
4
5
6
7
8
9
<target name="native2ascii">
<delete file="${ascii_props}"/>
<execexecutable="native2ascii">
<argvalue="${native_props}"/>
<argvalue="${ascii_props}"/>
<argvalue="-encoding"/>
<argvalue="GBK"/>
</exec>
</target>

10. 如何修改包名(形如:com.xxx.yyy)

修改包名,需要修改 AndroidManifest.xml 以及源码中各个 java 文件和 xml 文件,还需要先从 AndroidManifest.xml 中取到当前包名,以进行替换,形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<target name="set-pkg">
<xmlpropertyfile="AndroidManifest.xml" collapseAttributes="true" />
<propertyname="old_package_name" value="${manifest.package}"/>
<property name="new_package_name"value="com.xxx.yyy"/>

<deletedir="${build.bin}" />
<deletedir="${build.gen}" />

<replaceregexpfile="AndroidManifest.xml"
match='package="(.*)"'
replace='package="${new_package_name}"'
byline="false"/>

<replaceregexpmatch="${old_package_name}"
replace="${new_package_name}"
byline="true">
<filesetdir="${src}" includes="**/*.java" />
</replaceregexp>

<replaceregexpmatch="${old_package_name}"
replace="${new_package_name}"
byline="true">
<filesetdir="${res}" includes="**/*.xml" />
</replaceregexp>
</target>