新建一个文件写入以下代码,保存为HelloWorld.smali
可以使用vscode中的smali插件,有语法高亮显示
.class public LHelloWorld; #定义类名
.super Ljava/lang/Object; #定义父类
.method public static main([Ljava/lang/String;)V #声明静态main方法
.registers 4 #程序使用四个寄存器,其中v0,v1,v2寄存器和一个参数寄存器
.prologue #代码起始指令
#空指令
nop
nop
nop
#数据定义指令
const/16 v0,0x8 #v0值为8
const/4 v1,0x5 #v1值为5
const/4 v2,0x3 #v2值为3
#数据操作指令
move v1,v2 #将v2的值赋给v1,即现在v1值为3
#数组操作指令
new-array v0,v0,[I #定义一个长度为8(v0值),Int类型,并将其存入v0中
array-length v1, v0 #获取v0中数组的长度,放到v1中,现在v1为8
#实例操作指令
new-instance v1, Ljava/lang/StringBuilder; #构造一个StringBuilder的新实例,存放到v1中
#方法调用指令
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V #调用实例的直接方法
#跳转指令
if-nez v0, :cond_0 #如果v0不为0,进行:cond_0后面的语句
goto :goto_0
:cond_0
#数据转换指令
int-to-float v2, v2 #将v2中的int类型数据转为float再存入v2
#数据运算指令
add-float v2,v2,v2 #将v2中的float值两倍再放到v2中
#比较指令
cmpl-float v0, v2, v2 #比较v2和v2的值,应该为相等,v0等于0
#字段操作指令
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "HelloWorld" #构造字符串
#方法调用指令
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V #v0 is the "this" instance
#返回指令
:goto_0
return-void
.end method
写入完成后
可以在Android Studio安装目录下的\plugins\smali\lib中找到smali.jar文件。
通过以下语句将smali文件转化为dex文件
java -jar smali.jar -o HelloWorld.dex HelloWorld.smali
然后通过adb将这个文件放入手机的sdcard目录下
adb push HelloWorld.dex /sdcard/
再通过adb执行dex文件
adb shell dalvikvm -cp /sdcard/HelloWorld.dex HelloWorld
最后如果出现写入的字符串“HelloWorld”即为执行成功。