利用ant和dedex解析classes.dex

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


二、ANT解析

现在将上面的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解析完毕。

转载请注明出处:



原文地址:https://www.cnblogs.com/sparkleDai/p/7605022.html