smali语法中的访问标记(accessflags)

来源:互联网 发布:java密码正则表达式 编辑:程序博客网 时间:2024/05/06 17:28

参考文献:Java字节码.class文件案例分析(http://blog.csdn.net/silentbalanceyh/article/details/42640739)

SMALI在整个互联网我看到的教程是少之又少,一般学过java的人才好理解里面代码的含义,当然了不排除那种长期接触的,不过很多都是不理解里面很多的意思

前几周搞patchrom的时候遇到过,当初研究后也没有写下来,今天搞apk时又遇到了,随便就写下来吧大笑


相关smali代码如下:

.annotation system Ldalvik/annotation/InnerClass;    accessFlags = 0x8    name = "Alarm".end annotation

学过java的都很清楚,一看就知道是声明内部类的,其中:

“accessFlags”是访问标记(下面会说怎么算的以及代表什么)

”name“就是是内部类的名字

我们知道,当内部类在成员位置上时是可以使用关键词的如:static 、final的(java基础不再讨论了)


现在来说下accessFlags在字节码中的计算方式:

access_flags的计算公式为:access_flags = flagA | flagB | flagB ...

java字节码字段访问标志

标志名称标志值二进制值含义ACC_PUBLIC0x00010000 0000 0000 0001是否publicACC_PRIVATE0x00020000 0000 0000 0010是否privateACC_PROTECTED0x00040000 0000 0000 0100是否protectedACC_STATIC0x00080000 0000 0000 1000是否staticACC_FINAL0x00100000 0000 0001 0000是否finalACC_VOLATILE0x00400000 0000 0100 0000是否volatileACC_TRANSIENT0x00800000 0000 1000 0000是否transientACC_SYNTHETIC0x10000001 0000 0000 0000是否由编译器自动产生ACC_ENUM0x40000100 0000 0000 0000是否enum


那么现在可以知道上面代码的0x8是指static class Alarm

假设我把他改成0x10

那么就是指private static class Alarm

2|8=10


看不懂再给个例子:

class反编译后的smali代码:

.annotation system Ldalvik/annotation/InnerClass;    accessFlags = 0x0    name = "inner".end annotation
.annotation system Ldalvik/annotation/InnerClass;    accessFlags = 0x8    name = "inner2".end annotation
.annotation system Ldalvik/annotation/InnerClass;    accessFlags = 0x9    name = "inner3".end annotation


java源代码

public class test {class inner{void echo(){System.out.println("test");}}static class inner2{void echo2(){System.out.println("test");}}public static class inner3{void echo3(){System.out.println("test");}}}




0 0
原创粉丝点击