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

Android so 加载原理分析

会先以一个Linux的例子描述native层加载动态链接库的过程, 再从Java层由浅入深分析System.loadLibrary 首先我们知道在Android(Java)中加载一个动态链接库非常简单...# Linux 系统加载动态库过程分析 Android是基于Linux系统的,那么在Linux系统下是如何加载动态链接库的呢?...extern "C" int mul(int a, int b) { return a*b; } 对于C++文件函数前的 extern “C” 不能省略,原因是C++编译之后会修改函数名,之后动态加载函数的时候会找不到该函数...上面就是Linux环境下创建动态库,加载并使用动态库的全部过程。 由于Android基于Linux系统,所以我们有理由猜测Android系统底层也是通过这种方式加载并使用动态库的。...我们一般使用JNI_VERSION_1_4即可 Android动态库的加载Linux一致使用dlopen系列函数,通过动态库的句柄和函数名称来调用动态库的函数

7.8K31

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的文件句柄

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

    LiteAVSDK集成,动态加载so

    二、动态加载so 随着项目业务越来越多,对APK 体积大小要求尽可能的瘦身,通常可以考虑采用在线加载的方式减少最终 apk 安装包的大小。...优图实验室有如下特殊加载要求(6.8商业版已经优化了这里,祥见《LiteAVSDK商业版6.6+,安卓集成动态加载so》)。...image.png 1、这三个so库必需要在本地加载。 image.png 2、这些so库需要按照如下顺序动态加载。...解决办法就是:先把一个32位的so文件打进安装包,其它so库在运行时动态加载,这样App启动的是32位进程,动态加载so库也是32位版本,运行时就不再闪退。...五、资源 相关文章: LiteAVSDK商业版6.6+,安卓集成动态加载so 动态加载so库的实现方法与问题处理 Android 的 so 文件加载机制提问源码总结参考资料 demo下载

    8.6K3510

    Linker加载so失败问题分析

    so加载到底有什么特殊性。...唯一可能的问题,就是先加载了旧的so,之后下载新的so进行了热更新。 我们先看下微视中是否有这种现象。要观察这种现象,我们可以打开linker自身的调试开关,开启so加载的日志。...加载过程: [6e193664b0c3bd7_mh1542192899167.jpg] 这个过程表明:旧的so先被加载了,然后下载了新版本的so,并进行了替换。...更近一步,我们自己写个demo测试下刚才的问题(2个按钮,一个加载指定so,一个调用so中的native方法): [图片14.png] 代码不能再简单了: [图片15.png] 正常加载so然后执行native...; 可以先加载旧的so,但是下载了新的so之后,要删除旧的so,再进行替换。

    1.6K10

    Linker加载so失败问题分析

    唯一可能的问题,就是先加载了旧的so,之后下载新的so进行了热更新。 我们先看下微视中是否有这种现象。要观察这种现象,我们可以打开linker自身的调试开关,开启so加载的日志。...那么,我们重新复现问题,可以看到如下so加载过程: ? 这个过程表明:旧的so先被加载了,然后下载了新版本的so,并进行了替换。 这个过程有什么问题呢?...根据《理解inode》一文我们可以得知,linux的文件系统使用的inode机制支持了so文件的热更新(动态更新),即每个文件都有一个唯一的inode号,打开文件后使用inode号区分文件而不是文件名:...正常加载so然后执行native方法都是ok的,使用rm+mv替换或者adb push替换也都是ok的,最后再按照错误的方法操作,步骤为: 1. 启动app,点击加载so; 2. ...如果so有升级,先不加载旧的so,等新的so下载完成之后再加载; 2. 可以先加载旧的so,但是下载了新的so之后,要删除旧的so,再进行替换。

    1.7K20

    Java 动态加载 so 的解决方案

    业务场景有对so实现动态加载/替换的需求,但Java并没有直接动态加载so的机制。本文将深度剖析Java加载so的实现机制,并提出一套Java动态加载so的方案。...这里动态加载so,是指当前so提供服务的时候,需要动态加载另一个同名so,并对旧的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++加载动态链接库是一样的。

    8.8K20

    linux 什么是SO文件

    下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。   ...下面的还没细看,汗 4.库的初始化,解析: windows下的动态库加载,卸载都会有初始化函数以及卸载函数来完成库的初始化以及资源回收,linux当然也可以实现。.../e&连续执行两次,那么初始化函数和解析函数也会执行两次,虽然系统只加载了一次libs.so。 如果sleep时候kill 掉后台进程,那么解析函数不会被执行。.../ts 关键就在LD_PRELOAD上了,这个路径指定的so将在所有的so之前加载,并且符号会覆盖后面加载so文件中的符号。如果可执行文件的权限不合适(SID),这个变量会被忽略。 执行:.

    5.7K20

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

    apk 安装目录下; System.load(String pathName) :参数为 so 库在磁盘中完整的路径,可以加载自定义外部 so 库文件; 使用第三方库ReLinker,有so加载成功、...但是采取常规load方式,改动有点大,底层jar包,第三库不好改加载路径。 在应用启动的时,一次注入本地so路径path,待程序使用过程中so准备后安全加载。(原因后面分析,我们先看下实践) 一....正常加载so使用 有兴趣可以直接查看开源代码:https://github.com/AnyMarvel/ManPinAPP 核心类,修改nativeLibraryDirectories列表,加载需要的so...Android 的 so 文件加载机制 从System.loadlibrary() 方法分析so文件的加载流程,如下图所示: [jufml8v3gw.png?...总结: 到此处,那么so文件的动态加载(也可以叫做So文件的热修复)已经介绍完了,起始还是比较简单的,只是修改了so文件列表的数组映射,加载了需要使用的真实的so文件.

    5.9K64

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

    但是采取常规load方式,改动有点大,底层jar包,第三库不好改加载路径。 在应用启动的时,一次注入本地so路径path,待程序使用过程中so准备后安全加载。(原因后面分析,我们先看下实践) 一....正常加载so使用 有兴趣可以直接查看开源代码:https://github.com/AnyMarvel/ManPinAPP 核心类,修改nativeLibraryDirectories列表,加载需要的so...Android 的 so 文件加载机制 从System.loadlibrary() 方法分析so文件的加载流程,如下图所示: ?...(nativeLibraryDirectories存储了so文件加载的映射表,这里相当于修改了应用加载so的列表) 61 /** List of native library directories...总结: 到此处,那么so文件的动态加载(也可以叫做So文件的热修复)已经介绍完了,其实还是比较简单的,只是修改了so文件列表的数组映射,加载了需要使用的真实的so文件.

    1.9K20

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

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

    5.2K101
    领券