Android SO加载深度探索:从加载到链接

5星 · 超过95%的资源 需积分: 9 118 下载量 136 浏览量 更新于2024-07-20 收藏 1.55MB PDF 举报
"Android so加载深入分析" 这篇文档详细剖析了Android系统中动态链接库(SO文件)的加载过程,从Java层到Native层的各个环节。作者ManyFace在2016年2月7日发布了这份深入分析,主要针对Android L版本的源码进行了解读。 在Java层,Android应用通过调用`System.loadLibrary()`接口来加载SO库。这个接口会进一步调用`Runtime.getRuntime().loadLibrary()`,然后是`Runtime.doLoad()`,最终通过`Runtime.nativeLoad()`来执行实际的加载操作。这些函数构成了Java层的调用链路,为后续的分析提供了起点。 在Native层,文档详细阐述了`find_libraries()`函数的三个阶段:初始化、加载SO到内存和链接阶段。在初始化阶段,系统准备加载SO文件;在加载阶段,`load_library()`函数被调用,它包括打开SO文件、映射文件到内存两个子步骤;在映射过程中,SO文件的内容被复制到进程的虚拟地址空间。在解析动态段(dynamic section)的阶段,系统处理符号解析和重定位等链接操作,确保SO中的函数和变量可以被正确引用。 在`load_library()`的三个部分中,打开SO文件涉及到文件系统的操作;映射到内存则涉及到内存管理和虚拟内存的配置;解析动态段是链接的关键,这里会处理ELF文件的`.dynsym`、`.rel*`等节区,完成符号表的解析和重定位表的处理。 文章特别指出,理解这篇分析需要一定的ELF文件格式基础,因为SO文件就是基于ELF格式。如果读者对此不熟悉,作者建议参考他之前关于OAT文件分析的工作。 由于文档内容涵盖的技术细节较多,作者也谦虚地表示,可能有分析不到位或错误的地方,鼓励读者指正。这份分析对于理解Android系统如何加载和管理动态链接库具有很高的价值,对于Android开发者特别是从事底层优化的人员来说,是一份宝贵的参考资料。