zoukankan      html  css  js  c++  java
  • (4)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文件差异较大,这个时候需要仔细分析,找到调用的私有方法。然后给合成的方法选取一个未被使用的名字。

  • 相关阅读:
    [内核编程] 串口过滤
    大数问题(高精度运算)
    [内核编程] 实战调试,第一个内核程序
    [内核编程] Windebug双机调试环境搭建
    树状数组
    mysql常用语句
    解决maven工程无法创建src/main/java包名的方法
    java Date中方法toLocaleString过时的替代方案
    Eclipse 无法编译,提示“错误: 找不到或无法加载主类”
    Eclipse如何设置编译文件.class输出路径
  • 原文地址:https://www.cnblogs.com/eustoma/p/8994320.html
Copyright © 2011-2022 走看看