• 利用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解析完毕。

    转载请注明出处:



  • 相关阅读:
    ssh认证
    Nginx中proxy_pass 后有无/的区别
    Nginx中$http_host、$host、$proxy_host的区别
    Nginx读书笔记----HTTP proxy module
    ngx_http_core_module模块提供的变量
    Nginx读书笔记三----资源分配
    http_code 413 Request Entity Too Large
    nginx读书笔记二----nginx配置
    firewall-cmd命令
    GCC编译器原理(一)03------GCC 工具:gprof、ld、libbfd、libiberty 和libopcodes
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605022.html
Copyright © 2020-2023  润新知