这一篇文章是smali的入门教程
打开 notepad++ (怎样识别smali语法在另一片文章里介绍)
输入以下代码 :
.class public LHelloWorld; .super Ljava/lang/Object; .method public static main([Ljava/lang/String;)V .registers 2 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; const-string v1, "Hello World!" invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V return-void .end method
java -jar smali.jar -o classes.dex HelloWorld.smali (关于smali的介绍在另一片文章里有)
zip HelloWorld.zip classes.dex
adb push HelloWorld.zip /sdcard/
adb shell dalvikvm -cp /adcard/HelloWorld.zip HelloWorld
代码解释:
.class public LHelloWorld;
定义一个 HelloWorld 类 L在java 里表示reference 类型
.super Ljava/lang/Object;
继承了Object 类,写java 代码时一般不需要显示的定义,但在.class .dex 或者smali编程时都是显示的表示(不要觉的麻烦,去适应它)
.method public static main([Ljava/lang/String;)V
V 表示返回值是void, [表示一个数组, 那么在这里是String数组,
.registers 2 申请2个 virtual registers
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
把System类里的 out变量赋值给v0, 相当于System.out
const-string v1, "Hello World!"
给v1赋值 Hello World! 字符串 , 相当于 a = "Hello World!"
invoke-virtual {v0, v1} ,LJava/io/PrintStream;->println(Ljava/lang/String;)V
调用println()方法, v0 是 System.out, v1是“Hello WOrld!” 作为 println的第一个参数,记住指令集的第2个参数就是对应方法的第一个参数,以此类推。相当于 System.out.println("Hello World!");
原文 : http://code.google.com/p/smali/source/browse/examples/HelloWorld/HelloWorld.smali