APK的结构
assets文件夹
- 作用:资源目录
- 编译是会产生索引文件
lib文件夹
- 作用:存放so库,又NDK编译得到的,常用使用游戏引擎后JNI native调用工程中。
- so库:??
- JNI native调用工程:??
res文件夹:
- 作用:资源目录
META-INF文件夹
- 作用:存放工程的一些属性文件,如Manifest.MF
- ??
AndroidManifest.xml
- 作用:Android(安卓)工程的基础配置属性文件
- ??
classes.dex
- 作用:Java编译的得到Dalvik VM能直接执行的文件
resources.arsc
- 作用:res目录下资源的一个索引文件,保留了strings.xml文件内容
Dalvik字节码
- 含义:是google为Android(安卓)操作系统开发的一个已深度优化的虚拟机
- 特点:该虚拟机的执行的文件的格式为.dex
- 注:该字节码需要通过工具apkTool和Dex2.jar才能看到底层代码
Smali
含义:.dex的文件的汇编器或反汇报器,实现了.dex格式文件的功能
原始类型
B---byte 字节,计算机存储容量单位
C---char 定义字符型表变量
D---double 双精度浮点型
F---float 单精度浮点型
I---int 整数型
J---long 长整型
S---short 段整型
V---void 无类型
Z---boolean 布尔型
[XXX---array 数组
Lxxx/yyy---object 对象,类
例子解释1
[I 定义整数型数组 [F 定义浮点型数组 |
定义object对象()格式:
LpackageName/objectName;【packageName:包名称;objectName对象名字】
- Ljava/lang/String java.lang包中的String【字符串】对象
smali中引用类:
$
- LpackageName/objectName$subObjectName;【packageName:包名称、objectName对象名字、sub:替换】
例子解释2
1. hello()V 代表:void hello() 2. hello(III)Z 代表:boolean hello(int,int,int) 3. hello (Z[I[ILjava/lang/String;J)Ljava/lang/String; 代表:String hello (boolena int[] int[] Strint long) |
Smali的基本语法
.field private isFlag:z 定义变量
.method 放大
.parameter 方法参数
.prologue 方法开始
.line 123 此方法位于123行
invoke-super 调用父函数
const/high16 v0,0x7fo3 把0x7fo3 赋值给v0
invoke-direct 调用函数
return-void 返回结果void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转分支
- "if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
- "if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**
- "if-It 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-nqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
- "if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
- "if-Itz vA, :cond_**" 如果vA小于0则跳转到:cond_**
- "if-gez vA, :cond_**" 如果vA大于等于0则跳转到:cond_**
- "if-gtz vA, vB, :cond_**" 如果vA大于0则跳转到:cond_**
- "if-lez vA, vB, :cond_**" 如果vA小于等于0则跳转到:cond_*