文档详情

Android运行时ART加载OAT文件的过程分析解析.doc

发布:2017-01-06约3.61万字共26页下载文档
文本预览下载声明
Android运行时ART加载OAT文件的过程分析 在前面一文中,我们介绍了Android运行时ART,它的核心是OAT文件。OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。这使得我们无需重新编译原有的APK就可以让它正常地在ART里面运行,也就是我们不需要改变原来的APK编程接口。本文我们通过OAT文件的加载过程分析OAT文件的结构,为后面分析ART的工作原理打基础。 由于OAT文件本质上是一个ELF文件,因此在最外层它具有一般ELF文件的结构,例如它有标准的ELF文件头以及通过段(Section)来描述文件内容。关于ELF文件的更多知识,可以参考维基百科:。 作为Android私有的一种ELF文件,OAT文件包含有两个特殊的段oatdata和oatexec,前者包含有用来生成本地机器指令的dex文件内容,后者包含有生成的本地机器指令,它们之间的关系通过储存在oatdata段前面的oat头部描述。此外,在OAT文件的dynamic段,导出了三个符号oatdata、oatexec和oatlastword,它们的值就是用来界定oatdata段和oatexec段的起止位置的。其中,[oatdata, oatexec - 1]描述的是oatdata段的起止位置,而[oatexec, oatlastword + 3]描述的是oatexec的起止位置。要完全理解OAT的文件格式,除了要理解本文即将要分析的OAT加载过程之外,还需要掌握接下来文章分析的类和方法查找过程。 在分析OAT文件的加载过程之前,我们需要简单介绍一下OAT是如何产生的。如前面一文所示,APK在安装的过程中,会通过dex2oat工具生成一个OAT文件: [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name, const char* output_file_name, const char* dexopt_flags) { static const char* DEX2OAT_BIN = /system/bin/dex2oat; static const int MAX_INT_LEN = 12; // -+10dig+\0 -OR- 0x+8dig char zip_fd_arg[strlen(--zip-fd=) + MAX_INT_LEN]; char zip_location_arg[strlen(--zip-location=) + PKG_PATH_MAX]; char oat_fd_arg[strlen(--oat-fd=) + MAX_INT_LEN]; char oat_location_arg[strlen(--oat-name=) + PKG_PATH_MAX]; sprintf(zip_fd_arg, --zip-fd=%d, zip_fd); sprintf(zip_location_arg, --zip-location=%s, input_file_name); sprintf(oat_fd_arg, --oat-fd=%d, oat_fd); sprintf(oat_location_arg, --oat-location=%s, output_file_name); ALOGV(Running %s in=%s out=%s\n, DEX2OAT_BIN, input_file_name, output_file_name); execl(DEX2OAT_BIN, DEX2OAT_BIN, zip_fd_arg, zip_location_arg, oat_fd_arg, oat_location_arg, (char*) NULL); ALOGE(execl(%s) failed: %s\n, DEX2OAT_BIN, strerror(errno)); } 这个函数定义在文件frameworks/native/cmds/installd/commands.
显示全部
相似文档