丫的,爷搞企业安全的跑来搞android,被忽悠,那就既来之则安之吧,开始学习,大家勿喷。
0x0 行外汉对android的理解
android应用使用java来开发的,java代码在java虚拟机上运行,java虚拟机是基于栈执行的,其实是在运行期栈上对java字节码文件的解释执行,这个过程需要不断的进行读内存操作(读字节码文件),
性能较高级语言要低很多,android的app的davik虚拟机是基于寄存器方式执行的,此外还引入了jit做热点代码块优化,直接将热点代码块转换为机器指令执行,以提高性能,但为什么只做“热点代码块”的优化呢?可否对所有的字节码(smali)进行jit,转换为字节码文件呢?答案是不可以的,有以下原因:
1)jit后代码块膨胀,需要更多的存储空间。
2)最整个程序做jit的是慢,在用户打开一个应用是对这个程序做jit,这个时间是用户无法忍受的(全部代码做jit适合于那种对打开程序到程序正常运行所需时间要求不是很高,且程序启动后运行时间很长的场景)
每个android app运行在一个独立的虚拟机里面,其实就是一个独立的上下文环境,上下文中维护者对于的寄存器信息,pc信息,栈信息,等等。
下面真正开始学习
0X1 Android启动过程