Smali系列学习之Smali语法详解内部类

Posted eustoma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Smali系列学习之Smali语法详解内部类相关的知识,希望对你有一定的参考价值。

在这一节,我们来介绍一下内部类。对于Java文件中的每一个内部类,都会产生一个单独的smali文件,比如ActivityThread$1.smali。这些文件的命名规范是如果是匿名内部类,则命名规则是外部类+$+数字,否则的话是外部类+$+内部类的名字。
    
当在内部类中调用外部类的私有方法时,编译器会自动合成一个静态函数。比如下面这个类:
public class  Hello {
    public class  A {
        void  func() {
            setup();
        }
    }


    private void  setup() {
    }
}


我们在内部类A的func方法中调用了外部类的setup方法,最终编译的smali代码为:
Hello$A.smali文件代码片段:
# virtual methods
.method func()V
    .locals 1

    .prologue
    .line 5
    iget-object v0, p0, LHello$A;->this$0:LHello;

    #calls: LHello;->setup()V
    invoke-static {v0}, LHello;->access$000(LHello;)V

    .line 6
    return-void
.end method

Hello.smali代码片段:
.method static synthetic access$000(LHello;)V
    .locals 0
    .parameter

    .prologue
    .line 1
    invoke-direct {p0}, LHello;->setup()V

    return-void
.end method


可以看到,编译器自动合成了一个access$000方法,假如当我们在一个较复杂的内部类中加入了一个对外部类私有方法的调用,虽然只是导致新合成了一个方法,但是这些合成的方法名可能都会有变化,这样的结果就是smali文件差异较大,这个时候需要仔细分析,找到调用的私有方法。然后给合成的方法选取一个未被使用的名字。

以上是关于Smali系列学习之Smali语法详解内部类的主要内容,如果未能解决你的问题,请参考以下文章

Android: samil语法指令集-基于dex文件结构的寄存器虚拟机

JAVA学习之局部内部类,匿名内部类,静态内部类

smali怎么修改

smali 语言语法

jvm系列学习之--Java的类加载机制

Smali语法