当前位置: 首页 > news >正文

编译(二):class、dex、so 编译流程

编译(一):理论知识

编译(二):class、dex、so 编译流程


Class 流程

  • 加载:查找和导入类的二进制数据
  • 链接:执行验证,准备和(可选)解析
    • 验证:确保导入类型的正确性
    • 准备:为类变量分配内存并将内存初始化为默认值
    • 解析:将符号引用从类型转换为直接引用。
  • 初始化:调用将代码初始化为正确的初始值的Java代码。
  • 加载:将类的信息从文件中获取并且载入到JVM内存中
    1. 通过一个类的全限定名来获取其定义的二进制字节流
    2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
    3. 在Java堆中生成一个代表这个类的 java. lang Class对象,作为对方法区中这些数据的访问入口
  • 验证:检查读入的结构是否符合JVM规范的描述
    1. 为了确保 Class文件中的字节流包含的信息符合当前虚拟机的要求
    2. 文件格式的验证、元数据的验证、字节码验证和符号引用验证
  • 准备:分配内存,初始化变量
  • 解析:把这个类的常量池的所有符号引用改变成直接引用
  • 初始化:执行静态初始化程序、类构造器方法的过程

PathClassLoader 流程

  • 初始化
  • DexPathList.DexPathList
    • dexElements: 根据多路径的分隔符“;”将dexPath转换成File列表,记录所有的dexFile
    • nativeLibraryPathElements: 记录所有的Native动态库, 包括app目录的native库和系统目录的native库。
    • makePathElements
    • makeDexElements 创建Element数组
    • loadDexFile
    • 创建对象DexFile
    • openDexFile
    • dalvik_system_DexFile.DexFile_openDexFileNative
  • ClassLoader.loadClass
    • 判断当前类加载器是否已经加载过指定类,若已加载则直接返回,否则继续执行;
    • 调用parent的类加载递归加载该类,检测是否加载,若已加载则直接返回,否则继续执行;
    • 调用当前类加载器,通过findClass加载。
  • findClass
  • DexPathList.findClass 一个Classloader可以包含多个dex文件,每个dex文件被封装到一个Element对象,这些Element对象排列成有序的数组 dexElements。当查找某个类时,会遍历所有的dex文件,如果找到则直接返回,不再继续遍历dexElements。
  • DexFile.loadClassBinaryName
  • dalvik_system_DexFile.defineClassNative 在native层创建目标类的对象并添加到虚拟机列表

System.loadLibrary 流程

  • System.loadLibrary
  • Runtime.loadLibrary
    • 当loader不为空时, 则通过loader.findLibrary()查看目标库所在路径;
    • 当loader为空时, 则从默认目录mLibPaths下来查找是否存在该动态库;
      • System.initUnchangeableSystemProperties 将大量的key-value对保存到Properties对象, 重点看specialProperties
      • System.parsePropertyAssignments 将assignments数据解析后保存到Properties对象,而此处的assignments来源于java_lang_System.specialProperties()方法
      • linker.do_android_get_LD_LIBRARY_PATH 看kDefaultLdPaths数组
      • linker.kDefaultLdPaths
  • BaseDexClassLoader.findLibrary
    • DexPathList.DexPathList DexPathList初始化
      • dexElements: 记录所有的dexFile文件
      • nativeLibraryPathElements: 记录所有的Native动态库, 包括app目录的native库和系统目录的native库.
    • DexPathList.findLibrary 从所有的动态库nativeLibraryPathElements(包含两个系统路径)查询是否存在匹配的
    • System.mapLibraryName 将动态库的名字转换为so
    • DexPathList.java ::Element.findNativeLibrary 遍历查询,一旦找到则返回所找到的目标动态库
  • Runtime.doLoad 增加同步锁,保证并发时一致性
    • 当loader为空,则ldLibraryPath为系统目录下的Native库
    • 当lodder不为空,则ldLibraryPath为app目录下的native库
    • java_lang_Runtime.Runtime_nativeLoad
      • 调用dlopen函数,打开一个so文件并创建一个handle;
      • 调用dlsym()函数,查看相应so文件的JNI_OnLoad()函数指针,并执行相应函数。
  • android_media_MediaPlayer.JNI_OnLoad
  • android_media_MediaPlayer.register_android_media_MediaPlayer
  • AndroidRuntime.registerNativeMethods
  • JNIHelp.jniRegisterNativeMethods
  • jni.RegisterNatives 这个过程完成了gMethods数组中的方法的映射关系
  • java_vm_ext.LoadNativeLibrary
    • JavaVM:进程虚拟机环境,每个进程有且只有一个JavaVM实例
    • JNIEnv:线程上下文环境,每个线程有且只有一个JNIEnv实例
    • 检查该动态库是否已加载
    • 通过dlopen打开动态共享库
    • 创建SharedLibrary共享库,并添加到libraries_列表
    • 通过dlsym获取JNI_OnLoad符号所对应的方法, 并调用该方法
http://www.jsqmd.com/news/248479/

相关文章:

  • 制造工厂研发人员需要实现5个SolidWorks共享一台服务器如何实现
  • 【好写作AI】实验猿的福音:把跑胶写Paper的时间,从“半年刊”变成“周更”
  • sudo reboot的庖丁解牛
  • paperxieTurnitin AI 率检测:每日 200 篇免费查重,留学生论文的 “隐形安全盾”
  • qKnow 知识平台核心能力解析|第 01 期:知识图谱怎么建才不乱?先把图谱模型设计清楚
  • 【好写作AI】工科生的“技术文档外挂”:让你画的图、算的数,自己会说话
  • 【必学收藏】大模型核心技术精讲:MoE架构、LoRA微调与RAG增强技术全解析
  • Lua 的 Package 模块
  • 网络服务器入门指南:搭建与管理
  • AI 法律顾问开发:基于 RAG + 知识图谱,如何让大模型精准回答“离婚财产分割”难题?
  • 全网最全专科生AI论文写作软件TOP9测评
  • 【第三方软件测试机构:LoadRunner常见错误代码27796和26612的分析和解决方法】
  • 经典的PHP+MySQL开发组合的微信投票活动源码系统
  • 【第三方CMA和CNAS软件测评机构:LoadRunner负载生成器(Load Generator)无法连接故障诊断和修复手册】
  • 收藏必看!大模型落地崩溃指南:从RAG到Agent的保命手册
  • 大模型技术全景图:RAG、Agent、知识图谱如何协同工作?程序员必收藏指南
  • 打破“数据孤岛”,实现全厂设备一站式可视化管理
  • audio2face 眼睛驱动
  • 通孔PCB孔壁质量怎么检测?
  • 鸿蒙 HDF 驱动开发初探:如何为 Hi3861 开发板编写一个自定义的 LED 驱动?
  • 通孔PCB vsSMT贴片:教你选对组装方案
  • 计算机论文写作一站式指南:6款AI工具1天生成8000字附真实参考文献
  • 通孔PCB的5大核心优势
  • 【时频分析】面向相交群延迟多分量信号的时频重分配同步挤压频域线性调频小波变换【附MATLAB代码】
  • 课程论文不用 “水”!虎贲等考 AI 一键解锁高质量写作捷径
  • 计算机领域学术发表地图:CCF与CAAI等分级体系全解析
  • 五行代码,逼疯整个硅谷!澳洲放羊大叔,捅开AI编程奇点
  • COOH-SS-PEG-COOH,羧基-二硫键-聚乙二醇-羧基,适用于药物递送系统
  • 人工造问卷 VS 虎贲等考 AI:30 分钟搞定学术调研 “黄金问卷”
  • 必藏!大模型“记忆力“突破:从2K到百万Token的技术演进与原理详解