一种安卓兼容环境适配多Linux内核的启动方法与流程

文档序号:32074290发布日期:2022-11-05 04:05阅读:35来源:国知局
一种安卓兼容环境适配多linux内核的启动方法
技术领域
:1.本发明属于桌面操作系统上运行移动应用的开发
技术领域
:,具体涉及一种安卓兼容环境适配多linux内核的启动方法。
背景技术
::2.linux操作系统安卓兼容环境(下文简称安卓兼容环境)是一种在linux操作系统上运行安卓应用的技术,对丰富linux操作系统应用生态有着重要的意义。通常情况下,典型的安卓兼容环境主要包括安卓应用显示单元和安卓应用兼容服务,安卓应用显示单元用于在桌面操作系统上实现安卓应用的用户界面,安卓应用兼容服务用于提供运行于桌面操作系统上的安卓兼容环境,通过安卓应用显示单元与安卓应用兼容服务的相互配合实现安卓应用在桌面操作系统上的有效运行,例如,现有安卓兼容环境的实现方案有xdroid,它包括xdroidui和xdroidserver,xdroidui为安卓应用显示单元,xdroidserver为安卓应用兼容服务,通过xdroid与xdroidui的配合即可实现安卓应用与linux操作系统的兼容。3.现有安卓系统为了提高其运行时性能,在其第一次运行时往往会将安卓框架的各种jar包编译成oat或art文件,oat或art文件实质上就是elf格式的linux的可执行代码即机器指令而不是java的中间代码,然而这将会导致第一次启动安卓系统的过程耗时较多,尤其是对于安卓兼容环境而言,会导致用户在桌面系统中启动安卓兼容环境的耗时过长,从而影响用户体验。4.因此,现有的安卓系统的启动机制为,在编译安卓系统时直接将安卓系统自带的jar文件编译为oat或art文件,这虽然会增大安卓系统镜像文件的数据量,但会显著减少安卓系统第一次启动的时间。在安卓系统启动过程中会加载boot.art文件,boot.art文件为包含了安卓框架各组件编译结果的文件,如果boot.art文件存在,则将boot.art文件复制到cache目录并映射到地址空间的某个固定地址进行使用,类似于加载动态库的操作,由此即可减少安卓系统的启动时间,如不存在就需要将安卓框架对应的jar文件编译生成为art文件并保存到cache目录中。5.然而当在桌面系统中使用安卓兼容环境时,由于安卓兼容环境需要与多种版本的桌面系统进行适配,因此安卓系统现有启动机制中所设定的固定地址则可能会被桌面系统占用,致使安卓兼容环境加载boot.art文件失败,进而产生安卓兼容环境无法正常启动的问题,为用户的正常操作带来不便。技术实现要素:6.有鉴于此,本发明提供了一种安卓兼容环境适配多linux内核的启动方法,能够实现安卓兼容环境对多种linux系统内核的适配。7.本发明提供的一种安卓兼容环境适配多linux内核的启动方法,包括以下步骤:步骤1、将安卓兼容环境的jar包编译为非位置无关代码类型和位置无关代码类型的内存镜像文件,并将动态基地址的初始值设置为空,其中,非位置无关代码类型的内存镜像文件记为boot.art文件,位置无关代码类型的内存镜像文件记为boot.pic.art文件;步骤2、在linux系统内运行安卓兼容环境时,加载未启动的进程,若预设路径下存在boot.art文件则执行步骤3,否则执行步骤7;步骤3、若动态基地址为空则执行步骤4,否则执行步骤6;步骤4、获取boot.art文件的地址空间作为镜像地址空间;获取当前进程的虚拟地址空间作为进程虚拟地址空间;若镜像地址空间被进程虚拟地址空间所占用则执行步骤5,否则将boot.art文件映射到镜像地址空间完成进程的启动后执行步骤8;步骤5、若boot.pic.art文件存在,则将boot.pic.art文件映射到零地址,采用linux系统分配的基地址更新动态基地址,再根据动态基地址及镜像地址空间大小确定新的镜像地址空间,完成进程的启动,执行步骤8;若boot.pic.art文件不存在则执行步骤7;步骤6、根据动态基地址及镜像地址空间大小确定新的镜像地址空间,将boot.art文件映射到新的镜像地址空间中,完成进程的启动,执行步骤8;步骤7、根据当前linux系统的指令集编译安卓兼容环境启动所依赖的安卓框架的jar包,得到boot.art文件和boot.pic.art,再将boot.art文件和boot.pic.art均复制到确定的路径下,执行步骤2;步骤8、进程加载后导出符号表,记录为兼容环境符号表,兼容环境符号表为二元组的集合,每个二元组包括符号名和符号地址;步骤9、若安卓兼容环境运行所需的所有进程均已启动,则完成安卓兼容环境的启动结束本流程;否则执行步骤2。8.进一步地,所述步骤4中的所述获取boot.art文件的地址空间作为镜像地址空间的方式为:解析boot.art文件获取其对应的基地址及镜像地址空间大小,确定内存镜像文件的地址空间,将该地址空间命名为镜像地址空间。9.进一步地,所述步骤4中的所述获取当前进程的虚拟地址空间作为进程虚拟地址空间的方式为:获取当前进程的进程id,读取当前进程的映射文件获取当前进程所分配的虚拟地址空间,将该虚拟地址空间命名为进程虚拟地址空间。10.进一步地,所述步骤2中的所述预设路径为“/system/framework/《arch》/”。11.进一步地,所述步骤2还包括若所述未启动的进程仅存在非位置无关代码类型的编译结果,则在解析未启动的进程的导入符号表时,若兼容环境符号表不为空则采用兼容环境符号表中保存的符号地址替换导入符号表中具有相同符号名的符号地址;若兼容环境符号表为空则不处理。12.进一步地,所述步骤4中所述将boot.art文件映射到镜像地址空间完成进程的启动的方式为:若当前linux系统的内核版本不低于5.18,则使用memfd接口将boot.art映射到镜像地址空间;否则,采用ashmem接口将boot.art映射到镜像地址空间。13.有益效果:本发明通过为安卓兼容环境编译两类内存镜像文件,当linux系统内核对应的目录发生变化时启动位置无关代码类型的内存镜像文件,根据linux系统动态配置的地址加载内存镜像文件,从而保证了安卓兼容环境在多种不同linux内核下的正常启动,进一步提高了安卓兼容环境与桌面系统之间的兼容性,改善了用户的使用体验。附图说明14.图1为本发明提供的一种安卓兼容环境适配多linux内核的启动方法的流程图。具体实施方式15.下面结合附图并举实施例,对本发明进行详细描述。16.本发明提供的一种安卓兼容环境适配多linux内核的启动方法,其核心思想是:通过为安卓兼容环境编译两类内存镜像文件,当linux系统内核对应的目录发生变化时启动位置无关代码类型的内存镜像文件,根据linux系统动态配置的地址加载内存镜像文件,从而实现了安卓兼容环境在多种不同linux内核下的正常启动。17.本发明提供了一种安卓兼容环境适配多linux内核的启动方法,流程如图1所示,具体包括以下步骤:步骤1、将安卓兼容环境的jar包编译为非位置无关代码类型和位置无关代码类型的内存镜像文件,并将动态基地址的初始值设置为空,其中,非位置无关代码类型的内存镜像文件记为boot.art文件,位置无关代码类型的内存镜像文件记为boot.pic.art文件。18.在计算机领域中,位置无关代码(position-independentcode,pic),又称位置无关可执行文件(position-independentexecutable,pie),是指可在主存储器中任意位置正确地运行,而不受其绝对地址影响的一种机器码。pic广泛使用于共享库,使得同一个库中的代码能够被加载到不同进程的地址空间中,此外,pic还用于缺少内存管理单元的计算机系统中,使得操作系统能够在单一的地址空间中将不同的运行程序隔离开。19.步骤2、在linux系统内运行安卓兼容环境时,加载未启动的进程,若预设路径下存在boot.art文件则执行步骤3,否则执行步骤7。20.其中,预设路径为“/system/framework/《arch》/”,“arch”为指令集架构,如x86、x86_64、arm或arm64等。21.步骤3、若动态基地址为空则执行步骤4,否则执行步骤6。22.步骤4、解析boot.art文件获取其对应的基地址及镜像地址空间大小,确定内存镜像文件的地址空间,命名为镜像地址空间;获取当前进程的进程id,读取当前进程的映射文件获取当前进程所分配的虚拟地址空间,命名为进程虚拟地址空间;若镜像地址空间被进程虚拟地址空间所占用则执行步骤5,否则将boot.art文件映射到镜像地址空间完成进程的启动后执行步骤8。23.其中,将boot.art文件映射到镜像地址空间完成进程的启动的方式为:若当前linux系统的内核版本不低于5.18,则使用memfd接口将boot.art映射到镜像地址空间;否则,采用ashmem接口将boot.art映射到镜像地址空间。24.步骤5、若boot.pic.art文件存在,则将boot.pic.art文件映射到零地址,此时linux系统会动态分配映射后的基地址,采用该基地址更新动态基地址,再根据动态基地址及镜像地址空间大小确定地址空间,保留该地址空间作为镜像地址空间,将boot.pic.art文件映射到镜像地址空间中,完成进程的启动,执行步骤8;若boot.pic.art文件不存在则执行步骤7。25.具体来说,不同版本的linux系统,将boot.art文件映射到零地址的接口不同,当linux系统的版本号不低于5.18时使用memfd接口将boot.art文件映射到零地址,当版本号低于5.18时则使用ashmem接口将boot.art文件映射到零地址;同时,保留该地址空间作为镜像地址空间的接口也不同,当linux系统的版本号不低于5.18时使用memfd接口保留地址空间,当linux系统的版本号低于5.18时则使用ashmem接口保留地址空间。26.步骤6、根据动态基地址及镜像地址空间大小确定地址空间,保留该地址空间作为镜像地址空间,将boot.art文件映射到镜像地址空间中,完成进程的启动,执行步骤8。27.具体来说,当linux系统的版本号不低于5.18时使用memfd接口将boot.art文件映射到镜像地址空间中,当版本号低于5.18时则使用ashmem接口将boot.art文件映射到镜像地址空间中。28.步骤7、获取安卓兼容环境启动所依赖的安卓框架的jar包,再根据当前linux系统的指令集编译上述jar包,然后将非位置无关代码类型的编译结果打包为boot.art文件,将位置无关代码类型的编译结果打包为boot.pic.art,再将boot.art文件和boot.pic.art均复制到确定的路径下;执行步骤2。29.步骤8、进程加载后导出符号表,记录为兼容环境符号表,兼容环境符号表为二元组的集合,每个二元组包括符号名和符号地址。30.步骤9、若安卓兼容环境运行所需的所有进程均已启动,则完成安卓兼容环境的启动,结束本流程;否则执行步骤2。31.进一步地,由于部分安卓应用仅有非位置无关代码类型的编译结果,为了提高安卓兼容环境启动的可靠性,当安卓兼容环境加载可执行程序和动态库时,在解析被加载的可执行程序和动态库的导入符号表时,若兼容环境符号表不为空则采用兼容环境符号表中保存的符号地址替换导入符号表中具有相同符号名的符号地址;若兼容环境符号表为空则不处理。32.实施例:本实例为通过对安卓兼容环境进行系统级的修改实现了本发明提供的一种安卓兼容环境适配多linux内核的启动方法,具体包括以下步骤:s1、修改安卓兼容环境对应代码的编译过程,将现有的仅生成非位置无关代码类型的内存镜像文件boot.art文件修改为同时生成非位置无关代码类型的boot.art文件和位置无关代码类型的boot.pic.art文件。33.s2、修改安卓系统内art组件将内存镜像文件加载到内存的过程,具体为imagespace的createbootimage方法,定义动态基地址dynamicbootbaseaddress的初始值为空,修改后的执行过程包括:s2.1、在linux系统内运行安卓兼容环境时,加载未启动的进程,判断路径“/system/framework/《arch》/”下是否存在boot.art文件,如果存在则执行s2.2,如果不存在则执行s2.9。34.s2.2、若dynamicbootbaseaddress为null则执行s2.3,否则执行s2.8。35.s2.3、读取boot.art,并根据elf格式解析elf文件头信息(imageheader),提取基地址imagebase和镜像地址空间大小imagesize,则[imagebase,imagebase+imagesize]即为镜像地址空间。[0036]s2.4、获取当前进程(zygote)的进程id(processid),读取当前进程的/proc/$processid/maps,并解析maps的内容获取内存布局即分配的进程虚拟地址空间。[0037]s2.5、若镜像地址空间被进程虚拟地址空间所占用则执行s2.7,否则执行s2.6。[0038]s2.6、若linux内核版本不低于5.18,则使用memfd接口将boot.art映射到imagebase;否则,采用ashmem接口将boot.art映射到imagebase。[0039]s2.7、判断boot.pic.art文件是否存在,若存在则当linux内核版本不低于5.18时使用memfd接口将boot.pic.art文件映射到零地址,并将此时系统动态分配映射后的基地址保存在dynamicbootbaseaddress中,然后通过memfd接口将[dynamicbootbaseaddress,dynamicbootbaseaddress+imagesize]标记为保留地址,这样在所有的进程中映射的基址都更新为了dynamicbootbaseaddress;当linux内核版本低于5.18时使用ashmem接口将boot.pic.art文件映射到零地址,并将此时系统动态分配映射后的基地址保存在dynamicbootbaseaddress中,然后通过memfd接口将[dynamicbootbaseaddress,dynamicbootbaseaddress+imagesize]标记为保留地址;再执行s2.10;若boot.pic.art文件不存在,则执行s2.9。[0040]s2.8、如linux内核不低于5.18则使用memfd接口将boot.art映射到dynamicbootbaseaddress,s2.9、将安卓兼容环境启动依赖的相关安卓框架的jar包编译成boot.art,包括以下步骤:s2.9.1、读取framework/base/preloaded-classes的相关类名及所在包名;s2.9.2、在/system目录中查找s2.9.1中获取的包名,针对当前指令集的32位和64位版本、非pic和pic版本,分别执行dex2oat编译得到oat编译结果;s2.9.3、将多个非pic的oat编译结果打包为32位的boot.art和64位的boot.art,将多个pic的oat编译结果打包为32位的boot.pic.art和64位的boot.pic.art,并分别复制到/system/framework/《arch》下,执行s2.1。[0041]s2.10、记录加载后的符号表,记为exportedsymboltable。[0042]s2.11、若安卓兼容环境运行所需的所有进程均已启动,则结束本流程;否则执行s2.1。[0043]此外,通过修改安卓系统的可执行程序和动态库加载器linker,解决当安卓应用仅有非pic的编译结果时的加载问题,具体为:在解析被加载的可执行文件或动态库的导入符号表时,若exportedsymboltable不为空,则对导入符号表中的每个符合symbol,在exportedsymboltable查找符号名相匹配的条目,采用条目中的符号地址替换导入符号表中symbol的符号地址。[0044]综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1