一种应用程序运行时加载动态库的方法和装置制造方法及图纸

技术编号:39847422 阅读:9 留言:0更新日期:2023-12-29 16:45
本发明专利技术提供了一种应用程序运行时加载动态库的方法和装置,涉及应用程序开发技术领域,方法包括:创建提供插入新路径方法和加载动态库方法的代理类;为插入新路径方法和加载动态库方法添加同步锁以保证线程安全;在应用程序打包时识别出系统插入新路径和加载动态库的字节码,将该字节码替换成代理类中的方法来实现运行时加载动态库

【技术实现步骤摘要】
一种应用程序运行时加载动态库的方法和装置


[0001]本专利技术涉及
Android
应用程序开发
,尤其涉及一种应用程序运行时加载动态库的方法和装置


技术介绍

[0002]在
Android
开发中,经常需要在运行时加载一些动态库,以调用
native
代码功能

有些情况下动态库并不会在
apk
安装包内被安装,而是在需要时才下载再加载

目前常见软件运行时加载动态库的方案是
hook
系统的
classloader
,在动态库的查找路径中插入新的路径,然后在加载动态库时,系统会自动从新的路径下查找新的动态库

[0003]但是这种方案在多线程环境下可能会导致线程同步从而引起软件崩溃的问题,因为插入新路径和查找动态库可能在两个线程中同时执行,此时就会导致无法正确地查找到正确的动态库来加载

目前解决这种线程同步的最简单的方法就是针对调用的地方加同步锁,如果插入新路径和加载动态库是在软件设计方的代码中进行的,则可以简单地枷锁进行控制,但如果是在第三方
SDK
中实现的,由于第三方
SDK
中代码软件设计方无法进行修改,则无法避免线程同步的出现


技术实现思路

[0004]有鉴于此,本专利技术提供一种应用程序运行时加载动态库的方法和装置,以解决上述提及的至少一个问题

[0005]为了实现上述目的,本专利技术采用以下方案:
[0006]根据本专利技术的第一方面,提供一种应用程序运行时加载动态库的方法,所述方法包括:创建提供插入新路径方法和加载动态库方法的代理类;为所述插入新路径方法和所述加载动态库方法添加同步锁以保证线程安全;在应用程序打包时识别出系统插入新路径的第一字节码,将所述第一字节码替换调用所述代理类的插入新路径方法,同时识别出系统加载动态库的第二字节码,将所述第二字节码替换成调用所述代理类的加载动态库方法;软件运行时通过调用所述代理类中的插入新路径方法和加载动态库方法来实现运行时加载动态库

[0007]作为本专利技术的一个实施例,上述方法中为所述插入新路径方法和所述加载动态库方法添加同步锁以保证线程安全之后,所述方法还包括:添加一个
Gradle
任务,在应用程序打包时的
Transform
阶段遍历应用程序所有
class
文件

[0008]作为本专利技术的一个实施例,上述方法中识别出系统插入新路径的第一字节码,将所述第一字节码替换调用所述代理类的插入新路径方法包括:通过
ASM
解析
class
文件的字节码结构;遍历
ASM
解析得到的字节码结构,检测是否有插入新路径方法的调用;响应于检测到有插入新路径方法的调用,通过
ASM
修改所述
class
文件,将插入新路径方法的调用修改为所述代理类中的插入新路径方法

[0009]作为本专利技术的一个实施例,上述方法中识别出系统加载动态库的第二字节码,将
所述第二字节码替换成调用所述代理类的加载动态库方法包括:通过
ASM
解析
class
文件的字节码结构;遍历
ASM
解析得到的字节码结构,检测是否有加载动态库方法的调用;响应于检测到有加载动态库方法的调用,通过
ASM
修改所述
class
文件,将加载动态库方法的调用修改为所述代理类中的加载动态库方法

[0010]根据本专利技术的第二方面,提供一种应用程序运行时加载动态库的装置,所述装置包括:创建单元,用于创建提供插入新路径方法和加载动态库方法的代理类;同步单元,用于为所述插入新路径方法和所述加载动态库方法添加同步锁以保证线程安全;替换单元,用于在应用程序打包时识别出系统插入新路径的第一字节码,将所述第一字节码替换调用所述代理类的插入新路径方法,同时识别出系统加载动态库的第二字节码,将所述第二字节码替换成调用所述代理类的加载动态库方法,使得软件运行时通过调用所述代理类中的插入新路径方法和加载动态库方法来实现运行时加载动态库

[0011]作为本专利技术的一个实施例,上述装置还包括:遍历单元,用于添加一个
Gradle
任务,在应用程序打包时的
Transform
阶段遍历应用程序所有
class
文件

[0012]作为本专利技术的一个实施例,上述替换单元包括:第一解析模块,用于通过
ASM
解析
class
文件的字节码结构;第一检测模块,用于遍历
ASM
解析得到的字节码结构,检测是否有插入新路径方法的调用;第一修改模块,用于响应于检测到有插入新路径方法的调用,通过
ASM
修改所述
class
文件,将插入新路径方法的调用修改为所述代理类中的插入新路径方法

[0013]作为本专利技术的一个实施例,上述替换单元包括:第二解析模块,通过
ASM
解析
class
文件的字节码结构;第二检测模块,遍历
ASM
解析得到的字节码结构,检测是否有加载动态库方法的调用;第二修改模块,响应于检测到有加载动态库方法的调用,通过
ASM
修改所述
class
文件,将加载动态库方法的调用修改为所述代理类中的加载动态库方法

[0014]根据本专利技术的第三方面,提供一种电子设备,包括存储器

处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,处理器执行所述计算机程序时实现上述方法的步骤

[0015]根据本专利技术的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤

[0016]由上述技术方案可知,本专利技术提供的应用程序运行时加载动态库的方法和装置,通过在应用程序打包时识别出插入新路径和加载动态库方法的字节码,然后再替换成调用代理类的方法插入路径和加载动态库,且由于代理类中的插入新路径方法和加载动态库方法添加了同步锁,所以可以在应用程序运行过程中保证线程的安全,在打包时通过字节码替换的方式,也克服了第三方
SDK
源代码无法修改的问题

附图说明
[0017]为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.
一种应用程序运行时加载动态库的方法,其特征在于,所述方法包括:创建提供插入新路径方法和加载动态库方法的代理类;为所述插入新路径方法和所述加载动态库方法添加同步锁以保证线程安全;在应用程序打包时识别出系统插入新路径的第一字节码,将所述第一字节码替换调用所述代理类的插入新路径方法,同时识别出系统加载动态库的第二字节码,将所述第二字节码替换成调用所述代理类的加载动态库方法;软件运行时通过调用所述代理类中的插入新路径方法和加载动态库方法来实现运行时加载动态库
。2.
如权利要求1所述的应用程序运行时加载动态库的方法,其特征在于,为所述插入新路径方法和所述加载动态库方法添加同步锁以保证线程安全之后,所述方法还包括:添加一个
Gradle
任务,在应用程序打包时的
Transform
阶段遍历应用程序所有
class
文件
。3.
如权利要求2所述的应用程序运行时加载动态库的方法,其特征在于,所述识别出系统插入新路径的第一字节码,将所述第一字节码替换调用所述代理类的插入新路径方法包括:通过
ASM
解析
class
文件的字节码结构;遍历
ASM
解析得到的字节码结构,检测是否有插入新路径方法的调用;响应于检测到有插入新路径方法的调用,通过
ASM
修改所述
class
文件,将插入新路径方法的调用修改为所述代理类中的插入新路径方法
。4.
如权利要求2所述的应用程序运行时加载动态库的方法,其特征在于,所述识别出系统加载动态库的第二字节码,将所述第二字节码替换成调用所述代理类的加载动态库方法包括:通过
ASM
解析
class
文件的字节码结构;遍历
ASM
解析得到的字节码结构,检测是否有加载动态库方法的调用;响应于检测到有加载动态库方法的调用,通过
ASM
修改所述
class
文件,将加载动态库方法的调用修改为所述代理类中的加载动态库方法
。5.
一种应用程序运行时加载动态库的装置,其特征在于,所述装置包括:创建单元,用于创建提供插入新路径方法和加载动态库方法的代理类;同步单元,用于为所述插入新路径...

【专利技术属性】
技术研发人员:彭露
申请(专利权)人:探探科技北京有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1