参考文献:Java字节码.class文件案例分析(http://blog.youkuaiyun.com/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_PUBLIC | 0x0001 | 0000 0000 0000 0001 | 是否public |
ACC_PRIVATE | 0x0002 | 0000 0000 0000 0010 | 是否private |
ACC_PROTECTED | 0x0004 | 0000 0000 0000 0100 | 是否protected |
ACC_STATIC | 0x0008 | 0000 0000 0000 1000 | 是否static |
ACC_FINAL | 0x0010 | 0000 0000 0001 0000 | 是否final |
ACC_VOLATILE | 0x0040 | 0000 0000 0100 0000 | 是否volatile |
ACC_TRANSIENT | 0x0080 | 0000 0000 1000 0000 | 是否transient |
ACC_SYNTHETIC | 0x1000 | 0001 0000 0000 0000 | 是否由编译器自动产生 |
ACC_ENUM | 0x4000 | 0100 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");
}
}
}