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

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

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

    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进行了热更新。 我们先看下微视中是否有这种现象。要观察这种现象,我们可以打开linker自身的调试开关,开启so加载的日志。...那么,我们重新复现问题,可以看到如下so加载过程: ? 这个过程表明:旧的so先被加载了,然后下载了新版本的so,并进行了替换。 这个过程有什么问题呢?...更近一步,我们自己写个demo测试下刚才的问题(2个按钮,一个加载指定so,一个调用so中的native方法): ? 代码不能再简单了: ?...正常加载so然后执行native方法都是ok的,使用rm+mv替换或者adb push替换也都是ok的,最后再按照错误的方法操作,步骤为: 1. 启动app,点击加载so; 2. ...如果so有升级,先不加载旧的so,等新的so下载完成之后再加载; 2. 可以先加载旧的so,但是下载了新的so之后,要删除旧的so,再进行替换。

    1.7K20

    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

    Java 动态加载 so 的解决方案

    业务场景有对so实现动态加载/替换的需求,但Java并没有直接动态加载so的机制。本文将深度剖析Java加载so的实现机制,并提出一套Java动态加载so的方案。...这里动态加载so,是指当前so提供服务的时候,需要动态加载另一个同名so,并对旧的so进行替换,而不影响现有服务。...那我们如何实现Java框架中的so动态加载呢? 一、C++如何实现so动态加载 C++框架实现so的动态加载比较简单,通过dlopen得到加载so的句柄(void *),dlsym获得函数地址。...so的动态加载。...三、Java中动态加载so 我们没法通过System.load()重复加载同名so或者直接动态替换so,也没法在Java层拿到dlopen返回的句柄,所以我们没法在Java代码层实现so的动态加载

    8.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 库文件

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

    5.1K101

    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.8K20

    Android 4.x加载so失败问题原因分析

    1 so 加载过程 so 加载的过程可以参考小米的系统工程师的文章loadLibrary动态库加载过程分析[1] 2 问题分析 2.1 问题 年前项目里新加了一个 so库,但发现native 方法的找不到的...4.x系统里,如果so 文件是在应用启动时加载的,但使用时机却在后面的时间点,so加载进手机的内存可能会被系统由于资源紧张而回收掉,这种情况下,可以通过重新加载一次 so文件来减少相关的 crash,...但我们的 so的 crash 明显是不属于这种情况的,因为我们是通过 System.load() 方法加载so文件后,就调用相关的方法,这时内存肯定是还在的。...so加载用了 Relinkder[2]。...不存在这个so 和 方法名有问题(商用的应用应该不会有这个问题的)外,还有两个原因:•so 加载进系统的内存被系统由于资紧张而回收了,这种情况下直接再load一下 so 文件就可以解决大部分;•so 文件有问题

    1K40

    Android 的 so 文件加载机制提问源码总结参考资料

    那么,要理清 so 文件的加载流程,或者说,要找出系统是去哪些地址加载 so 文件的,就需要梳理清这些方法: loader.findLibrary() doLoad() 第一个方法用于寻找 so 文件,...所以,我们想要梳理清楚 so 文件的加载流程,findLibrary() 是关键。...abi 兼容 so 文件加载的流程,及应用运行在 32 位或 64 位的依据我们都梳理完了,以上内容足够掌握什么场景下,该去哪些目录下加载 so 文件的判断能力了。...而 native 层在加载 so 文件之前,会去解析这个 header 信息,当发现,如果当前进程运行在 64 位时,但要加载so 文件却是 32 位的,就会报 xxx is 32-bit instead...() 加载 so 文件时,流程如下: 先到 nativeLibraryDirectories 指向的目录中寻找,是否存在且可用的 so 文件,有则直接加载这里的 so 文件; 上一步没找到的话,则根据当前进程如果是

    2K50

    LiteAVSDK商业版6.6+,安卓集成动态加载so

    一、简介 本篇文章主要介绍集成LiteAVSDK商业版、6.6以上的版本,安卓端采用动态加载so的方式时的写法。 安卓端非商业版aar集成、jar集成,可以参考官方集成文档 。...6.6之前的商业版,如何动态加载so,请参考上一篇文章《LiteAVSDK集成,动态加载so库》。...6.6版本前后动态加载so的差异: 版本 部分so必需在本地 P图的so必需按顺序加载 assets资源文件可否动态加载 6.5- Y Y N 6.6+ N N Y 二、动态加载so 1、下载sdk...点击setLibraryPath条目,调用sdk接口动态加载so。 点击setLicence条目,设置动效Licence。这一步会下载校验licence,请保持网络通畅、给读写权限。..."*/x86/libYTCommon.so" doNotStrip "*/arm64-v8a/libYTCommon.so" } //so没有加载成功,运行会报这个crash,请校验so完整性

    3.4K96
    领券