首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android so 加载原理分析

(void * handle); //关闭动态库 对于动态库加载过程先通过dlopen()打开动态库文件,再通过dlsym()获取动态库对象地址加载完成则需要dlclose()关闭动态库。...会先以一个Linux的例子描述native层加载动态链接库的过程, 再从Java层由浅入深分析System.loadLibrary 首先我们知道在Android(Java)中加载一个动态链接库非常简单...# Linux 系统加载动态库过程分析 Android是基于Linux系统的,那么在Linux系统下是如何加载动态链接库的呢?...上面就是Linux环境下创建动态库,加载并使用动态库的全部过程。 由于Android基于Linux系统,所以我们有理由猜测Android系统底层也是通过这种方式加载并使用动态库的。...我们一般使用JNI_VERSION_1_4即可 Android动态库的加载Linux一致使用dlopen系列函数,通过动态库的句柄和函数名称来调用动态库的函数

7.5K31

android 加载so过程分析

在实现android插件化过程中,在插件代码中加载so时出现了一些问题,因此特地研究了一下android系统中加载so的过程,记录下来,整理成文。...在android系统中,加载so一般会调用System.loadLibrary(name)或者是System.load(path),这两个函数都可以用来加载so文件,区别在于System.loadLibrary...这两个函数本质上都是一样的,只是搜索so的搜索目录略有差别。下面以System.loadLibrary函数为例来分析加载so的实现原理。...的真正的文件路径;2:调用nativeLoad函数去实现真正的so加载;这里会牵扯到一个问题,如何通过so的名称去ClassLoader拿到so真正的文件路径?...so(findSharedLibEntry),如果已经加载过了,那么直接返回即可;如果没有加载,那么重新加载一遍,加载的过程可以用下面的流程来描述:调用dlopen() 打开一个so文件,取得该so的文件句柄

52221
您找到你想要的搜索结果了吗?
是的
没有找到

LiteAVSDK集成,动态加载so

二、动态加载so 随着项目业务越来越多,对APK 体积大小要求尽可能的瘦身,通常可以考虑采用在线加载的方式减少最终 apk 安装包的大小。...上传 SO 文件 将 SDK 压缩包中的 so 文件上传到 CDN,并记录下载地址,比如 http://xxx.com/so_files.zip。...image.png 1、这三个so库必需要在本地加载。 image.png 2、这些so库需要按照如下顺序动态加载。...解决办法就是:先把一个32位的so文件打进安装包,其它so库在运行时动态加载,这样App启动的是32位进程,动态加载so库也是32位版本,运行时就不再闪退。...五、资源 相关文章: LiteAVSDK商业版6.6+,安卓集成动态加载so 动态加载so库的实现方法与问题处理 Android 的 so 文件加载机制提问源码总结参考资料 demo下载

8.5K3510

Linker加载so失败问题分析

通过根据tombstone中的/proc//maps的虚拟内存地址与日志打印的地址进行对比,可以发现最为符号表地址的s并没有指向so文件在虚拟内存中的地址段,因此可以怀疑,so加载确实出现了异常...唯一可能的问题,就是先加载了旧的so,之后下载新的so进行了热更新。 我们先看下微视中是否有这种现象。要观察这种现象,我们可以打开linker自身的调试开关,开启so加载的日志。...那么,我们重新复现问题,可以看到如下so加载过程: ? 这个过程表明:旧的so先被加载了,然后下载了新版本的so,并进行了替换。 这个过程有什么问题呢?...: 1. cp new.so old.so,文件的inode号没有改变,dentry找到是新的so,但是cp过程中会把老的so截断为0,这时程序再次进行加载的时候,如果需要的文件偏移大于新的so地址范围会生成...如果so有升级,先不加载旧的so,等新的so下载完成之后再加载; 2. 可以先加载旧的so,但是下载了新的so之后,要删除旧的so,再进行替换。

1.7K20

Linker加载so失败问题分析

中的/proc//maps的虚拟内存地址与日志打印的地址进行对比,可以发现最为符号表地址的s并没有指向so文件在虚拟内存中的地址段,因此可以怀疑,so加载确实出现了异常。...so加载到底有什么特殊性。...唯一可能的问题,就是先加载了旧的so,之后下载新的so进行了热更新。 我们先看下微视中是否有这种现象。要观察这种现象,我们可以打开linker自身的调试开关,开启so加载的日志。...: cp new.so old.so,文件的inode号没有改变,dentry找到是新的so,但是cp过程中会把老的so截断为0,这时程序再次进行加载的时候,如果需要的文件偏移大于新的so地址范围会生成...; 可以先加载旧的so,但是下载了新的so之后,要删除旧的so,再进行替换。

1.5K10

Java 动态加载 so 的解决方案

业务场景有对so实现动态加载/替换的需求,但Java并没有直接动态加载so的机制。本文将深度剖析Java加载so的实现机制,并提出一套Java动态加载so的方案。...那我们如何实现Java框架中的so动态加载呢? 一、C++如何实现so动态加载 C++框架实现so的动态加载比较简单,通过dlopen得到加载so的句柄(void *),dlsym获得函数地址。...跟进os::dll_load(),有三个不同实现分别对应三个平台os_linux, os_windows, os_solaris,这里只看os_linux.cpp // ... void * os::dll_load...到这里恍然,dlopen(filename, RTLD_LAZY)即是linux下Java System.load的最终实现,其实跟C++加载动态链接库是一样的。...libproxy.so中会维护一个map, key为Java框架中传入的String,value为包含dlopen返回的句柄,dlsym拿到的函数地址以及相关的上下文信息。

8.5K20

linux 什么是SO文件

下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...2.怎么生成以及使用一个so动态库文件? 3.地址空间,以及线程安全. 4.库的初始化,解析: 5.使用我们自己库里的函数替换系统函数: 1.so文件是什么?...,全部使用相对地址,故而代码可以被加载加载到内存的任意 位置,都可以正确的执行。...下面的还没细看,汗 4.库的初始化,解析: windows下的动态库加载,卸载都会有初始化函数以及卸载函数来完成库的初始化以及资源回收,linux当然也可以实现。.../ts 关键就在LD_PRELOAD上了,这个路径指定的so将在所有的so之前加载,并且符号会覆盖后面加载so文件中的符号。如果可执行文件的权限不合适(SID),这个变量会被忽略。 执行:.

5.6K20

Android So动态加载 优雅实现与原理分析

开源地址: https://github.com/AnyMarvel/ManPinAPP 本文默认认为大家对JNI开发有一定的了解。...apk 安装目录下; System.load(String pathName) :参数为 so 库在磁盘中完整的路径,可以加载自定义外部 so 库文件; 使用第三方库ReLinker,有so加载成功、...Android 的 so 文件加载机制 从System.loadlibrary() 方法分析so文件的加载流程,如下图所示: [jufml8v3gw.png?...总结: 到此处,那么so文件的动态加载(也可以叫做So文件的热修复)已经介绍完了,起始还是比较简单的,只是修改了so文件列表的数组映射,加载了需要使用的真实的so文件....安利 欢迎大家的start 开源地址: https://github.com/AnyMarvel/ManPinAPP 热修复so代码包位置: com.google.android.apps.photolab.storyboard.soloader.LoadLibraryUtil

5.6K64

Android 开发中如何动态加载 so 库文件

我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了。...在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静态加载往往是在 apk 或 jar 包中调用so文件时,都要将对应 so 文件打包进 apk 或 jar 包。...动态加载的优点 静态加载,不灵活,apk 包有可能大。所以采用动态加载 so 库文件,有以下几点好处: 灵活,so 文件可以动态加载,不是绑定死的,修改方便,so 库有问题,我们可以动态更新。...so 库文件很大的话,采用动态加载可以减少 apk 的包,变小。 其实我们常用第三方 so 库,单个可能没问题,如果多个第三方 so 库文件,同时加载可能会出现冲突,而动态加载就能够解决这一问题。...注意路径陷阱 动态加载 so 库文件,并不是说可以把文件随便存放到某个 sdcard 文件目录下,这样做既不安全,系统也加载不了。

5K101

Android So动态加载 优雅实现与原理分析

开源地址: https://github.com/AnyMarvel/ManPinAPP 本文默认认为大家对JNI开发有一定的了解。...但是采取常规load方式,改动有点大,底层jar包,第三库不好改加载路径。 在应用启动的时,一次注入本地so路径path,待程序使用过程中so准备后安全加载。(原因后面分析,我们先看下实践) 一....Android 的 so 文件加载机制 从System.loadlibrary() 方法分析so文件的加载流程,如下图所示: ?...总结: 到此处,那么so文件的动态加载(也可以叫做So文件的热修复)已经介绍完了,其实还是比较简单的,只是修改了so文件列表的数组映射,加载了需要使用的真实的so文件....安利 欢迎大家的start 开源地址: https://github.com/AnyMarvel/ManPinAPP 热修复so代码包位置: com.google.android.apps.photolab.storyboard.soloader.LoadLibraryUtil

1.7K20

Linux地址空间&&虚拟地址

1.2 虚拟地址理解 每一个进程除了要把代码和数据加载到内存之外,对于当前的操作系统来讲,系统当中会为每一个进程创建一个地址空间。 地址空间在操作系统里面。...如果当前还有其他程序,都在物理内存中,每一个程序都在物理内存中加载的话,也就要求每一个进程所对应的代码和数据在物理内存的哪一个位置都得记录下来。...实际物理内存中的代码区,数据区、堆区、栈区、共享区、命令行参数和环境变量,对一个进程来讲可能是乱序的,那么再加载其他进程也是乱序的。...上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址! 在最开始的时候,地址空间的页表里面的数据从哪里来? 程序一旦加载到内存就有地址。...所以虚拟地址相同而物理地址不同。 3. 进程调度 Linux中的nice值并不是能任意调度的,而是从-20到19,这40个数字之间变换。

13010

动态加载so库的实现方法与问题处理

按App加载so库的正常流程,在编译前就要把so文件放到工程的jniLibs目录,这样会把so直接打包进apk安装包,然后App在启动时就会预先加载so库。...接着在手机上安装这个apk并启动App,如果App的运行不涉及到jni方法的调用,那相安无事就当so不存在;如果App打开了某个页面,而该页面又需要调用jni方法,则App自动到指定地址下载需要的so文件...so,只从用户目录加载so文件。...显然上面采用动态加载的App属于第三种情况,此时启动了64位进程,但动态加载so库却是32位的,所以会闪退。...so库在运行时动态加载,这样App启动的是32位进程,动态加载so库也是32位版本,运行时就不再闪退; 点此查看Android开发笔记的完整目录

3.4K20
领券