我的文章分享

java smali语法
首页 > Android 2016年10月15日 字号:

最近在给lg f460 移植MIUI8,用的是miui官方开源的patchrom 项目,最大的难度在于代码插桩,在网上找到一篇关于插桩java smali的教程,特此分享。


1.基本数据类型

B—byte
C—char
D—double
F—float
I—int
S—short
V—void
J—long
Z—boolean

2.数组和对象

数组的表示方式是在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;
对象类型以L作为开头来表示,格式是Lpackage/ClassName;(用分号表示对象结束是必须的),示例:
String对象在smali中为:Ljava/lang/String;
Class1对象的一个boolean成员表示为:Lcom/disney/Class1;->isRunning:Z
Class1对象的一个String对象成员表示为:Lcom/disney/Class1;->name:Ljava/lang/String;
可以总结为格式为对象类型->成员名:成员类型,->表示所属关系,类型尾部必须包括一个分号。
内部类表示为:Lpackage/ClassName$innerObjectName;,也就是在内部类前加“$”符号。

3.语法

.class public Lcom/disney/WMW/WMWActivity;                  //类名
.super Lcom/disney/common/BaseActivity;                     //父类名
.source "WMWActivity.java"                                  //源文件名
.implements Lcom/burstly/lib/ui/IBurstlyAdListener;         //接口
.annotation
.end annotation                                             //内部类

4.局部变量
本地寄存器(local register,非参寄存器)用v开头数字结尾的符号来表示,如v0、v1、v2、…,
参数寄存器(parameter register)用p开头数字结尾的符号来表示,如p0、p1、p2、…,
.registers 用来标明方法中寄存器的总数,即参数寄存器和非参寄存器的总数。
.local 0,标明在这个函数中最少要用到的本地寄存器的个数,出现在方法中的第一行。在这里,由于只需要调用一个父类的onDestroy()处理,所以只需要用到p0,所以使用到的本地寄存器数为0,在植入代码后不要忘记可能要修改.local的值。
如 .local 4,则可以使用的寄存器是v0-v3。
当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。
在实例函数中,p0代指“this”,p1表示函数的第一个参数,p2代表函数中的第二个参数…,
在static函数中,p1表示函数的第一个参数,p2代表函数中的第二个参数…,因为Java的static方法中没有this方法。

5.函数调用

invoke-static:调用static函数

invoke-super:调用父类方法

invoke-direct:调用private函数

invoke-virtual:用于调用protected或public函数

6.获取函数调用结果

在smali里调用函数和返回函数结果需要分开来完成,在调用的函数返回非void后,用move-result(返回基本数据类型)和move-result-object(返回对象)指令获取返回结果。

示例:

const/4 v2, 0x0 
invoke-virtual {p0, v2}, Lcom/disney/Class1;->getPreferences(I)Landroid/content/SharedPreferences; 
move-result-object v1

上句v1保存的就是调用this.getPreferences(int)方法返回的SharedPreferences实例。

7.条件语句

if-eq vA, vB, :cond_**   如果vA等于vB则跳转到:cond_**
if-ne vA, vB, :cond_**   如果vA不等于vB则跳转到:cond_**
if-lt vA, vB, :cond_**   如果vA小于vB则跳转到:cond_**
if-ge vA, vB, :cond_**   如果vA大于等于vB则跳转到:cond_**
if-gt vA, vB, :cond_**   如果vA大于vB则跳转到:cond_**
if-le vA, vB, :cond_**   如果vA小于等于vB则跳转到:cond_**
if-eqz vA, :cond_**      如果vA等于0则跳转到:cond_**
if-nez vA, :cond_**      如果vA不等于0则跳转到:cond_**
if-ltz vA, :cond_**      如果vA小于0则跳转到:cond_**
if-gez vA, :cond_**      如果vA大于等于0则跳转到:cond_**
if-gtz vA, :cond_**      如果vA大于0则跳转到:cond_**
if-lez vA, :cond_**      如果vA小于等于0则跳转到:cond_**
 您阅读这篇文章共花了: 
[旅游] 重庆
win7+vs2015+opencv2.4.9开发环境配置
标签:,
java smali语法
文章标题: java smali语法
本文地址:http://www.myangs.com/?p=55
版权声明:若无注明,本文皆为本人原创,转载请保留文章出处。