编译(二):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.mzph.cn/news/1163711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【好写作AI】别慌!“AI痕迹”检测,到底在检测什么?

好写作AI官方网址:https://www.haoxiezuo.cn/一、新的焦虑正在蔓延:你的论文,有“AI味”吗? 提交论文前,除了查重,你是不是开始多了一个动作——把文段丢进各种“AI检测器”,紧张地等待结果&…

制造工厂研发人员需要实现5个SolidWorks共享一台服务器如何实现

在制造工厂中,当5名SolidWorks研发人员需要共享一台服务器时,合理的配置和优化能够显著提升协作效率和数据安全性。此方案核心在于集中化资源管理、动态化资源分配、智能化权限管控,结合高性能硬件配置与协同设计功能,可显著提升资…

【好写作AI】实验猿的福音:把跑胶写Paper的时间,从“半年刊”变成“周更”

好写作AI官方网址:https://www.haoxiezuo.cn/一、医学生的日常:你的时间都去哪了?文献PubMed一搜,3871条结果,筛到第50篇时,实验细胞都快长满皿了…写方法部分时,大脑在“精密操作”和“小学生作…

sudo reboot的庖丁解牛

sudo reboot 是 Linux 系统中 以超级用户权限触发系统重启 的命令。它看似简单,但背后涉及 权限模型、关机流程、系统安全 三大机制。一、命令拆解部分作用sudo临时提升权限(以 root 身份执行)reboot触发系统重启(调用 systemctl …

qKnow 知识平台核心能力解析|第 01 期:知识图谱怎么建才不乱?先把图谱模型设计清楚

在构建企业级知识图谱的过程中,图谱模型永远是第一步,也是最关键的一步。 很多用户在使用知识图谱产品时,习惯先上传文档、直接开始抽取,结果往往会遇到这样的问题: 抽取结果杂乱、关系混乱、后续难以用于问答和分析。…

paperxieTurnitin AI 率检测:每日 200 篇免费查重,留学生论文的 “隐形安全盾”

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippt https://www.paperxie.cn/checkhttps://www.paperxie.cn/check 当你熬夜写完的留学生论文,既怕重复率超标,又担心被导师质疑 “AI 生成痕迹过重”—— 现在,pape…

【好写作AI】工科生的“技术文档外挂”:让你画的图、算的数,自己会说话

好写作AI官方网址:https://www.haoxiezuo.cn/一、工程人的日常:图纸画得溜,报告写得愁?CAD、SolidWorks里模型炫酷,一写设计说明就变 “采用…结构,具有…优点” 的模板复读机。仿真数据跑了一整夜&#xf…

【必学收藏】大模型核心技术精讲:MoE架构、LoRA微调与RAG增强技术全解析

本文系统介绍大模型五大核心技术:Transformer与MoE混合专家架构、LoRA系列高效微调方法、传统RAG与Agentic RAG对比、五种Agentic AI设计模式及RAG系统的文档分块策略。内容覆盖从基础架构到应用优化的完整技术链,为开发者提供大模型理解、微调与实用的全…

Lua 的 Package 模块

Lua 的 Package 模块 是 Lua 标准库中用于管理模块加载和依赖关系的重要组件。它提供了一套完整的机制来帮助开发者组织和管理代码模块。 核心功能 模块加载机制: 通过 require 函数加载模块自动处理模块路径搜索(package.path 和 package.cpath&#x…

网络服务器入门指南:搭建与管理

网络服务器入门指南:搭建与管理选择服务器硬件或云服务根据需求选择物理服务器或云服务提供商。物理服务器需要购买硬件设备,适合对数据控制要求高的场景。云服务如AWS、阿里云等提供弹性扩展能力,适合初创企业或个人开发者。评估硬件配置时关…

全网最全专科生AI论文写作软件TOP9测评

全网最全专科生AI论文写作软件TOP9测评 2026年专科生AI论文写作工具测评维度解析 随着人工智能技术的不断进步,越来越多的专科生开始借助AI写作工具提升论文写作效率。然而,面对市场上琳琅满目的选择,如何挑选真正适合自己需求的工具成为一大…

【第三方软件测试机构:LoadRunner常见错误代码27796和26612的分析和解决方法】

LoadRunner常见错误代码27796和26612的分析和解决方法。这两个错误和网络连接层密切相关。 错误 27796: Error -27796: Failed to connect to server VuGen 或负载生成器在尝试建立到目的服务器的初始TCP连接时失败。原因一般不在脚本思路上,而在网络环境或客户端配…

经典的PHP+MySQL开发组合的微信投票活动源码系统

温馨提示:文末有资源获取方式你是否在寻找一个能快速启动、模式清晰、且能产生多重收益的互联网项目?微信投票活动巨大的市场需求和清晰的盈利模式,一直吸引着众多创业者。现在,一个功能更加强大的新版投票源码系统应运而生&#…

【第三方CMA和CNAS软件测评机构:LoadRunner负载生成器(Load Generator)无法连接故障诊断和修复手册】

负载生成器(Load Generator)无法连接故障诊断和修复手册 故障本质 负载生成器连接故障LoadRunner Controller在尝试和一台或多台指定的负载生成器建立管理和控制通道时失败。连接独立于测试脚本中模拟的用户流量,用于指令下发、状态监控和结…

收藏必看!大模型落地崩溃指南:从RAG到Agent的保命手册

大模型落地需在通用化与专业化、自主性与可控性、成本与性能间权衡。RAG与长上下文互补,Workflow与Agent可混合使用,Multi-agent需满足"三可"条件。技术选型应基于场景需求:知识准确性问题选RAG,流程标准化问题选Workfl…

大模型技术全景图:RAG、Agent、知识图谱如何协同工作?程序员必收藏指南

文章系统解析了大模型、RAG、Agent、知识图谱等AI技术的层次关系:大模型作为基础能力层提供核心认知能力;RAG与知识库、向量数据库构成知识增强层,解决知识局限和幻觉问题;函数调用作为行动扩展层连接认知与执行;Agent…

打破“数据孤岛”,实现全厂设备一站式可视化管理

核心痛点:在传统的制造工厂中,不同品牌、不同型号的PLC(西门子、三菱、欧姆龙等)控制着生产线上的各类设备。这些设备数据相互隔绝,形成一个个“数据孤岛”。管理者无法实时掌握设备运行状态、工艺参数、故障信息&…

audio2face 眼睛驱动

目录 AnimateCharacterFromWavFileAsync mh_arkit_mapping_pose_A2F 2️⃣ 里面到底有没有「眼睛相关」的曲线?✅ 有 👁 眨眼 👁 眼球转动 👁 眼睛张开程度(部分 Rig) 3️⃣ 那为什么你“看不到眼睛…

通孔PCB孔壁质量怎么检测?

通孔 PCB 的孔壁很容易出现空洞、毛刺等缺陷,这些缺陷怎么检测出来?IPC 标准对孔壁质量的合格判定有哪些具体要求?​通孔 PCB 的孔壁质量是决定产品可靠性的核心因素,孔壁缺陷(如空洞、毛刺、镀层剥离、裂纹&#xff0…

鸿蒙 HDF 驱动开发初探:如何为 Hi3861 开发板编写一个自定义的 LED 驱动?

标签: #HarmonyOS #HDF #驱动开发 #Hi3861 #嵌入式 #南向开发🧬 前言:为什么一定要用 HDF? 你可能会问:“直接操作寄存器或者调 GPIO 库不香吗?为什么要套这么厚一层 HDF 壳子?” HDF 的核心价值…