admin 管理员组

文章数量: 1086864

smali语言详解之字段的声明(变量、常量)

smali语言详解之字段的声明(变量、常量)


一、smali语言的字段声明格式

1.1、非静态变量

.field 权限修饰关键字 变量名:变量类型的全包名路径或与java对应的数据类型关键字

1.2、静态变量

.field 权限修饰关键字 静态修饰关键字 变量名:变量类型的全包名路径或与java对应的数据类型关键字

注意关于静态变量初始化赋值问题,详见博客:smali语言详解之static静态代码块的声明与静态变量初始化赋值位置

1.3、常量

注意当常量值为数字时需用16进制表示

.field 权限修饰关键字 静态修饰关键字 final 常量名:常量类型的全包名路径或与java对应的数据类型关键字 = 常量的值

1.4、smali与java之间基本数据类型的对应关系

smalijava
Bbyte
Sshort
Iint
Jlong
Ffloat
Ddouble
Cchar
Zboolean
Vvoid
[数组
L+全类名路径用/分隔,以分号结尾object(对象和类)

二、示例

java完整代码如下

package com.ylw.helloworld;public class Test {private static final String STR = "hello"; //常量private static final int TAKE_PHOTO = 1; //常量private static int a;private int b;private int[] c;private String d;private String[] e;
}

对应的smali完整代码如下

.class public Lcom/ylw/helloworld/Test;#(此行不可删)Lcom/ylw/helloworld/Test;为类的全包名路径,根据实际情况有所不同
.super Ljava/lang/Object;#(此行不可删)声明父类,当没有使用extends写明继承时,默认继承Object类
.source "Test.java"#(此行可删)#表示此smali代码对应的java源码文件# static fields#自动生成的注释,表明以下为静态字段,可以看出final常量需要额外用等于号赋值
.field private static final STR:Ljava/lang/String; = "hello".field private static final TAKE_PHOTO:I = 0x1.field private static a:I# instance fields#自动生成的注释,表明以下为实例字段
.field private b:I.field private c:[I.field private d:Ljava/lang/String;.field private e:[Ljava/lang/String;#以下内容为无参构造,与本文章内容无关,不做解释
# direct methods
.method public constructor <init>()V.registers 1.prologue.line 3invoke-direct {p0}, Ljava/lang/Object;-><init>()Vreturn-void
.end method

本文标签: smali语言详解之字段的声明(变量常量)