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

参考文献: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_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");
		}
	}

}




你可能感兴趣的:(安卓android,JAVA)