Linux系统调用AndroidHAL动态库的方法、装置及存储介质与流程

文档序号:26101611发布日期:2021-07-30 18:12阅读:138来源:国知局
Linux系统调用Android HAL动态库的方法、装置及存储介质与流程

本发明涉及操作系统技术领域,尤其涉及一种linux系统调用androidhal动态库的方法、装置及存储介质。



背景技术:

随着android生态在移动端的垄断,基本上所有的移动端soc芯片以及硬件模组等都是只提供适配android系统的解决方案。

android系统虽然是基于linuxkernel建立,但是其采用了bionic以及其他私有核心库,形成了一套封闭生态体系,与目前linux操作系统无法兼容。无法兼容的存在原因之一是,在android8.0之后vendor架构发生调整,将hal接口分为以下两种:

1、动态库直通式;

2、hidlbinder跨进程ipc调用;

基于hal接口的改变,使得androidhal动态库无法与linux操作系统兼容。



技术实现要素:

本发明实施例提供一种linux系统调用androidhal动态库的方法、装置及存储介质,可以采用兼容链接器方式处理android库的链接问题,可以实现linux程序直接链接androidhal动态库。

本发明实施例的第一方面,提供一种linux系统调用androidhal动态库的方法,包括:

通过linux系统程序调用linuxopengles封装库中的任意一个符号function,以及通过linux系统程序调用linuxopengles封装库;

在linuxopengles封装库初始化时调用兼容链接器,所述兼容链接器用于以指定模式打开androidhalopengles封装库;

当linux系统程序调用linuxopengles封装库的中的任意一个function时,基于兼容链接器以指定模式输出androidhal封装库中对应的function。

可选地,在第一方面的一种可能实现方式中,当androidhal的function运行时,判断androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统的glibc等基础库的function是否冲突;

所述linuxglibc属于linux系统基础c库。。

可选地,在第一方面的一种可能实现方式中,若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function不冲突;

则通过兼容链接器直接链接调用android系统bionic等基础库的function。

可选地,在第一方面的一种可能实现方式中,若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function冲突;

则通过兼容链接器hook调用linux系统对应的glibc等基础库的function。

本发明实施例的第二方面,提供一种linux系统调用androidhal动态库的装置,其特征在于,包括:

linux调用模块,用于通过linux系统程序调用linuxopengles封装库中的任意一个符号function,以及通过linux系统程序调用linuxopengles封装库;

兼容链接器调用模块,用于在linuxopengles封装库初始化时调用兼容链接器,所述兼容链接器用于以指定模式打开androidhalopengles封装库android调用模块,用于当linux系统程序调用linuxopengles封装库的中的任意一个function时,基于兼容链接器以指定模式输出androidhal封装库中对应的function。

可选地,在第二方面的一种可能实现方式中,还包括:

判断模块,用于当androidhal的function运行时,判断androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function是否冲突;

所述linuxglibc属于linux系统基础c库。

可选地,在第二方面的一种可能实现方式中,所述判断模块还用于执行以下步骤,包括:

若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function不冲突;

则通过兼容链接器直接链接调用android系统bionic等基础库的function。

可选地,在第二方面的一种可能实现方式中,所述判断模块还用于执行以下步骤,包括:

若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function冲突;

则通过兼容链接器hook调用linux系统对应的glibc等基础库的function。

本发明实施例的第三方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使所述计算机执行上述第一方面中任意一项所述的安卓运行环境构建的方法。

本发明实施例的第四方面,提供一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器执行上述第一方面中任意一项所述的安卓运行环境构建的方法。

附图说明

图1为linux系统调用androidhal动态库的方法的第一种实施方式的流程图;

图2为linux系统调用androidhal动态库的方法的第二种实施方式的流程图;

图3为linux系统调用androidhal动态库的装置的第一种实施方式的结构图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。

应当理解,在本发明的各种实施例中,各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。

应当理解,在本发明中,“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

应当理解,在本发明中,“多个”是指两个或两个以上。“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。“包含a、b和c”、“包含a、b、c”是指a、b、c三者都包含,“包含a、b或c”是指包含a、b、c三者之一,“包含a、b和/或c”是指包含a、b、c三者中任1个或任2个或3个。

应当理解,在本发明中,“与a对应的b”、“与a相对应的b”、“a与b相对应”或者“b与a相对应”,表示b与a相关联,根据a可以确定b。根据a确定b并不意味着仅仅根据a确定b,还可以根据a和/或其他信息确定b。a与b的匹配,是a与b的相似度大于或等于预设的阈值。

取决于语境,如在此所使用的“若”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于检测”。

下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。

本发明提供的技术技术方案中,init是一个命令行程序。其主要工作之一就是建立这些与内核空间交互的文件所在的目录。当linux内核加载完后,要做的第一件事就是调用init程序,也就是说,init是用户空间执行的第一个程序。

关于本发明提供的技术方案的名词解释和释义:

androidhal:android硬件抽象层;

bionic:android系统基础c库,与gun/linux的c库不兼容,部分c库接口未支持;

opengles:是免授权费的,跨平台的,功能完善的2d和3d图形应用程序接口api,它针对多种嵌入式系统专门设计。

function:表示子例程的一般性名词。在某些编程语言中,它指带返回值的子例程或语句。在一些编程语言中起着关键字的作用。在python中,function是非常重要而且常见的,一般获取类或函数的参数信息。

linuxglibc:glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。

dlopen:在dlopen函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym的调用进程。使用dlclose来卸载打开的库。

本发明提供一种linux系统调用androidhal动态库的方法,如图1和图2所示,包括:

步骤s110、通过linux系统程序调用linuxopengles封装库中的任意一个符号function,以及通过linux系统程序调用linuxopengles封装库。在步骤s110中,linux系统程序调用opengles库某个符号function,首先会调用到opengles封装库。

步骤s120、在linuxopengles封装库初始化时调用兼容链接器,所述兼容链接器用于以指定模式打开androidhalopengles封装库。opengles封装库初始化时会调用兼容连接器,该兼容链接器会dlopenandroidhalopengles库。

步骤s130、当linux系统程序调用linuxopengles封装库的中的任意一个function时,基于兼容链接器以指定模式输出androidhal封装库中对应的function。当linux调用opengles库的某个function,会调用到真正的androidhal库的对应function。

在一个实施例中,还包括:

步骤s140、当androidhal的function运行时,判断androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function是否冲突;

所述linuxglibc属于linux系统基础c库。

步骤s1401、若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function不冲突;

步骤s1402、则通过兼容链接器直接链接调用android系统bionic等基础库的function。

步骤s1403、若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function冲突;

步骤s1404、则通过兼容链接器hook调用linux系统对应的glibc等基础库的function。

本发明提供的技术方案,通过兼容链接器的方式,可以实现linux程序直接链接androidhal动态库。

在步骤s140至步骤s1402以及步骤s140至步骤s1404中,androidhal的function在运行时,也会链接动态库,这个时候会分两种情况。第一中,和linux系统对应的glibc等基础库不存在冲突的function。在调用这个function时,兼容链接器会直接调用android系统对应的function;第二种,和linux系统对应的glibc等基础库存在冲突的function,例如pthread相关函数,这样在调用这个函数时,兼容链接器通过hook方式链接调用linuxglibc的对应function,而不是直接链接androidbionic对应的function。本发明提供的技术方案,通过兼容链接器的方式,可以实现linux程序直接链接androidhal动态库。

本发明的实施例还提供一种linux系统调用androidhal动态库的装置,如图3所示,包括:

linux调用模块,用于通过linux系统程序调用linuxopengles封装库中的任意一个符号function,以及通过linux系统程序调用linuxopengles封装库;

兼容链接器调用模块,用于在linuxopengles封装库初始化时调用兼容链接器,所述兼容链接器用于以指定模式打开androidhalopengles封装库

android调用模块,用于当linux系统程序调用linuxopengles封装库的中的任意一个function时,基于兼容链接器以指定模式输出androidhal封装库中对应的function。

在一个实施例中,还包括:

判断模块,用于当androidhal的function运行时,判断androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function是否冲突;

所述linuxglibc属于linux系统基础c库。

在一个实施例中,所述判断模块还用于执行以下步骤,包括:

若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function不冲突;

则通过兼容链接器直接链接调用android系统bionic等基础库的function。

在一个实施例中,所述判断模块还用于执行以下步骤,包括:

若androidhal的function中将要链接调用android系统bionic等基础库的function与linux系统对应的glibc等基础库的function冲突;

则通过兼容链接器hook调用linux系统对应的glibc等基础库的function。

其中,可读存储介质可以是计算机存储介质,也可以是通信介质。通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。计算机存储介质可以是通用或专用计算机能够存取的任何可用介质。例如,可读存储介质耦合至处理器,从而使处理器能够从该可读存储介质读取信息,且可向该可读存储介质写入信息。当然,可读存储介质也可以是处理器的组成部分。处理器和可读存储介质可以位于专用集成电路(applicationspecificintegratedcircuits,简称:asic)中。另外,该asic可以位于用户设备中。当然,处理器和可读存储介质也可以作为分立组件存在于通信设备中。可读存储介质可以是只读存储器(rom)、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。

本发明还提供一种程序产品,该程序产品包括执行指令,该执行指令存储在可读存储介质中。设备的至少一个处理器可以从可读存储介质读取该执行指令,至少一个处理器执行该执行指令使得设备实施上述的各种实施方式提供的方法。

在上述终端或者服务器的实施例中,应理解,处理器可以是中央处理单元(英文:centralprocessingunit,简称:cpu),还可以是其他通用处理器、数字信号处理器(英文:digitalsignalprocessor,简称:dsp)、专用集成电路(英文:applicationspecificintegratedcircuit,简称:asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1