小虾米资讯
AD1android:smali基础语法
2020-12-22 17:50:27 / 我要吐槽AD2
一.Smali含义Smali是Davlik的寄存器语言,语法上和汇编语言类似. Davlik是基于寄存器的,就是说smali里的所有操作都必须经过寄存器来进行.二.Smali基本类型B—byte C—char D—double F—float I—int S—short V—void J—long Z—boolean三.Smali引用类型[XXX ----> array 数组eg:int[] ---> [ILxxx/yyy ----> object 对象格式为 LpackageaName/objectNameeg:String str --->str Ljava/lang/String;LpackageaName/objectName$subobjectName 内部类四.Smali函数格式:Func-Name (Para-Type1Para-Type2Para-Type3…)Return-Type 注意: 参数之间没有任何分隔符,返回值在最后eg:void fun() —> fun()Vboolean fun(int,int,int) —>fun(III)ZString fun(boolean, int[], int[], String, long)—>fun(Z[I[ILjava/lang/String,J)Ljava/lang/String五.Smali基本语法.field private isFlag:z 定义变量.method 方法.parameter 方法参数.prologue 方法开始.line123 此方法开始于123行invoke-super 调用父函数const/high16 v0,0x7fox 把0x7fox的值赋值给v0invoke-direct 调用函数return-void 函数返回void.end method 函数结束new-instance 创建实例iput-object 对象赋值iget-object 调用对象invoke-static 调用静态函数.class public Lcom/disney/WMW/WMWActivty; 类名.super Lcom/XXX/XXX/XXX; 父类名.source “XXX.java” 源文件名.implements Lcom/XXX/XXX/XXX; 实现了接口.annotation 内部类六.Smali局部变量本地寄存器 (local register, 非参寄存器)常用v开头数字结尾的符号表示 v0,v1,v2…参数寄存器 (parameter regisgter)常用p开头数字结尾的符号来表示 p1,p2,p3….register 用来标明方法中寄存器的总数,即参数寄存器和非参寄存器.local 标明在这个函数中最少要用到本地寄存器的个数,出现在方法第一行.七.Smali条件语法if-eq vA,vB,:cond_** 如果vA等于vB则跳转到:cond_**ne 不等于lt 小于le 小于等于gt 大于ge 大于等于eqz 等于0nez 不等于0ltz 小于0gez 大于等于0gtz 大于0lez 小于0八. Smali的包信息1 - .class public Lcom/aaa; 2 - .super Lcom/bbb;3 - .source "ccc.java"说明- 1 是com.aaa 这个package下的一个类- 2 继承自 com.bbb这个类- 3 是由 ccc.java这个类编译得到的smali文件九. Smali函数分析类型1 smali中的函数和成员变量一样也分为两种:2 - direct- virtual(1) direct method 就是 private 函数.(2)其余的public 和 protected 函数都属于 virtual method.eg:invoke-direct,invoke-virtual,invole-staticinvole-XXX/range (参数大于等于5个时候调用的指令)1.invoke-static- 用于调用static 函数 - eg: invoke-static{},Lcom/aaa;->CheckSignature()Z - static后面的一对大括号{},实际就是调用该方法的实例 + 参数列表, 由于方法即不需要参数也是static, 所以{}为空. - eg: const-string v0,"NDKLIB" invoke-staticP{v0},Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V- static void System.loadLibrary(String) 来加载 NDK编译的so库用的方法, 就是说这里的v0 就是参数"NDKLIB"2. invoke-super- 用于调用父类方法用的指令, 一般用于onCreate,onDestory等方法3. invoke-direct- 调用private 函数- eg: invoke-direct{p0},Landroid/app/TabActivity;-><init>()V- 这里init()就是定义在TabActivity中的一个private函数4. invoke-virtual- 用于调用protectd或 public函数, 同时要注意修改smali时候不要错用invoke-direct或 invoke-static- eg:sget-object v0,Lcom/ddd;->bbb:Lcom/ccc;invoke-virtual{v0,v1},Lcom/ccc;->Message(Ljava/lang/Object;)V- v0 就是 bbb:Lcom/ccc- v1 就是 Ljava/lang/Object参数5. invoke-xxx/range- 当方法的参数大于等于5个时候,需要在后面加上 "/range", range表示范围,使用方法也与以上不同- eg:invoke-direct/range{v0..v5},Lcom/pb/ui/TestActivity;->h(ILjava/lang/String,Ljava/lang/String;Landroid/content/intent;I)Z- 表示需要传递v0到v5 一共6个参数,大括号里的参数采用省略形式, 且需要连续6. Smali 中函数返回结果的操作- Smali中需要分开来表示调用函数和返回函数结果- 如果调用的函数返回非void, 还需要move-result(返回基本数据类型)和move-result-object(返回对象)指令:- eg:const-string v0,"Eric"invoke-static{v0},Lcom/pbi;->t(Ljava/lang/String;)Ljava/lang/String;move-result-object v2;- 这里 v2保存的就是调用t方法返回的字符串- 上一篇: 亲们!苹果7P所说的防水功能根本就是假的!虚假宣传
- 下一篇:Android开发前后端交互
Powered By © 小虾米资讯 2015
(本站部分文章来源于网络或网友爆料,不代表本站观点,如有侵权请联系及时删除 )