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

Android .so 文件简析

so 文件使用


CPU 架构:

  • mips / mips64: 极少用于手机可以忽
  • x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的
  • armeabi: ARM v5 主要 用于 Android 4. 0 之后 的, CPU 是 32 位 的。这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈支持, 基本 已经 被 淘汰 了
  • armeabi-v7a: ARM v7 目前主流版本,向下兼容armeabi
  • arm64-v8a: 主要 用于 Android 5. 0 之后, CPU 是 64 位 的。

查找过程。对于一个cpu是arm64-v8a架构的手机,它运行app时,进入jnilibs去读取库文件时,分两种情况:

  1. 先看有没有arm64-v8a文件夹,如果没有该文件夹,去找armeabi-v7a文件夹,如果没有,再去找armeabi文件夹,如果连这个文件夹也没有,就抛出异常;
  2. 如果有arm64-v8a文件夹,那么就去找特定名称的.so文件,注意:如果没有找到,不会再往下找了,而是直接抛出异常Exception:Java.lang.UnsatisfiedLinkError: dlopen failed: library “/***.so” not found 。

兼容性:

  • Android 上 启动 每个 App, 都会 为 App 创建 一个 虚拟 机。 Android 的 64 位 系统,加载 32 位 的 so 或者 App 时, 会在 创建 一个 64 位 的 虚拟 机 的 同时, 还 创建 一个 32 位 的 虚拟 机, 这样, 就能 兼容 32 位 的 App 应用 了。所以, 在 App 中, 保留 一个 armeabi- v7a 版本 的 so 就 足够 了。 64 位 Android 系统 会在 32 位 的 虚拟 机上 加载 它。
  • 所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件.
    • 只保留这一套so文件并不保证100%不发生crash,特别是对旧设备。
    • 也会失去对其他对应CPU架构的一些优化,性能有所损失。

实践:

  • 可以全部CPU架构都支持,安装包体积会大,稳定、性能最佳
  • 根据覆盖用户做选择
    • 可以只是用armeabi-v7a一套
    • 通过设置ndk.abiFilters显示指定支持的ABI

栈帧还原:调试信息和符号表

  • 主要是各种名字以 .debug_ 开头的 section,通过这些 section 可以建立 so 每条指令与源码文件的映射关系,也就是能够对 so 中每条指令找到其对应的源码文件名、文件行号等信息
  • 实际调用的是 NDK 提供的的 strip 命令,所用参数为–strip-unneeded
  • 删除了调试信息和符号表的 so ,只能保证获取到崩溃调用栈的每个栈帧的相应指令在 so 中的位置,不一定能获取到符号。带调试信息和符号表的 so 可以将崩溃调用栈的每个栈帧还原成其对应的源码文件名、文件行号、函数名等

Hook:动态符号表是连接当前 so 与外部环境的“桥梁”

  • PLT(Procedure Linkage Table):过程链接表,用于存储动态链接库中函数的入口地址。当程序调用一个动态链接库中的函数时,首先会跳转到PLT中的对应条目,然后再通过GOT找到实际的函数地址并执行。
  • GOT(Global Offset Table):全局偏移表,用于存储动态链接库中函数和变量的实际地址。在程序运行时,动态链接器(dynamic linker)会根据需要将函数和变量的实际地址填充到GOT中。PLT中的条目会通过GOT来找到函数和变量的实际地址。
  • 导出符号存储“ID-地址”的映射关系
  • 导入符号记录so 调用其他 so 中的函数
http://www.cnnetsun.cn/news/3243943.html

相关文章:

  • 云器科技开源“增量Skill”:一句话让AI搞定增量数据开发,任意AI Agent生产级可用
  • MP2672A双节锂电池充电管理与STM32F302R8硬件设计
  • ROS 多传感器同步方案对比:ExactTime vs ApproximateTime 在4种场景下的性能实测
  • 欧姆龙G6D-ASI与PIC18F47K42的智能负载控制方案
  • 没有实拍素材怎么快速做投流视频,AI能生成镜头脚本吗
  • STM32与A3908构建高精度运动控制系统的关键技术解析
  • 3分钟掌握ncmdump:轻松解密网易云音乐加密文件的完整指南
  • STM32与H桥驱动器实现直流电机智能控制方案
  • IDM激活脚本终极指南:3步实现永久免费高速下载
  • MP2672A双节锂电池充电管理与电压平衡技术详解
  • 5步精通Shelter隔离环境配置:从安装到故障排除的完整指南
  • ncmdumpGUI:3步轻松解锁网易云音乐NCM文件,让音乐自由播放
  • I-JEPA 架构实战:4步复现 Meta 自监督视觉模型,72小时训练 ViT-H/14
  • (保姆级)Vscode 更换自定义代码及终端字体
  • 专业级浏览器资源嗅探工具配置指南:从零开始高效部署猫抓扩展
  • 支付逻辑漏洞实战:Burp Suite 2024.3 抓包篡改价格,复现 3 种常见攻击手法
  • A3910与STM32F756ZG在工业运动控制中的高效应用
  • 终极跨平台图表绘制解决方案:drawio-desktop全功能指南
  • TLP241A光隔离继电器与PIC18F4610的工业控制应用
  • 如何在Windows上完美使用苹果触控板:mac-precision-touchpad完整使用指南
  • 3步上手UABEA:Unity游戏资源编辑与Asset Bundle解析完整指南
  • 2S锂电池组平衡充电方案设计与TI BQ25887应用
  • 锂电池组主动平衡方案:BQ25887与STM32F767ZG设计实践
  • 数字电路上拉下拉电阻原理与PIC单片机应用
  • HarmonyOS WPS Open SDK:关闭回传 URI-FD 与 ResultData 解析实现
  • 液态神经网络 (LNN) 与 LSTM/GRU 对比评测:在 2 个时序任务上的精度与效率分析
  • STM32与A3908实现高精度电机控制方案解析
  • 安卓抓包实战:BurpSuite代理配置与HTTPS解密全指南
  • 树莓派5 砝码识别方案:2024起重机创意赛机器学习模块,识别精度99.5%实测
  • 2026年江门奔驰C260音响改装店怎么选?看完这台车后,我会先去江门汇声汽车音响试听