使用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 // method@0004
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; /
/ type@0001
000178: 7010 0000 0000                         |0002: invoke-direct {v0}, LHello
;.<init>:()V // method@0000
00017e: 6201 0000                              |0005: sget-object v1, Ljava/lang
/System;.out:Ljava/io/PrintStream; // field@0000
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 // method@0001
00018c: 0a00                                   |000c: move-result v0
00018e: 6e20 0300 0100                         |000d: invoke-virtual {v1, v0}, L
java/io/PrintStream;.println:(I)V // method@0003
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)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM