Smali从入门到精通(一)之初步认识Smali

转载请声明出处:https://blog.csdn.net/YoYo_Newbie/article/details/90745115

官方吐槽:什么是Smali

smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。

修改Smali文件有什么作用?

通过修改使用工具将Apk反编译生成的smali文件,可以重新生成新的Apk进行使用。

怎么得到Smali文件?

通过反编译Java,生成Smali(可以使用apktool工具可进行反编译), 如xx.Test.java 反编译==> xx.Test.smali

实践分析

构建一个包名为csdn.yoyo_newbie.smalianalyzesampleTest.java文件

package csdn.yoyo_newbie.smalianalyzesample;
public class Test {
    public Test(){
        super();
    }
}

使用apktool进行反编译生成的Smali文件:

csdn\yoyo_newbie\smalianalyzesample\Test.smali

.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"


# direct methods
.method public constructor <init>()V
    .locals 0
****
    .prologue
    .line 5
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 6
    return-void
.end method

如下,第一行 ,代表声明一个public的class ,它的className为"csdn.yoyo_newbie.smalianalyzesample.Test.class",
其中L代表是对象类型

.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test

第二行,代表它继承的父类为 java.lang.Object.class

.super Ljava/lang/Object;

第三行,代表这个csdn.yoyo_newbie.smalianalyzesample.Test.class来自Test.java个文件

.source “Test.java”

为什么还要声明来自哪里,一定就是Test.java这个文件无疑,不是多此一举吗?一开始我也是这样想的,当我深思后才恍然大悟,不是有内部类吗?请看下面代码


package csdn.yoyo_newbie.smalianalyzesample;

public class Test {
    public Test(){
        super();
    }

    public static class Show{

    }
}

编译后,会生成2个文件

csdn\yoyo_newbie\smalianalyzesample\Test.smali

.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"
................... 此处省略其他代码

csdn\yoyo_newbie\smalianalyzesample\Test$Show.smali


.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test$Show;
.super Ljava/lang/Object;
.source "Test.java"

...................  此处省略其他代码


有没有发现!内部类Show的.Source的值也是Test.java.

本次内容,就到这里,下面的代码暂时不讲解,将在下一篇分析。

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值