动态加载插件的方法、装置及电子设备制造方法及图纸

技术编号:29702696 阅读:43 留言:0更新日期:2021-08-17 14:30
本发明专利技术提供了一种动态加载插件的方法、装置及电子设备,该方法包括:响应于目标应用的运行事件,将指定位置的插件数据加载至第一内存地址中,以加载空DexFile对象的方式在空DexFile对象的cookie中记录第一内存地址;将记录有第一内存地址的空DexFile对象保存至类加载器的元素数组中,以在类加载器启动时调用插件数据。本发明专利技术可以缓解Android应用运行时动态加载插件会降低应用运行效率的问题,提高了插件数据存入类加载器的效率,在不影响应用运行的情况下能够快速加载插件。

【技术实现步骤摘要】
动态加载插件的方法、装置及电子设备
本专利技术涉及插件加载
,尤其是涉及一种动态加载插件的方法、装置及电子设备。
技术介绍
在Android5.0之后,开始使用新的Android运行环境ART(AndroidRunTime)来替代之前的Dalvik运行环境,ART机制与Dalvik机制不同,在Dalvik虚拟机中,系统源码文件是libdvm.so,采用即时编译(JIT,JustInTime)的方案,即在应用运行时通过即时编译器将字节码转换为机器码,该编译方案会影响应用的运行效率;在ART虚拟机中,系统源码文件是libart.so,采用预编译(AOT,AheadOfTime)的方案,即在应用第一次安装时字节码就会预先编译成机器码,该编译方案能够提高应用的运行效率。有时为了实现一些特定的功能,应用在运行时需要通过API接口动态调用外部的插件,即动态加载插件。然而,在通过API接口调用外部插件进行动态加载时也会触发系统的AOT编译优化,导致加载过慢,应用在运行时内存消耗严重,影响整个应用的运行效率和流畅度,甚至出现应用卡顿等现象,特别是在性能较差的低版本机型尤其明显。
技术实现思路
有鉴于此,本专利技术的目的在于提供一种动态加载插件的方法、装置及电子设备,以缓解Android应用运行时动态加载插件会降低应用运行效率的问题,并提高插件数据存入类加载器的效率,在不影响应用运行的情况下能够快速加载插件。第一方面,本专利技术实施例提供了一种动态加载插件的方法,所述方法应用于安装有安卓系统的电子设备,所述电子设备预存有空DexFile对象且安装有目标应用,所述目标应用对应的指定位置存储有目标应用的插件数据,所述空DexFile对象包含有DexFile的数据结构;所述方法包括:响应于所述目标应用的运行事件,将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址;将记录有所述第一内存地址的所述空DexFile对象保存至类加载器的元素数组中,以在所述类加载器启动时调用所述插件数据。结合第一方面,本实施例提供了第一方面的第一种可能的实施方式,其中,将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址的步骤,包括:通过所述目标应用的主线程对应的第一子线程将所述指定位置的插件数据加载至第一内存地址中;通过所述主线程对应的第二子线程在第二内存地址中加载所述空DexFile对象;当所述第一子线程和所述第二子线程结束,通过所述主线程获取所述插件数据的cookie,将所述空DexFile对象中的cookie替换为所述插件数据的cookie;其中,所述插件数据的cookie中记录有所述第一内存地址。结合第一方面的第一种可能的实施方式,本实施例提供了第一方面的第二种可能的实施方式,其中,所述安卓系统中的系统libart.so允许所述目标应用通过dlopen函数访问。结合第一方面,本实施例提供了第一方面的第三种可能的实施方式,其中,所述安卓系统中的系统libart.so禁止所述目标应用通过dlopen函数访问,所述系统libart.so的指定函数中预设有hook断点;将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址的步骤,包括:通过所述目标应用的主线程将所述指定位置的插件数据加载至第一内存地址中;通过所述主线程调用DexFile的加载器加载所述空DexFile对象,在加载所述空DexFile对象的过程中,通过所述libart.so的指定函数中的hook断点获取所述第一内存地址,将所述第一内存地址记录于所述空DexFile对象的cookie中。结合第一方面的第三种可能的实施方式,本实施例提供了第一方面的第四种可能的实施方式,其中,所述指定函数包括open函数和mmap函数;在加载所述空DexFile对象的过程中,通过所述libart.so的指定函数中的hook断点获取所述第一内存地址的步骤,包括:通过open函数获取所述空DexFile对象的路径信息,检测所述路径信息是否为所述空DexFile对象的存储路径,如果是,调用mmap函数为所述空DexFile对象申请内存空间,向所述mmap函数返回所述第一内存地址。结合第一方面的第四种可能的实施方式,本实施例提供了第一方面的第五种可能的实施方式,其中,所述指定函数还包括:fork函数;所述方法还包括:通过fork函数中断AOT优化进程。结合第一方面,本实施例提供了第一方面的第六种可能的实施方式,其中,所述方法还包括:按照预设转换规则将插件数据源码对应的数据转换为图片的像素数据,得到插件数据图片;将所述插件数据图片作为加密后的插件数据存储至所述电子设备的指定位置。结合第一方面的第六种可能的实施方式,本实施例提供了第一方面的第七种可能的实施方式,其中,将所述指定位置的插件数据加载至所述内存中的步骤之前,所述方法还包括:对所述插件数据图片进行所述预设转换规则的逆转换操作,得到解密后的插件数据。结合第一方面,本实施例提供了第一方面的第八种可能的实施方式,其中,所述指定位置为所述目标应用的指定文件的尾部位置或所述目标应用的指定目录。第二方面,本专利技术实施例还提供一种动态加载插件的装置,所述装置应用于安装有安卓系统的电子设备,所述电子设备预存有空DexFile对象且安装有目标应用,所述目标应用对应的指定位置存储有目标应用的插件数据,所述空DexFile对象包含有DexFile的数据结构;所述装置包括:处理模块,用于响应于所述目标应用的运行事件,将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址;保存模块,用于将记录有所述第一内存地址的所述空DexFile对象保存至类加载器的元素数组中,以在所述类加载器启动时调用所述插件数据。第三方面,本专利技术实施例还提供一种电子设备,包括处理器和存储器,所述存储器存储有能够被所述处理器执行的计算机可执行指令,所述处理器执行所述计算机可执行指令以实现如前述实施例中任一项所述的动态加载插件的方法。第四方面,本专利技术实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令在被处理器调用和执行时,计算机可执行指令促使处理器实现如前述实施例中任一项所述的动态加载插件的方法。本专利技术实施例带来了以下有益效果:本专利技术实施例提供的动态加载插件的方法、装置及电子设备,响应于目标应用的运行事件,将指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录第一内存地址;将记录有第一内存地址的空DexFile对象保存至类加载器的元素数组中,以在类加载器本文档来自技高网...

【技术保护点】
1.一种动态加载插件的方法,其特征在于,所述方法应用于安装有安卓系统的电子设备,所述电子设备预存有空DexFile对象且安装有目标应用,所述目标应用对应的指定位置存储有目标应用的插件数据,所述空DexFile对象包含有DexFile的数据结构;所述方法包括:/n响应于所述目标应用的运行事件,将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址;/n将记录有所述第一内存地址的所述空DexFile对象保存至类加载器的元素数组中,以在所述类加载器启动时调用所述插件数据。/n

【技术特征摘要】
1.一种动态加载插件的方法,其特征在于,所述方法应用于安装有安卓系统的电子设备,所述电子设备预存有空DexFile对象且安装有目标应用,所述目标应用对应的指定位置存储有目标应用的插件数据,所述空DexFile对象包含有DexFile的数据结构;所述方法包括:
响应于所述目标应用的运行事件,将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址;
将记录有所述第一内存地址的所述空DexFile对象保存至类加载器的元素数组中,以在所述类加载器启动时调用所述插件数据。


2.根据权利要求1所述的方法,其特征在于,将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址的步骤,包括:
通过所述目标应用的主线程对应的第一子线程将所述指定位置的插件数据加载至第一内存地址中;
通过所述主线程对应的第二子线程在第二内存地址中加载所述空DexFile对象;
当所述第一子线程和所述第二子线程结束,通过所述主线程获取所述插件数据的cookie,将所述空DexFile对象中的cookie替换为所述插件数据的cookie;其中,所述插件数据的cookie中记录有所述第一内存地址。


3.根据权利要求2所述的方法,其特征在于,所述安卓系统中的系统libart.so允许所述目标应用通过dlopen函数访问。


4.根据权利要求1所述的方法,其特征在于,所述安卓系统中的系统libart.so禁止所述目标应用通过dlopen函数访问,所述系统libart.so的指定函数中预设有hook断点;
将所述指定位置的插件数据加载至第一内存地址中,以加载所述空DexFile对象的方式在所述空DexFile对象的cookie中记录所述第一内存地址的步骤,包括:
通过所述目标应用的主线程将所述指定位置的插件数据加载至第一内存地址中;
通过所述主线程调用DexFile的加载器加载所述空DexFile对象,在加载所述空DexFile对象的过程中,通过所述libart.so的指定函数中的hook断点获取所述第一内存地址,将所述第一内存地址记录于所述空DexFile对象的cookie中。


5.根据权利要求4所述的方法,其特征在于,所述指定函数包括open函数和mmap函数;
在加...

【专利技术属性】
技术研发人员:舒文梁海滨张为兰
申请(专利权)人:网易杭州网络有限公司
类型:发明
国别省市:浙江;33

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

1