基础知识之Smali-代码篇(2)

Smali-java变量定义对照
java:

点击查看代码
byte _byte=127;
short _short=888;
int _int=1234;
long _long=786565455;
float _float=347823.99f;
double _double=6875654564.121;
char _char='易';
boolean _bool=true;
Smali:
点击查看代码
const/16 v1, 0x7f
.local v1, "_byte":B
 
const/16 v3, 0x378
.local v3, "_short":S
 
const/16 v6, 0x4d2
.local v6, "_int":I
 
const-wide/32 v4, 0x2ee2094f
.local v4, "_long":J
 
const v7, 0x48df8c00
.local v7, "_float":F
 
const-wide v8, 0x41f99d229a41ef9eL
.local v8, "_double":D
 
const/16 v2, 0x6613
.local v2, "_char":C
 
const/4 v0, 0x1
.local v0, "_bool":Z

const/16 V1,0x7f :意思是0x7f放入V1寄存器,占用16位字节;.local v1, "_byte":B:意思是寄存器V1别名命名为_byte,数据类型为B(其他语句逻辑类似)

类声明
格式:.class+权限修饰符+类名
java:

public class Test implements CharSequence{
}

Smali:
声明类和继承父类(可以+接口+反编译标识)

点击查看代码
.class public LTest;    #声明类(不可省略)
.super Ljava/lang/Object;    #声明该类所继承的父类,同Java,若没有指定其他父类,则所有类的父类都是Object(不可省略)
.implements Ljava/lang/CharSequence;    #若该类实现了接口,则添加该代码(视情况可省略)
.source "Test.java"    #反编译的过程中自动生成的标识该smali类对应的java源码类的标识,无实际作用(可省略)
在Smali中定义一个类时必须将该类所有的信息完整表现,且该类的类名、继承的类名、实现的类名都要用L+全类名路径+分号的格式给出,以上Test类若非定义与根目录而是定义于com.temp包内,则全类名要用Lcom/temp/Test;的格式

函数声明
.method 权限修饰符+静态修饰符+方法名(参数类型)返回值类型
#方法体
.end method

Smali-java对照

java
public class Test #(类)
{
public static void getName(){} #(函数)
}

Smali

点击查看代码
.class public LTest;
.super Ljava/lang/Object;
.source "Test.java"
 
.method public static getName()V
    return-void
.end method
在Smali中的函数不以大括号结束而以.end method结束。且即使返回值为void也必须使用return-void进行返回

带参带返回值示例:

点击查看代码
java:
public class Test
{
    public static String getName(String a,int b){
        return "hello"
    }
}
Smali:
.class public LTest;
.super Ljava/lang/Object;
.source "Test.java"
 
.method public static getName(Ljava/lang/String;I)Ljava/lang/String;
    const-string v0, "hello"
    return-object v0
.end method
posted @ 2025-04-11 09:58  小yangzz  阅读(69)  评论(0)    收藏  举报