使用dx命令在cmd环境下执行的正确方法,我用的版本android4.4.2,jdk1.8

一、首先介绍几条命令:

将Hello.java文件编译成Hello.class文件
F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2>javac -source 1.6 -target 1.6 Hello.java

将Hello.class文件反编译java汇编代码
F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2>javap -c -classpath . Hello

将Hello.class文件编译成Hello.dex文件
F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2>dx --dex --output Hello.dex Hello.class

将.dex文件反编译成dalvik汇编代码
F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2>dexdump.exe -d Hello.dex

二、比如下面的java代码,我要看反编译后的android汇编代码,应如下操作:

public class Hello {
  public int foo(int a, int b) {
    return (a+b)*(a-b);
  }
  public static void main(String[] argc) {
    Hello h = new Hello();
    System.out.println(h.foo(5, 3));
  }
}

1.把dx路径的放进环境变量path中,例如我的路径是 F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2

2.将java代码编译成java的字节码文件(class文件)

因为的jdk版本太高,所以要使用命令如下:

F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2>javac -source 1.6 -target 1.6 Hello.java 

2.将Hello.class文件放到dx的路径下

3.通过dx工具将Hello.class文件(java字节码)转换成android的Hello.dex文件(dalvik字节码)

F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2>dx --dex --output Hello.dex Hello.class

4.通过dexdump.exe将Hello.dex文件反编译成dalvik汇编代码

F:\adt-bundle-windows-x86_64\sdk\build-tools\android-4.4.2>dexdump.exe -d Hello.dex

最终生成的dalvik汇编代码如下:

Processing ‘Hello.dex‘...
Opened ‘Hello.dex‘, DEX version ‘035‘
Class #0            -
  Class descriptor  : ‘LHello;‘
  Access flags      : 0x0001 (PUBLIC)
  Superclass        : ‘Ljava/lang/Object;‘
  Interfaces        -
  Static fields     -
  Instance fields   -
  Direct methods    -
    #0              : (in LHello;)
      name          : ‘<init>‘
      type          : ‘()V‘
      access        : 0x10001 (PUBLIC CONSTRUCTOR)
      code          -
      registers     : 1
      ins           : 1
      outs          : 1
      insns size    : 4 16-bit code units
00014c:                                        |[00014c] Hello.<init>:()V
00015c: 7010 0400 0000                         |0000: invoke-direct {v0}, Ljava/
lang/Object;.<init>:()V // [email protected]
000162: 0e00                                   |0003: return-void
      catches       : (none)
      positions     :
        0x0000 line=1
      locals        :
        0x0000 - 0x0004 reg=0 this LHello;

    #1              : (in LHello;)
      name          : ‘main‘
      type          : ‘([Ljava/lang/String;)V‘
      access        : 0x0009 (PUBLIC STATIC)
      code          -
      registers     : 5
      ins           : 1
      outs          : 3
      insns size    : 17 16-bit code units
000164:                                        |[000164] Hello.main:([Ljava/lang
/String;)V
000174: 2200 0100                              |0000: new-instance v0, LHello; /
/ [email protected]
000178: 7010 0000 0000                         |0002: invoke-direct {v0}, LHello
;.<init>:()V // [email protected]
00017e: 6201 0000                              |0005: sget-object v1, Ljava/lang
/System;.out:Ljava/io/PrintStream; // [email protected]
000182: 1252                                   |0007: const/4 v2, #int 5 // #5
000184: 1233                                   |0008: const/4 v3, #int 3 // #3
000186: 6e30 0100 2003                         |0009: invoke-virtual {v0, v2, v3
}, LHello;.foo:(II)I // [email protected]
00018c: 0a00                                   |000c: move-result v0
00018e: 6e20 0300 0100                         |000d: invoke-virtual {v1, v0}, L
java/io/PrintStream;.println:(I)V // [email protected]
000194: 0e00                                   |0010: return-void
      catches       : (none)
      positions     :
        0x0000 line=6
        0x0005 line=7
        0x0010 line=8
      locals        :

  Virtual methods   -
    #0              : (in LHello;)
      name          : ‘foo‘
      type          : ‘(II)I‘
      access        : 0x0001 (PUBLIC)
      code          -
      registers     : 5
      ins           : 3
      outs          : 0
      insns size    : 6 16-bit code units
000198:                                        |[000198] Hello.foo:(II)I
0001a8: 9000 0304                              |0000: add-int v0, v3, v4
0001ac: 9101 0304                              |0002: sub-int v1, v3, v4
0001b0: b210                                   |0004: mul-int/2addr v0, v1
0001b2: 0f00                                   |0005: return v0
      catches       : (none)
      positions     :
        0x0000 line=3
      locals        :
        0x0000 - 0x0006 reg=2 this LHello;

  source_file_idx   : 1 (Hello.java)

使用dx命令在cmd环境下执行的正确方法,我用的版本android4.4.2,jdk1.8

时间: 2024-09-30 02:02:26

使用dx命令在cmd环境下执行的正确方法,我用的版本android4.4.2,jdk1.8的相关文章

带包的java类在cmd环境下的执行办法

带包的java类在cmd环境下的执行办法:工程目录为D:\Program Files\eclipse\workspace\ReadFileByLinesUniq上面目录下有两个文件夹bin和src源文件位于src\cn\cnnic\ops\zonefile目录下通过eclipse编译src\cn\cnnic\ops\zonefile\ReadFileByLinesUniq.java的.class文件位于bin\cn\cnnic\ops\zonefile\ReadFileByLinesUniq.c

PHP环境下Memcache的使用方法

原文:PHP环境下Memcache的使用方法 原文地址:http://www.2cto.com/kf/201503/384967.html 如今互联网崛起的时代,各大网站都面临着一个大数据流问题,怎么提高网站访问速度,减少对数据库的操作:作为PHP开发人员,我们一般能想到的方法有页面静态化处理.防盗链.CDN内容分发加速访问.mysql数据库优化建立索引.架设apache服务器集群().还有就是现在流行的各种分布式缓存技术:如memcached/redis: 1.什么是Memcached? a.

关于phoenixframe自动化平台在Linux环境下执行用例说明

phoenixframe自动化平台支持在Linux环境下使用phantomjs,Firefox,chrome执行测试用例.但有以下几个问题需要注意: 1.若无法启动phantomjs,Firefox,chrome的驱动,则请检查存放drivers的目录是否有读写权限.使用一下命令添加一下权限即可: 假如目录为:.../webapps/phoenix_node/WEB-INF/classes/drivers 则cd到drivers目录下执行:chmod 777 * 再次启动即可. 在Linux环境

phoenixframe自动化平台在Linux环境下执行用例的说明

phoenixframe自动化平台支持在Linux环境下使用phantomjs,Firefox,chrome执行测试用例.但有以下几个问题需要注意: 1.若无法启动phantomjs,Firefox,chrome的驱动,则请检查存放drivers的目录是否有读写权限.使用一下命令添加一下权限即可: 假如目录为:.../webapps/phoenix_node/WEB-INF/classes/drivers 则cd到drivers目录下执行:chmod 777 * 再次启动即可. 在Linux环境

eclipse环境下tomcat远程调试方法

前提:Windows环境tomcat是以catalina.bat方式而非Windows服务形式启动(两者所使用的JAVA配置及JVM参数会有差异). 服务器段设置 方法1:修改CATALINA_OPTS 修改 catalina.bat文件,添加:Set  "CATALINA_OPTS=-Xdebug  -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n" 参数说明: -Xdebug                 

Windows/Linux环境下模拟服务端口方法

场景需求: 对于涉及纵向级联(比如与总部.分部级联)或横向互联(与本级其他系统互联)的大系统,往往需要在未部署系统服务时验证相关端口的开通情况,以备在防火墙上进行端口开通申请. Windows环境下模拟服务端口: 在服务器端使用第三方软件"TCP&UDP测试工具"进行模拟端口,可以很方面的用"telnet  ip  port"命令测试. Linux环境下模拟服务端口: 可以使用"nc  -v  ip  port"命令测试端口是否开通,若提

Scrapy爬虫框架下执行爬虫的方法

在使用Scrapy框架进行爬虫时,执行爬虫文件的方法是 scrapy crawl xxx ,其中 xxx 是爬虫文件名. 但是,当我们在建立了多个文件时,使用上面的命令时会比较繁琐麻烦,我们就可以使用下述方法同时完成爬虫文件的执行. 第一种,在scrapy框架下建立一个运行文件,如 run.py ,在文件中建立一个列表,列表为爬虫的执行命令,最后通过循环执行 execute() 函数完成执行.执行时使用 python run.py 命令即可.如下面的代码所示 from scrapy.cmdlin

std::string在多字节字符集环境下substr的实现方法

昨天写到<使用多字节字符集的跨平台(PC.Android.IOS.WP)编码/解码方法>中提到服务端使用std::string处理字符串,std::string对多字节字符集支持并不是很完善,std::string中的函数没有对多字节字符集进行直接的支持. 例如直接调用std::string的substr函数,就会导致某些情况下截取的字符串尾部产生非法字符. GB系列多字节字符集基础知识: VC环境下工程设置为多字节字符集,默认使用的是GBK编码,GB2312.GBK.GB18030,这3个都

Visual Studio2008环境下查找C#中方法的“查看所有引用”

在Visual Studio开发环境下,想必F12我们都很熟悉了,有没有用过“查看所有引用”呢? 尤其是在一个解决方案中,包含了很多项目,彼此相互的调用是很常见的,例如三层架构, BLL调用DAL,DAL调用Model,Model又调用DBUtility,每层中可能有有相同名字的方法,我们可以使用查询来找到想要的方法,但是不精确, 这里我们就可以用到“查看所有引用”,但是不知道有没有人遇到过,当在方法上,右键->查找所有引用,这时查找符号结果区却提示出,"搜索未找到结果"这一提示