android的DEX文件和APK 加载
来源:互联网 发布:java method是什么 编辑:程序博客网 时间:2024/05/17 04:17
2.6.2 DEX 文件和APK 加载
在Android 中,对编译出来的DEX 字节码和APK 文件的加载过程,也进行了尽可能的优化。
对于预置应用,Android 会在系统编译后,生成优化文件,以ODEX 后缀结尾,这样在发布时除APK 文件(不包含DEX)外,还有一个相应的ODEX 文件。
对于非预置应用,运行前,Android会优化DEX文件,在第一次启动应用时,执行文件的DEX被优化成DEY文件并放在/data/dalvik-cache目录。如果应用的APK文件不发生变化,DEX 文件不会被重新生成,加快了以后的启动速度。APK 文件的加载过程如图2-15 所示。
图2-15 APK加载
DEX 文件由header、string_ids、type_ids、proto_ids、field_ids、method_ids、class_defs、data 等几部分构成。图2-16 显示了这几部分内容在DEX 文件中的布局。图2-16 DEX格式在Java 中,每一个类会被编译成相应的CLASS 文件,一个应用会定义若干个类,这就导致同一个应用的多个CLASS 文件中会存在冗余信息,而在Android 中,“dx”工具会将同一个应用的所有CLASS文件内容整合到一个DEX文件中,这样就减小了整体的文件尺寸,I/O 操作也提高了类的查找速度。“dx”工具整合CLASS文件的过程如图2-17 所示。
图2-17 “dx”工具整合CLASS 文件的过程原来每个CLASS文件中的常量池,在DEX 文件中由一个常量池来统一管理,具体如图2-18 所示。
图2-18 DEX的常量池具体到DEX 文件,经过“dx”工具优化后的内部逻辑如图2-19 所示。
图2-19 DEX的内部逻辑
2.6.3 虚拟机和平台实现
在虚拟机和原生库层面,Android同样进行了很多的优化。
1.虚拟机
虚拟机中指令的解释时间主要分为3 个方面:分发指令、访问运算数、执行运算。其中“分发指令”这个环节对性能的影响最大,为了加快运行速度,必须提高分发指令的速度。
与传统的Java 虚拟机基于栈不同,Dalvik是基于寄存器的。基于寄存器的虚拟机实现,虽然在硬件通用性上稍逊一筹,但是数据处理速度却有明显的改善,可以更为有效地减小冗余指令的分发和减小内存的读写访问。
Dalvik虚拟机针对移动终端所做的优化,使得其不需要很快的CPU速度和大量的内存空间。根据Google 的测算,Android的早期版本只需要64MB 的RAM 即可使系统正常运转,其中24MB被用于底层系统的初始化和启动,另外20MB被用于高层启动、高层服务。当然,随着Android版本的不断升级和应用功能的扩展,Android对内存的消耗也在逐渐增加。
另外需要注意的是,Dalvik并不是按照Java 虚拟机的规范来实现的,两者并不兼容。
Java 虚拟机运行的是Java 字节码,而Dalik 虚拟机运行的则是其专有的DEX(DalvikExecutable)字节码。
在Java SE 程序中的Java 类会被编译成一个或者多个字节码文件(.class),然后打包成JAR文件。在执行期间,Java 虚拟机会从JAR文件抽取相应的CLASS文件并从中读取指令和数据。而Android虽然也是基于Java语言进行编程的,但是在编译成CLASS文件后,Android会通过“dx”工具将应用所有的CLASS 文件转换一个DEX 文件,接着将DEX 和应用的其他如资源文件等一起打包构成APK 文件,而后Dalvik 虚拟机会从其中读取指令和数据。图2-20 显示了Android的编译过程。
图2-20 Android的编译过程Dalvik 虚拟机的主要特征包括:专有的DEX 字节码、支持新的操作码、文件结构非常简洁、使用等长的指令、借以提升解析速度、尽量扩大只读结构的大小、借以提高跨进程的数据共享比例。
2.平台优化
充分挖掘CPU的性能,针对armv5te进行了优化,充分利用armv5te的执行流水线来提高执行的效率。
3.C库
优化和裁剪的libc 库Bionic,具有更高的效率、低内存占用、非常快和小的线程实现、内置了对Android特有服务的支持等特点。
4.创建进程
Linux 在创建一个新进程时利用了写时拷贝(Copy-on-Write)机制,使得创建一个新的进程非常高效。Android 中每个进程都是基于虚拟机的,并且也要加载基本的库,实际上这些都是可以共享的。基于这方面的考虑,Andoid引入了写时拷贝机制,使得Android启动一个新的进程,实际上并不消耗很多的内存和CPU资源。
另外,Android在后台一直有个Zygote 虚拟机在运行,实际上是一个虚拟机实例的孵化器。如果要启动一个新的应用,Zygote就会创建出一个新的子进程来执行该应用程序,十分高效。图2-21 显示了Zygote创建子进程的过程。
图2-21 Zygote创建子进程Android在开机过程中,会首先启动Zygote虚拟机而不是系统服务器(System Server),也是出于利用写时拷贝机制创建进程比较高效的考虑。Zygote虚拟机在启动后会完成虚拟机的初始化、库的加载、预置类库的加载和初始化等操作。并在系统需要一个新的虚拟机对象时,Zygote可以通过写时拷贝机制高效地创建出新的虚拟机对象。
5.渲染机制
在进行渲染时,Android 会根据变化的部分进行局部更新,并不是每次都需要重绘整个屏幕。首先计算需要重绘的区域(mInvalidRegion),如果DisplayHardware:: UPDATE_ON_DEMAND ,则通过设定需要重绘的区域的边界来进行局部重绘。
- android的DEX文件和APK 加载
- DEX 文件和APK 加载
- Android动态加载jar,dex,apk文件
- android中apk/dex的动态加载
- android APK加固篇-1. 动态加载的Dex文件的生成
- Android系统中的.apk文件和dex文件
- Android系统中的.apk文件和.dex文件
- Android系统中的.apk文件和dex文件
- Android系统中的.apk文件和dex文件
- Android系统中的.apk文件和dex文件
- Android系统中的.apk文件和dex文件
- android APK加固篇-2.动态加载dex及dex的方法的调用
- dex2jar反汇编android的dex/APK文件为jar包命令和方法
- android 动态加载jar/dex/apk
- Android动态加载jar/dex/apk
- Android的Apk文件结构与反编译dex
- android逆向之多dex(multiDex)文件apk的逆向
- android APK加固篇-3.使用JNI加载dex和调用方法
- Gentoo更新后GCC无法使用的解决办法
- IOS开发调用系统相机和打开闪光灯
- 同样的一辈子,不同的结果!
- Mac OS 和 iOS 操作系统架构
- Mac下Cocos2d和Cocos2d-x安装
- android的DEX文件和APK 加载
- Mac下WorkPress平台的安装与搭建
- iOS - 判断输入字符串长度函数
- iOS开发之property属性介绍
- 数据结构学习之斐波那契数列
- volatile bool引发的知识点
- 【转】简明 Vim 练级攻略
- CXF 中自定义SOAPHeader
- PHP对MYSQL数据库进行事务处理及表锁定