息,但实在是不好读啊~~~~
二、dex2jar + XJad 方法
    该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。如:
    1、dex2jar.bat d:\play\classes.dex
          默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar
    2、使用XJad反编译该jar包
          之后的使用方法,大家都懂的:)
    该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时的java文件,而开发时使用的lib包不能反编译出来。
三、AXMLPrinter2.jar + baksmali.jar + smali.jar 方法
      这个方法就强大了,AXMLPrinter2是还原l和l的工具,直接打开这两个xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加的密)。
      baksmali.jar是反解析dex的工具,smali.jar则是再还原成dex的工具
      操作方式如下:
    1、java -jar AXMLPrinter2.jar D:\l >
    2、java -jar AXMLPrinter2.jar D:\play\res\l >
    3、java -jar baksmali-1.2.5.jar -o classout/ d:\play\classes.dex
      baksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:
view plaincopy to clipboardprint?
.class Lcom/paul/test/a; 
.
super Landroid/view/View; 
 
# static fields 
.field private static final a:Landroid/graphics/Typeface; 
 
# instance fields 
.field private b:I 
.field private c:I 
.field private d:Z 
.field private e:J 
.field private f:I 
.field private l:[Ljava/lang/String; 
 
# direct methods 
.method static constructor <clinit>()V 
    .registers 2 
    sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface; 
    const/4 v1, 0x0 
    invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface; 
    move-result-object v0 
    sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface; 
    return-void 
.end method 

# other methods .......... 

# virtual methods 
.method public onKeyUp(ILandroid/view/KeyEvent;)Z 
    .registers 4 
    const/16 v0, 0x42 
    if-eq p1, v0, :cond_8 
    const/16 v0, 0x17 
    if-ne p1, v0, :cond_b 
    :cond_8 
    invoke-direct {p0}, Lcom/paul/test/a;->d()V 
    :cond_b 
    const/4 v0, 0x0 
    invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V 
    invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z 
    move-result v0 
    return v0 
.end method 
.class Lcom/paul/test/a;
.super Landroid/view/View;
# static fields
.field private static final a:Landroid/graphics/Typeface;
# instance fields
.field private b:I
.field private c:I
.field private d:Z
.field private e:J
.field private f:I
.field private l:[Ljava/lang/String;
# direct methods
.method static constructor <clinit>()V
    .registers 2
    sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;
    const/4 v1, 0x0
    invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
    move-result-object v0
    sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;
    return-void
.end method
#
# other methods ..........
#
# virtual methods
.method public onKeyUp(ILandroid/view/KeyEvent;)Z
    .registers 4
    const/16 v0, 0x42
    if-eq p1, v0, :cond_8
    const/16 v0, 0x17
    if-ne p1, v0, :cond_b
    :cond_8
    invoke-direct {p0}, Lcom/paul/test/a;->d()V
    :cond_b
    const/4 v0, 0x0
    invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
    invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
    move-result v0
    return v0
.end method

认真一看,就知道:
# static fields            定义静态变量的标记
# instance fields        定义实例变量的标记
# direct methods      定义静态方法的标记
# virtual methods      定义非静态方法的标记
 
以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:
    :cond_8
    invoke-direct {p0}, Lcom/paul/test/a;->d()V
调用st.a的d()方法
不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程:
    :cond_b
    const/4 v0, 0x0
    invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
    invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
    move-result v0
 
大概意思就是调用st.a的setPressed方法,然后再调用父类View的onKeyUp方法
最后 return v0
      该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。