Android 的 so 文件加载机制

Android HAL动态加载机制:从GPS模块到通用HAL的so文件寻址逻辑剖析 本文深入剖析了Android HAL动态加载机制,特别是GPS模块(GnssHal)的so文件寻址逻辑。详细解析了hw_get_module函数的加载过程、so文件命名规则与存放路径,以及多分区协作策略,帮助开发者理解并掌握Android HAL的通用设计思想与实现方法。 阅读详情

学习链接:
https://www.cnblogs.com/dasusu/p/9810673.html

问题

  • Q1:你知道 so 文件的加载流程吗?
  • Q2:设备存放 so 的路径有 system/lib,vendor/lib,system/lib64,vendor/lib64,知道在哪里规定了这些路径吗?清楚哪些场景下系统会去哪个目录下寻找 so 文件吗?还是说,所有的目录都会去寻找?
  • Q3:Zygote 进程是分 32 位和 64 位的,那么,系统是如何决定某个应用应该运行在 32 位上,还是 64 位上?
  • Q4:如果程序跑在 64 位的 Zygote 进程上时,可以使用 32 位的 so 文件么,即应用的 primaryCpuAbi 为 arm64-v8a,那么是否可使用 armeabi-v7a 的 so 文件,兼容的吗?

总结

  • 一个应用在安装过程中,系统会经过一系列复杂的逻辑确定两个跟 so 文件加载相关的 app 属性值:nativeLibraryDirectories ,primaryCpuAbi ;
  • nativeLibraryDirectories 表示应用自身存放 so 文件的目录地址,影响着 so 文件的加载流程;
  • primaryCpuAbi 表示应用应该运行在哪种 abi 上,如(armeabi-v7a),它影响着应用是运行在 32 位还是 64 位的进程上,进而影响到寻找系统指定的 so 文件目录的流程;
  • 以上两个属性,在应用安装结束后,可在 data/system/packages.xml 中查看;
  • 当调用 System 的 loadLibrary() 加载 so 文件时,流程如下:
  • 先到 nativeLibraryDirectories 指向的目录中寻找,是否存在且可用的 so 文件,有则直接加载这里的 so 文件;
  • 上一步没找到的话,则根据当前进程如果是 32 位的,那么依次去 vendor/lib 和 system/lib 目录中寻找;
  • 同样,如果当前进程是 64 位的,那么依次去 vendor/lib64 和 system/lib64 目录中寻找;
  • 当前应用是运行在 32 位还是 64 位的进程上,取决于系统的 ro.zygote 属性和应用的 primaryCpuAbi 属性值,系统的 ro.zygote 可通过执行 getprop 命令查看;
  • 如果 ro.zygote 属性为 zygote64_32,那么应用启动时,会先在 ro.product.cpu.abilist64 列表中寻找是否支持 primaryCpuAbi 属性,有,则该应用运行在 64 位的进程上;
  • 如果上一步不支持,那么会在 ro.product.cpu.abilist32 列表中寻找是否支持 primaryCpuAbi 属性,有,则该应用运行在 32 位的进程上;
  • 如果 ro.zygote 属性为 zygote32_64,则上述两个步骤互换;
  • 如果应用的 primaryCpuAbi 属性为空,那么以 ro.product.cpu.abilist 列表中第一个 abi 值作为应用的 primaryCpuAbi;
  • 运行在 64 位的 abi 有:arm64-v8a,mips64,x86_64
  • 运行在 32 位的 abi 有:armeabi-v7a,armeabi,mips,x86
  • 通常支持 arm64-v8a 的 64 位设备,都会向下兼容支持 32 位的 abi 运行;
  • 但应用运行期间,不能混合着使用不同 abi 的 so 文件;
  • 比如,当应用运行在 64 位进程中时,无法使用 32 位 abi 的 so 文件,同样,应用运行在 32 位进程中时,也无法使用 64 位 abi 的 so 文件;
使用.so文件在Android中加载GIF图片的方法 为了克服这些难点,开发者们采取了多种方法:1.使用第三方库:通过集成支持GIF加载的第三方库,如Glide、Picasso等,简化了开发过程。2.原生代码解码:利用.so文件(共享库文件)进行GIF的解码操作,然后在Java层展示。3.手动实现解码器:在Android上手动编写C/C++代码实现GIF解码器,并通过JNI(Java Native Interface)与Java层通信。 阅读详情

相关推荐

从URDF到仿真动画:基于Simulink、Simscape与S-Function的机械臂一体化建模与控制

本文详细介绍了从URDF文件到高保真仿真动画的一体化机械臂建模与控制流程。通过整合Simulink、Simscape与S-Function,构建了包含物理特性的虚拟机械臂模型,并实现了自适应滑模等高级控制算法的嵌入与验证。该流程打通了从机械设计到控制算法验证的闭环,为机器人开发提供了高效的仿真平台。

cnn8visionary的博客 698

第三方app加载系统/system/lib下的库

loadnativielibrary

lei7143的专栏 1391

SRAM compiler中 Number of banks 设置

的值时,需要考虑应用的性能需求、功耗要求和面积限制。设计者应根据具体的应用场景选择合适的bank数量,以优化整体系统性能。bank是一种用于分离存储器访问的设计结构,允许同时对不同的存储区域进行读写操作,从而提高存储器的并发访问性能。选项用于指定 SRAM 存储器的 并发存储区域。在 SRAM 编译器中,

hzmscut的博客 1872

Android开发——关于32位与64位so的加载问题

有时候会为了减少apk的大小,只设置支持“ armeabi-v7a ”SO库架构 apk在安装的过程中,系统就会对apk进行解析根据里面so文件类型,确定这个apk安装是在32 还是 64位的虚拟机上,如果是32位虚拟机那么就不能使用64位so,如果是64位虚拟机也不能使用32位so。而64位设备可以提供32和64位两种虚拟机,根据apk选择开启哪一种,因此说64位设备兼容32的so库。 具体机制,分下面四种情况: 1.假设apk的lib目录放置了32和64位两种so,那么安装时根据当前设备的cp

qq_25065595的博客 7689

剑灵解包器修改xml.dat文件修改乳量方法

本篇内容是基于单机版网游改单机版游戏剑灵的内容,主要针对关于单机版进行数据修改,当然了对于网端有关于剑灵已有很多,像小助手等多种可以更改,但是存在有封号危险,好,下面我们是在单机版中来进行乳量的修改教程。

灵魂学者的博客 3295

跟着团子学SAP EPPM:项目管理常见的集成场景(PPM\PS\MS Project)

在SAP的EPPM解决方案中,针对企业战略级别的投资组合管理首先是定义合适的投资组合的层级结构,在投资组合下可以通过不同维度去定义投资篮(Portofolio Bucket)进行层层拆分,在最下层级的投资篮下可以分配明细的投资项(Portofolio Item),投资项可以是独立的一个一个具体执行的项目,也可以是单纯的一次服务等等。 今天主要聚焦在投资项的维度展开讲一下在SAP中投资项常见的几种集成模式: 集成场景1:使用PPM中的Project Management进行项目管理 第一个场景是在创建投资项

Lucas1211的博客 4139

android动态加载布局_Android 动态链接库 So 的加载

前言最近在做 Android 项目的时候,需要在 NativeActivity 中动态加载 so 。运行的时候,抛出了异常 Caused by: java.lang.IllegalArgumentException: Unable to find native library using classloader: dalvik.system.PathClassLoader在 NativeAct...

weixin_39672680的博客 645

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造)

本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。

sun99的博客 552

Android 引入第三方so后启动报错 /lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so"

缘由: 由于项目需要,引用了不同平台的so文件,分别a.so, b.so ,其中a.so 只有armabi-v7a版本,b.so通过gradle配置自动下载,编译运行后程序启动,运行到需要使用a.so 的地方直接闪退;报错: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file ...

WeiPR的博客 1万+

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和HAL库搞定RMII配置与调试

本文详细介绍了STM32F407与LAN8720网口不通的全面排查与解决方法,涵盖硬件检查、CubeMX配置、PHY芯片初始化和LWIP协议栈优化。通过RMII接口配置、时钟树设置和PHY芯片调试,帮助开发者快速定位并解决网络连接问题,提升嵌入式网络开发效率。

weixin_30457551的博客 506

【推荐100个unity插件之24】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

【推荐100个unity插件之23】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1683

Android,遇到的错误

1 java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlite.so" not found原因是7.0以后,Andorid不允许直接访问系统的私有so文件了。1 把targetSdkVersion改小于24。2 apk中带上需要的so文件,这儿是libsqlite.so下载附件中的so文件,放到对应的文件夹下,如libs/ar...

qq_35560463的博客 1142

Yolo11改进:Block改进|MixDehazeNet,用于图像去雾网络的混合结构块|即插即用|附代码

https://arxiv.org/pdf/2305.17654 图像去雾是低级视觉领域中的一项典型任务。先前的研究验证了大型卷积核和注意力机制在去雾中的有效性。然而,存在两个缺点:引入大型卷积核时容易忽略图像的多尺度特性,而注意力模块的标准串联方式没有充分考虑雾分布的不均匀性。在本文中,我们提出了一种名为混合结构图像去雾网络(MixDehazeNet)的新型框架,该框架解决了上述两个问题。具体而言,它主要由两部分组成:多尺度并行大型卷积核模块和增强并行注意力模块。与单个大型卷积核相比,多尺度的并行大型卷积

m0_47867638的博客 1272

Android中so使用知识和问题总结以及插件开发过程中加载so的方案解析

PackageManager pm = getPackageManager(); try { ApplicationInfo ai = pm.getApplicationInfo(getPackageName(), PackageManager.GET_ACTIVITIES); // 本地SO释放目录 // 结果: dir:/data/app-lib/com.ten...

along 1482

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[Android Pro] so 动态加载—解决sdk过大问题

原文地址: https://blog.csdn.net/Rong_L/article/details/75212472 前言 相信Android 开发中大家或多或少都会集成一些第三方sdk, 而其中难免要会使用到他们的so文件。但有时,你会发现这些so文件过多,对于一些需要经常更新的应用来说,这将会大大浪费用户的流量。而有些sdk的集成仅仅是只为了一个不是必须的功能,我们完全有充足的理由用一些...

weixin_34101784的博客 200

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android中so知识总结和常见问题归纳以及插件开发过程中加载so的方案解析

一、知识点概要 Android中有时候为了效率以及平台开发库的支持,难免会用到NDK开发,那么都会产生一个so文件,通过native方法进行调用,开发和调用步骤很简单,这里就不多说了,本文主要来介绍,我们在使用so的时候总是会出现一些常见的问题,而现在插件化开发也很普遍了,有时候插件中也会包含一些so文件,需要加载,这时候也会出现一些问题。本文就来详细总结一下这些问题出现的原因,以及解决方法,主...

尼古拉斯.赵四的博客 1702

android 64位so和32位so混合,android ndk混合使用32和64位so库的尝试和总结

前言首先要知道,64位的设备是兼容32位so文件的,目前很多主流app都是只在app中放置32位so,目的是减小apk的打包体积,弊端就是在64位设备上运行时不能充分发挥64位cpu的计算能力。但是我们项目没有这么做,而是在app中同时放了32和64位so,导致apk的体积暴增,原因是app中有3D图形加载比较耗cpu,因此在64位设备上运行为了实际体验使用64位的so,而其他功能如mp3转码,p...

weixin_39960116的博客 2601

Android so加载流程源码分析

例如:本文对Android中so的加载进行了深入分析。通过分析相关源码,了解linker是如何将so文件加载到内存、如何进行链接操作。由于水平有限,难免有所疏忽,分析不够到位或者错误的地方,还请指正。以上就是今天要讲的内容,完成了so的加载分析,希望对大家有帮助,分析不到位的地方,还请见谅。

wllwzl的博客 786

【安卓开机启动】安卓JVM加载so库流程

安卓JVM加载so库流程 好久没有写点东西发了,工作中的事情有点杂,也找不到整块东西可以写的。 最近调查了一个问题,稍微追了一下流程,这里记录一下。 1. 问题背景 由于我们支持的设备相对比竞品,zygote进程多占用了好几倍的内存空间。通过dump meminfo后发现,我们的设备在so库,ttf,和unkonwn mmap的内存空间相比竞品一共大了20多M,其中so库多了15M左右。 通过查看zygote进程的smaps,确定了占用空间最大的几个so库确实是我们自己的。虽然确定了内存占用大的原因,还是得

qq_23542165的博客 4464

【移动安全基础篇】——18、elf结构详解

1.  来自于 Linux 的 的 elf Android 上的 so(elf)与 Linux 上的有 99%的相似,其中的知识点和结构是可以互通的。 2. Elf  的链接视图 Elf 在加载前和加载后的结构是不一样的,这就给加密提供了方便。 链接执行的时候,shdr 中的表将会被映射到 phdr 中,里面有 3 个头非常重要elf_header,program header,secti...

Fly_鹏程万里 767

Android Native So加壳技术

这是13年12月份做的一个项目,难度相对较大,花了一个月的时间,不断试错,最后终于在元旦前晚完成,整理一下写出来,部分细节出于公司技术保护所以没有细说。 目前市面上针对Apk的保护主要是基于Dex,公开的有DexGuard、梆梆、爱加密、ApkProtect等,私底下相信很多涉及到技术保密的App开发商都在做自己的保护策略。 而针对so的保护就相对滞后了一些,这里有so在app中扮演的

hwuyule的专栏 1364
上一篇: android studio 创建签名Key was created with errors:Warning: JKS 密钥库使用专用格式。建议使用 keytool
下一篇: Android Studio 关联Module打包成aar和使用本地Maven仓库
feipengwang6666
博客等级 码龄12年 22粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feipengwang6666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值