Ant是Apache软件基金会JAKARTA目录中的一个子项目,采用纯java编写,容易跨平台。在Android的多渠道批量打包就可以采用ant来实现,可以将ant作为插件安装到eclipse中(eclipse中已经集成)。那ant到底是怎么一回事呢?
ant其实就是执行一系列的任务,而这些任务的细节由相应的xml来描述。所以,理论上可以执行一切想执行的任务,具体可以参看《Ant详解》。
依据这一理念,只要我们能够利用某一种方式来执行dex的解析命令,那么就可以将其做成ant的执行脚本,然后使用ant来执行。这里,dex的解析工具使用的是开源的dedex,具体地址请点击这里。在dedex的开源地址中下载dedex.jar,将其改名为ddx.jar。
一、cmd解析
在使用ant脚本执行之前,我们可以先使用cmd命令来执行。下面是执行的命令。
java -jar ddx.jar -d out_dir1 classes.dex
注:
1、执行命令java需要安装了jdk,并将jdk下的bin目录设置到了环境变量中。我的jdk使用的是1.6的,路径是D:Program Files (x86)Javajdk1.6.0_45in。
2、将classes.dex和ddx.jar放到一个目录下,然后cmd命令定位到该目录中,执行上面的命令。
3、如果ddx.jar放到其他文件夹中,必须在命令中指定。需要注意的是,ddx.jar的路径必须是英文,而且文件夹的名字不能带有空格等特殊字符(比如放到了Programe Files文件夹下),否则命令可能执行失败。比如ddx.jar放到了D:jars下,我们这样执行命令。
java -jar D:jarsddx.jar -d out classes.dex
现在将上面的cmd命令转换到ant的脚本中去执行。下面是脚本代码。
build.xml
<project name="decode_dex" default="decode" > <property name="jdk-folder" value="D:Program Files (x86)Javajdk1.6.0_45" > </property> <property name="decode_dex-jar" value="D:Program Files (x86)Javaddx.jar" > </property> <property name="out-dir" value="out" > </property> <property name="classes" value="classes.dex" > </property> <target name="init"> <echo>Initialize...</echo> <delete dir="${out-dir}" /> <mkdir dir="${out-dir}" /> </target> <target name="decode" depends="init"> <echo>decode dex...</echo> <exec executable="${jdk-folder}/bin/java" failonerror="true" > <arg value="-jar" /> <arg value="${decode_dex-jar}" /> <arg value="-d" /> <arg value="${out-dir}" /> <arg value="${classes}" /> </exec> </target> </project>注:
1、project中的name取为decode_dex。
2、指定默认执行的target,这里设为decode,对应到后面的名字为decode的target节点。在执行ant脚本时,如果没有特别指定执行的target,将会默认执行该target。
3、指定jdk、ddx、输出路径、classes.dex的具体位置。这里的位置可以有空格。可以有空格主要是由于我们前面是在cmd下执行命令的,cmd执行命令时空格是分隔标志,而这里是ant的脚本,ant执行脚本时认的是xml中的描述,不以空格作为分隔标志。
4、init和decode两个target。其中decode的又依赖于init,而project默认的target是decode。所以在执行该脚本时虽然默认执行的是decode,但是由于是decode依赖于init,所以在执行decode时,init又会被执行。可以简单的认为是一种函数的调用,即decode调用了init。
5、在init中用echo输出描述,delete删除输出目录,mkdir创建输出目录。
6、decode中,用exec来描述要执行的命令(也就是前面的cmd命令),然后用arg来依次指定相应的参数和值(与前面的cmd命令相对应)。
7、eclipse中带有ant,可以将其所在的路径设置为环境变量,以方便在cmd中直接执行。比如我的ant目录在D:Program Files (x86)eclipsepluginsorg.apache.ant_1.8.3.v201301120609下,将该目录设置到环境变量中即可。当然也可以从http://ant.apache.org/bindownload.cgi中下载ant,然后放到某一路径下(比如D:Ant),并将ant.bat所在的路径设置成环境变量。
8、打开cmd,定位到classes.dex所在的目录,然后输入ant执行即可,如下图。
如果脚本的名字不是build.xml(比如为test.xml),需要执行ant -f test.xml。如下图。
至此,classes.dex解析完毕。
转载请注明出处: