Android S中各类dex文件
Android S中各类dex文件
- 1. Android S中APK(预编译)中的dex文件
- 2. 安装/开机过程中的dex文件
- 3. 出现prof文件后,手动触发重新做一次dex2opt
- 4. system_server的dex文件
- 5. Boot image 文件
1. Android S中APK(预编译)中的dex文件
例如Photos,
26M ./oat/arm/Photos.vdex
5.9M ./oat/arm/Photos.odex
1.4M ./oat/arm/Photos.art
33M ./oat/arm
33M ./oat
36K ./Photos.apk.prof
76M ./Photos.apk
108M .
vdex
文件
dex code + verification info 也就是
dex
文件加上校验信息组成vdex
文件
那么dex文件又是什么
dex
文件
Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别。
当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,
dex文件是传统jar文件大小的50%左右。
DEX是Dalvik EXecutable的简称。在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。
因为Android系统使用虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成虚拟机能够执行的class文件。这里需要强调的是,Dex和Jar一样是一个归档文件,
里面仍然是Java代码对应的字节码文件。
注意一点dex文件和jar文件一样,仍然是归档文件,代表的是java的字节码文件,可以先简单认为是apk的字节码文件
odex
文件
当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫dex2oat。dex2oat的执行过程是在第一次加载Dex文件的时候执行的。
这个过程会生成一个odex文件,即Optimised Dex。执行odex的效率会比直接执行Dex文件的效率要高很多。odex文件存放在/data/dalvik-cache目录并在执行时加载进内存执行。
在APK的安装过程中,dex文件会被提取出来进行检查和验证。APK安装成功后,在第一次运行或系统第一次开机时,系统对dex文件进行优化,转换为odex文件。
这里就是优化过后的字节码
,会比dex文件执行效率有很大的提升(如启动速度可以提升10%-30%)
art
文件:Android N开始出现,是app的image文件
这个文件里预加载了一些class,在应用运行时可以直接将AppImage映射到内存中,以加快类加载的速度。
是一个header+class object的映射内存数据,直接被映射到art虚拟机的堆空间中,包含oat/odex的某些对象实例以及函数。
prof
文件
记录着运行时的热点函数,用于生成odex、oat、art等优化文件
2. 安装/开机过程中的dex文件
普通安装是没有prof文件的,可以看到odex文件很小,也就代表基本上没有什么热点函数的优化
31M ./base.apk
96K ./oat/arm/base.odex
10M ./oat/arm/base.vdex
10M ./oat/arm
10M ./oat
46M .
默认开机过程中做的dex文件,这里的dex文件和上面的odex文件一样都是优化过后的问题,可以看到也是很小,也就是默认没有很大优化
/data/dalvik-cache/arm # du -ah | grep “Duo”
152K ./system@removable-app@Duo@Duo.apk@classes.dex
11M ./system@removable-app@Duo@Duo.apk@classes.vdex
3. 出现prof文件后,手动触发重新做一次dex2opt
如果使用过后出现prof,然后再次看whatsapp的内容,发现odex的大小明显增加了,还有art文件也明显增加了。
这个就是通过profile重新进行dex2opt生成更优的机器码的过程,各位可以自己测试一下,提升效能有10%-30%
31M ./base.apk
1.5M ./oat/arm/base.odex
9.4M ./oat/arm/base.vdex
500K ./oat/arm/base.art
11M ./oat/arm
11M ./oat
47M .
/data/misc/profiles/ref/com.whatsapp # du -ah
8.0K ./primary.prof
4. system_server的dex文件
system_server系统进程可以说是android最重要的一个进程之一
4.0K ./services.jar.bprof
212K ./oat/arm/services.vdex
35M ./oat/arm/services.odex
2.2M ./oat/arm/services.art
18M ./services.jar
324K ./services.jar.prof
可以看到system_server其实是一个jar包,
services.jar.bprof
boot image的prof文件
services.jar.prof
frameworks/base/services/art-profile热点函数转换成profile文件
frameworks/base/services/art-profile
system_server的热点函数
其中odex、art文件都很大,代表大部分都是优化后的(普通的Android版本system_server是做的speed优化,故odex会非常大;而art appimage文件是art-profile生成的)
5. Boot image 文件
boot***文件,ART虚拟机必须的一部分,没有它们无法启动:不同的是system_server是一个单独进程,而bootimage是运行在zygote中的,也就是所有上层进程
Android S system/framework中有很多boot文件,这里只列出boot-framework来做个代表
9.4M ./arm/boot-framework.oat
4.4M ./arm/boot-framework.art
316K ./boot-framework.vdex
34M ./framework.jar
boot**.oat
:路径system/framework以及data/dalvik-cache/arm(arm64)
boot image文件的一部分,主要存放系统关键库的代码, 用来加速运行,类似于odex文件
可以将其理解为ART虚拟机的启动类(主要内容是代码,其中就包含了Android系统需要的基础jar包和java的核心jar包)
注:data下的由首次开机patchoat时做偏移得到(安全相关)
boot**.art会加载在boot**.oat前面,内存中紧紧挨着boot**.oat
这个oat文件主要是通过
frameworks/base/config/boot-image-profile.txt
转换成boot image的profile文件,然后生成的优化文件
boot**.art
主要是数据——加载好的class信息以及一些事先创建好的对象preload-classes
也是通过boot image的profile文件来生成的,用于预加载
ps:
由于写一篇长的比较耗时,分成几次来写,下一个篇幅将用来讲解如何抓取profile文件
Android S中各类dex文件相关推荐
- Android 系统(181 )----Android中各类.mk文件的编写
Android中各类.mk文件的编写 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := ...
- Android(五)——dex文件动态调试
代码动态调试: 代码动态调试技术,一般是通过观察程序在运行过程中的状态,如寄存器内容,函数执行结果,内存使用情况等等,分析函数功能,明确代码逻辑,查找可能存在的漏洞 工具:IDA 条件:Android ...
- android打开wav格式,FileNotFoundException从Android资产中打开wav文件
在我们的android应用程序中,我们打开位于assets/config/notification.wav中的wav文件.要打开和播放声音,我们使用下面的代码:FileNotFoundExceptio ...
- XamarinSQLite教程在Xamarin.Android项目中提取数据库文件
XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...
- XamarinSQLite教程在Xamarin.Android项目中定位数据库文件
XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocumen ...
- android下载通知栏,Android开发中实现下载文件通知栏显示进度条
android开发中实现下载文件通知栏显示进度条. 1.使用asynctask异步任务实现,调用publishprogress()方法刷新进度来实现(已优化) public class myasync ...
- Android Studio中使用样式文件
Android Studio的样式(style)文件包含了样式资源,样式资源定义了单个视图(View)或者整个活动(Activity)的界面格式和外观. 1 添加样式文件 在Android Studi ...
- android oat如何提取dex文件字节码,Android: 使用oatdump反编译oat文件
网上经常看到有通过apktool将apk中的dex反编译成smali格式的文件,以便分析功能实现与破-解,确没怎么看到oat文件反通过oatdump反编译的,所以就写了一篇这样的文档.声明一下oat文 ...
- android studio创建md,如何在Android Studio中设置*md文件打开方式
最近在Android Studio中写一些Demo的时候,会顺便在里面创建一个.md文件用来进行Demo笔记的书写.然而Android Studio不带有markdown预览功能,所以我就琢磨如何在A ...
- Android动态加载dex文件/jar包的纯原生代码实现(dex文件由服务端下发)
介绍原理的文章有很多,我就不再多说,直奔主题: 一.生成dex文件(源码下载地址:https://download.csdn.net/download/wanggangyanqing/18658862 ...
最新文章
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- CSS样式表——超链接样式
- 5分钟部署一个Hello World Servlet到CloudFoundry
- POJ 1789(最小生成树)
- C程序中如何区分windowsx86,x64
- Django根据现有数据库建立/更新model
- ae效果英文版翻译对照表_用AE设计动态海报教程
- fine-tune 微调 Transfer learning 迁移学习 动手学深度学习v2
- java 前端通过浏览器下载服务器上的文件
- 商业计划书范文3000_清远可以写商业计划书做的报告范文
- 菜鸟站长之家google账号注册申请图文教程
- 国际象棋“马”的走法
- Tunnel端口配置
- css3 3D立体相册实现
- 东软慧聚助力汽车“芯”节能减排
- SpringBoot再回首:SpringBoot之Servlet用法
- 前端利器CodePen,了解一下吧
- 使用HTML设计网页
- 用计算机对PLC进行编程时,PLC编程中的五个常见问题
- 作为产品助理的这一年