使用Ant编译Android
使用 Ant 编译 Android
#移动开发 #Android
(转载请注明出处: http://blog.csdn.net/xieyan0811)
使用 Ant 编译 Android 应用程序很方便,在 Window 和 Linux 下均可使用。尤其是将一个软件打成稍有差异的多个包时,非常实用。最近积累了一些小经验,下面分享一下:
1. 如何在 Linux/Window 上安装 Ant|
在 Linux 下直接用 ant 安装即可)
1
$ sudo apt-get install ant
在 Windows 下安装设置步骤如下(在 XP 及 Win7 可正常使用)
- 下载 ant 最新版本的二进制包
[http://ant.apache.org/bindownload.cgi
](http://ant.apache.org/bindownload.cgi)
此包为压缩包,解包即可直接使用。
- 设置环境变量
我的电脑 ->右键 ->属性 ->高级 ->环境变量(Win7 类似)
在系统变量中加入 ANT_HOME,设置为 ant 解压的目录,形如: C:Files-ant-1.9.4
在系统变量 Path 中加入 Ant 可执行程序路径,形如: C:Files-ant-1.9.4
2. 如何为已存在的开发包建立 ant 编译环境
(除 Ant 还需要安装 JDK 和 Android
SDK,请参考 http://wenku.baidu.com/link?url=NN8HYiTx7113MVK2KDDOHT3gRPLbLcFRCIg28UOrhnsI6_litOGKbuU5oAH1ubpMrS6JRtJacpjgl4sQD002lG2v8OE3RAw-
zgIq1tokHCK)
在 Linux 下执行(android 程序在 AndroidSDK 的 tools 目录下)
1
android update project --name app_name -t 1 -p /home/xieyan/appsrcdir
在 Windows 下执行(android.bat 程序在 AndroidSDK 的 tools 目录下)
1
android.bat update project --name app_name -t 1 -p c:\xieyan\appsrcdir
3. 如何自动签名生成 Release 包
在源码目录下,建立 ant.properties 文件,将签名信息写入其中,形如:
1
2
3
4key.store=xxx/yyy.keystore
key.alias=zzz.keystore
key.store.password=123456
key.alias.password=123456再运行 antrelease,即可在 bin 目录下生成签名后的 apk 文件
4. 如何设置和使用 Ant 中的变量
在 ant.properties 中可以设置 Ant 中使用的变量,其格式为 name=value
也可以生成其它 properties 文件,在 build.xml 中使用以下命令包含该配置文件:
1
<property file=”文件路径”/>
5. 如何扩展 build.xml 文件以添加更多方法,如何调用方法
在源码目录下建立 custom_rules.xml,将自定义方法放在其中即可使用;也可以将自定义方法加入 build.xml 中,但由于更换编译环境,有时需要重新生成 build.xml,新加入的方法就被覆盖了。
custom_rules.xml 同 build.xml 格式相同,形如:
1
2
3
4
5<project name="custom_rules">
<target name="testme">
<echo message="testtest!" />
</target>
</project>此时使用 ant testme,即可执行该方法,看到 test test!的显示信息
在一个方法中调用另一个或多个方法,使用 depends,形如:
1
<target name="testme" depends=”fun1,fun2”>
6. 如何在 Ant 中复制文件
先用 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 中执行二进制程序
使用 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. 如何在源码中替换字符串
使用 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>