网站关键词的作用,电子商务网站建设背景,国家icp备案网站,北京网站优化推广方案提示#xff01;应用程序的安装有两种情况#xff0c;第一#xff1a;首次启动系统时安装#xff1b;第二#xff1a;系统启动完成后安装。本篇博文基于第一种安装场景。在系统首次启动的场景中#xff0c;系统会对/system/app、/system/priv-app、/data/app目录下的所有… 提示应用程序的安装有两种情况第一首次启动系统时安装第二系统启动完成后安装。本篇博文基于第一种安装场景。在系统首次启动的场景中系统会对/system/app、/system/priv-app、/data/app目录下的所有APK进行dex字节码到本地机器码的翻译同样也会对/system/framework目录下的APK或者JAR文件以及这些APK所引用的外部JAR进行dex字节码到本地机器码的翻译。这样可以保证除了应用之外系统中使用Java来开发的系统服务也会统一地从dex字节码翻译成本地机器码。详细内容请移步老罗的博客Android ART运行时无缝替换Dalvik虚拟机的过程分析。 一、JVM、DVM、ART虚拟机了解 JVM虚拟机运行的是java字节码 java-java bytecode(class)-java bytecode(jar) 注java虚拟机基于栈基于栈的机器必须使用指令来载入和操作栈上的数据所需指令相对来说比较多。 Dalvik虚拟机解释执行的dex字节码 java-java bytecode(class)-dalvik bytecode(dex) 注相对JVMDalvik基于寄存器且经过优化并允许有限的内存中同时运行多个虚拟机实例每个Dalvik应用作为一个独立的Linxu进程执行。如果一个应用中有很多类编译后会相应生成很多class文件class文件之间也会有不少冗余信息dex格式文件把所有classs文件内容整合到一个文件这样可以减少整体文件占用IO操作同时也提高了类的查找速度。此外dex格式文件增加了新的操作码支持文件结构也相对简洁使用等长的指令来提高解析速度。而且dex文件会尽量扩大只读结构的大小来提高进程间数据共享的速度。 ART虚拟机执行的本地机器码 java-java bytecode(class)-dalvik bytecode(dex)-optimized android runtime machine code(oat) 注ART所使用的AOT(Ahead-Of-Time)编译在应用首次安装时字节码预编译成机器码存储在本地也就是说在程序运行前编译。而Dalvik是典型的JIT(Just_In_Time)此模式下应用每次运行的时候字节码都需要即时编译器转换为机器码再执行也就是在程序运行时编译。因此在App运行时ART模式相对于Dalvik省去了解释字节码的过程占用内存也相应减少进而提高App的运行效率。 二、Odex 从上面一节中我们知道在编译打包APK时Java类会被编译成一个或者多个字节码文件(.class)通过dx工具CLASS文件转换成一个DEX(Dalvik Executable)文件。 通常情况下我们看到的Android应用程序实际上是一个以.apk为后缀名的压缩文件。我们可以通过压缩工具对apk进行解压解压出来的内容中有一个名为classes.dex的文件。那么我们首次开机的时候系统需要将其从apk中解压出来保存在data/app目录中。 如果当前运行在Dalvik虚拟机下Dalvik会对classes.dex进行一次“翻译”“翻译”的过程也就是守护进程installd的函数dexopt来对dex字节码进行优化实际上也就是由dex文件生成odex文件最终odex文件被保存在手机的VM缓存目录data/dalvik-cache下(注意这里所生成的odex文件依旧是以dex为后缀名格式如systempriv-appSettingsSettings.apkclasses.dex)。 如果当前运行于Art模式下 Art同样会在首次进入系统的时候调用/system/bin/dexopt工具来将dex字节码翻译成本地机器码保存在data/dalvik-cache下。 那么这里需要注意的是无论是对dex字节码进行优化还是将dex字节码翻译成本地机器码最终得到的结果都是保存在相同名称的一个odex文件里面的但是前者对应的是一个dey文件(表示这是一个优化过的dex)后者对应的是一个oat文件(实际上是一个自定义的elf文件里面包含的都是本地机器指令)。通过这种方式原来任何通过绝对路径引用了该odex文件的代码就都不需要修改了。 由于在系统首次启动时会对应用进行安装那么在预置APK比较多的情况下将会大大增加系统首次启动的时间。从前面的描述可知既然无论是DVM还是ART对DEX的优化结果都是保存在一个相同名称的odex文件那么如果我们把这两个过程在ROM编译的时候预处理提取Odex文件将会大大优化系统首次启动的时间。 三、预编译提取Odex 在BoardConfig.mk中定义WITH_DEXPREOPT : true。打开这个宏之后无论是有源码还是无源码的预置apk预编译时都会提取odex文件。 不过这里需要注意的是打开WITH_DEXPREOPT 宏之后预编译时提取Odex会增加一定的空间预置太多apk会导致system.img 过大而编译不过。遇到这种情况可以通过删除apk中的dex文件、调大system.img的大小限制或在预编译时跳过一些apk的odex提取。 例如跳过helloworld应用提取的方法如下 在目录uildcoredex_preopt_odex_install.mk中添加红色标记的代码 ifeq ($(LOCAL_MODULE),helloworld) LOCAL_DEX_PREOPT: endif build_odex: installed_odex: .... helloworld可替换为需要跳过提取odex的apk的LOCAL_MODULE名字如Settings等。