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_PUBLIC0x00010000 0000 0000 0001是否public
ACC_PRIVATE0x00020000 0000 0000 0010是否private
ACC_PROTECTED0x00040000 0000 0000 0100是否protected
ACC_STATIC0x00080000 0000 0000 1000是否static
ACC_FINAL0x00100000 0000 0001 0000是否final
ACC_VOLATILE0x00400000 0000 0100 0000是否volatile
ACC_TRANSIENT0x00800000 0000 1000 0000是否transient
ACC_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");
		}
	}

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值