Android Framework Dalvik JIT等介绍

Android 系统的深入介绍

PPT中详细介绍了Dalvik VM 的工作原理,Dalvik JIT的工作原理,以及android 一些framework的大致结构。


公司内部做过一次培训,感觉还不错,共享出来,希望有所帮助


PPT上传到资源服务器上了,

http://download.csdn.net/detail/rfeimin/4678157


Dalvik vm
Android 所有应用使用 java 语言基于 VM ,类似 j2me ,
这种架构确保了应用跨平台性。 Android 统一了各式各
样的硬件平台。 (linux 可以抽象硬件层,但是不够好,不同的的
cpu ,不同的 gcc 都不能通用 )
* 下个机会有可能是 web app 跨平台更强,但是现在的效果不理想就像当
年的 savaje j2me 。


Dalvik 是 android 基础  Dalvik VM
层,主要包含两块:
dex 解析、 JIT 编译器、
dalvik vm 和 libcore
bytecode 解释器 ...
基础 java 库

LibCore
java 核心库,大部分代码为
sun 代码, android 使用这
些功能
java.lang java.io java.awt
java.beans javax.net
javax.sql ......



Dalvik VM - bytecode

dalvik 和 jvm 类似,也
有自己的指令集—
bytecode(dalvik/docs/dalvik-
bytecode.html) 共 230 个左右

基于寄存器的虚拟
机:减少指令数,部分减
少内存访问,内存会增加。
( 相比于基于栈的 vm ,速度应该没
有明显优势,速度优化仍然主要靠
jit)
public int Main2(intA,intB)
{
int vA;
int vB;
vA = A;
vB= A*2 + B;
return vA+vB;
}



Dalvik 寄存器 VM ?
move vA, vB
A: destination register (4 bits)
B: source register (4 bits)
1:000448:com.TestAA.TestAA.Main2:(II)I
0000:[0140] move v0, v4 // 变量 A 赋值 vA
0001:[da02 0402] mul-int/lit8 v2, v4, #int 2//
#02 // reg2 = A * 2
Move the contents of one non-
0003:[9001 0205] add-int v1, v2, v5 //vB = reg2 + B object register to another.
0005:[9002 0001] add-int v2, v0, v1
0007:[0f02] return v2 // return reg 2
寄存器:
reg=0 vA I
reg=1 vB I
reg=2 return value
reg=3 this
Lcom/TestAA/TestAA;
reg=4 A I
reg=5 B I
mul-int vAA, vBB, vCC :
A: destination register or pair (8 bits)
B: first source register or pair (8 bits)
C: second source register or pair (8 bits)
Perform the identified binary operation on the two source
registers, storing the result in the first source register.



Jvm 栈 VM ?
Bytecode 指令
0: iload_1 // 参数 A 入操作栈
1: istore_3 // 将栈顶保存到 局部变量 3
2: iload_1 // 参数 A 入操作栈
3: iconst_2 // 常數 2
4: imul // 栈顶数相乘 出栈 result 入栈
5: iload_2 // 参数 B 入栈
6: iadd // 栈顶数相加 出栈 result 入栈
7: istore 4 // 将栈顶保存到 局部变量 4
9: iload_3 // 局部变量 3 入操作栈
10: iload 4 // 局部变量 4 入操作栈
12: iadd // 栈顶数相加 出栈 result 入栈
13: ireturn // 栈顶返回



Dalvik JIT
两种即时编译技术:
AOT JIT

JIT ( Just In Time )
最开始指在执行前编译,但是到现在已经发
展成为,一开始解释执行,只有被多次调用
的程序段才被编译,编译后存放在内存中,
下次直接执行编译后的机器码
AOT ( Ahead Of Time )
在程序下载到本地时就编译成机器码,并存
储在本地存在硬盘上,以加快运行程度,用
此种方式,可执行的程序会变大四五倍

JIT : 80 - 20 理论基础的 vm 优
化技术,认为 20% 代码占用了
80% 时间,优点是内存资源占用
小,运行期间可优化。但是在运行
中会耗费编译时间,且运行速度会
变化。
JIT 也分为两种方式, dalvik 使用第二种
,第一种在后期也会支持。
1)method 方式:以函数或方法为单位进行编

2) trace 方式:以 trace 为单位进行编译(可
以把循环中的内容作为单位编译)



JIT 如何工作
JIT Compiler:
dalvik offset: 0x0000 @ const/4
: 0x2d31d4e6 (0002)[0320]: mov r0, #3
dalvik offset: 0x0001 @ const/4
: 0x2d31d4e8 (0004)[0521]: mov r1, #5
dalvik offset: 0x0002 @ add-int/2addr
: 0x2d31d4ea (0006)[021c]: mov r2, r0
: 0x2d31d4ec (0008)[5318]: add r3, r2, r1
dalvik offset: 0x0003 @ return-void
: 0x2d31d4ee (000a)[6960]: str r1, [r5, #4]
: 0x2d31d4f0 (000c)[2b60]: str r3, [r5, #0]
: 0x2d31d4f2 (000e)[fff7]: blx_1 0x2d31d028
: 0x2d31d4f4 (0010)[9aed]: blx_2 see above
: 0x2d31d4f6 (0012)[f5e7]: b
0x2d31d4e4
编译过程中重点概念 :
MIR 数据: MIR 更接近于 android bytecode ,
进行简单分类,确定格式
LIR 数据: LIR 更接近于机器码,确定指令类
型,所使用的 CPU 资源
整体编译过程: dvmCompileMethod(&meth,
&info, pCode);
第 1 步 将 MIR Compiler 为 LIR
dvmCompilerMIR2LIR(&cUnit);
第 2 步 将 LIR 最终转化为 Cpu 指令
dvmCompilerAssembleLIR(&cUnit, info);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值