理论教育 更好的理解和优化DEX文件

更好的理解和优化DEX文件

时间:2023-06-19 理论教育 版权反馈
【摘要】:对于Android DEX文件进行优化,需要注意的一点是DEX文件的结构是紧凑的,但是我们想要进行提高程序的运行速度,就仍然需要对DEX文件进行进一步的优化。优化后的文件大小会有所增加,应该是原Android DEX文件的1~4倍。对于非预置的应用来说,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。而后通过工具软件dx把所有的字节码文件转成Android DEX文件。

更好的理解和优化DEX文件

DEX即Android Dalvik执行程序,Google在新发布的Android平台上使用了自己的Dalvik VM来定义。这种虚拟机执行的并非Java字节码,而是另一种字节码:DEX格式的字节码。在编译Java代码之后,通过Android平台上的工具可以将Java字节码转换成DEX字节码。这个Dalvik VM针对手机程序程式的CPU进行了优化处理,可以同时执行许多VM,而不会占用太多资源。

对于Android DEX文件进行优化,需要注意的一点是DEX文件的结构是紧凑的,但是我们想要进行提高程序的运行速度,就仍然需要对DEX文件进行进一步的优化。

调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域,验证DEX文件中的所有类,对一些特定的类进行优化,对方法里的操作码进行优化。优化后的文件大小会有所增加,应该是原Android DEX文件的1~4倍。优化发生的时机有两个:

(1)对于预置应用来说,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的Android DEX文件。

(2)对于非预置的应用来说,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。(www.daowen.com)

所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。

Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个Android应用程序,Zygote就会fork出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化、库的加载、预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时。Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,和Java SE一样,编译时使用Sun JDK将Java源程序编程成标准的Java字节码文件(.class文件)。

而后通过工具软件dx把所有的字节码文件转成Android DEX文件。最后使用Android aapt工具将DEX文件、资源文件、AndroidManifest.xml文件(二进制格式)组合成一个应用程序包(APK)。应用程序包可以被发布到手机上运行。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈