CN115390945B - 应用程序的运行方法、装置、电子设备及可读存储介质 - Google Patents

应用程序的运行方法、装置、电子设备及可读存储介质 Download PDF

Info

Publication number
CN115390945B
CN115390945B CN202211083290.1A CN202211083290A CN115390945B CN 115390945 B CN115390945 B CN 115390945B CN 202211083290 A CN202211083290 A CN 202211083290A CN 115390945 B CN115390945 B CN 115390945B
Authority
CN
China
Prior art keywords
application program
virtual environment
preset
preset function
application
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202211083290.1A
Other languages
English (en)
Other versions
CN115390945A (zh
Inventor
刘云鹏
房烨明
帖阳
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Lingwu Technology Co ltd
Original Assignee
Beijing Lingwu Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Lingwu Technology Co ltd filed Critical Beijing Lingwu Technology Co ltd
Priority to CN202211083290.1A priority Critical patent/CN115390945B/zh
Publication of CN115390945A publication Critical patent/CN115390945A/zh
Application granted granted Critical
Publication of CN115390945B publication Critical patent/CN115390945B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本申请公开了一种应用程序的运行方法、装置、电子设备及可读存储介质,方法包括:响应于应用程序运行指令,获取应用程序运行指令中包括的第一系统的应用程序;虚拟环境利用第一预设函数,生成目标进程;虚拟环境在利用第二预设函数以将应用程序放入目标进程之前,截获第二预设函数;虚拟环境利用系统调用翻译器,得到应用程序的应用程序镜像和动态链接器信息;虚拟环境根据预设加载器、应用程序镜像和动态链接器信息,利用第二预设函数,将应用程序和动态链接器加载至内存;根据动态链接器和第三预设函数,执行应用程序。通过上述方法使得Linux应用程序能够在没有root权限的情况下也能够在Android系统下运行。

Description

应用程序的运行方法、装置、电子设备及可读存储介质
技术领域
本申请涉及计算机技术领域,特别是涉及一种应用程序的运行方法、装置、电子设备及可读存储介质。
背景技术
目前,绝大多数Linux操作系统的应用程序都是动态链接的,通过动态链接器加载动态链接库,以运行应用程序自身的程序逻辑。然而,由于Linux系统的应用程序使用GNU C库和相对应的动态链接器,而Android系统应用程序使用其独有的Bionic C库和相对应的动态链接器,两者并不兼容,导致动态链接的Linux系统的应用程序无法在Android系统上直接运行。
为了在Android系统上运行Linux应用程序,相关技术中采用在Android根目录下完整地构造出Linux操作系统的GNC C库运行环境,或者通过chroot(Change Root,更改根目录)系统调用将应用程序的根目录切换到指定的目录。
在实现本申请的过程中,申请人发现相关技术至少存在以下问题:
将二进制应用移植为Android NDK(原生开发工具包)程序,需要二进制程序的源代码并重新按照Android NDK规范移植,会涉及到修改部分代码、重新编译以及打包,且绝大多数程序都需要root权限,导致移动终端的部署成本和运行开销较大。
发明内容
有鉴于此,本申请提供了一种应用程序的运行方法、装置、电子设备及可读存储介质,主要目的在于解决目前在Android系统运行Linux应用程序,需要二进制程序的源代码并重新按照Android NDK规范移植,且绝大多数程序都需要root权限,导致移动终端的部署成本和运行开销较大,且系统间兼容性较低的问题。
依据本申请第一方面,提供了一种应用程序的运行方法,适用于电子设备,电子设备包括第一系统的虚拟环境和第二系统的主机环境,虚拟环境包括系统调用翻译器,该方法包括:
响应于应用程序运行指令,获取应用程序运行指令中包括的第一系统的应用程序;
虚拟环境利用第一预设函数,生成目标进程;
虚拟环境在利用第二预设函数以将应用程序放入目标进程之前,截获第二预设函数;
虚拟环境利用系统调用翻译器,得到应用程序的应用程序镜像和动态链接器信息;
虚拟环境根据预设加载器、应用程序镜像和动态链接器信息,利用第二预设函数,将应用程序和动态链接器加载至内存;
根据动态链接器和第三预设函数,执行应用程序。
可选地,虚拟环境利用系统调用翻译器,得到应用程序的应用程序镜像和动态链接器信息的步骤,具体包括:
虚拟环境利用系统调用翻译器,获取应用程序在主机环境的第一执行路径;
虚拟环境根据第一执行路径,得到应用程序的应用程序镜像和动态链接器信息。
可选地,虚拟环境包括虚拟根文件系统,虚拟环境利用系统调用翻译器,获取应用程序在主机环境的第一执行路径的步骤,具体包括:
获取应用程序在虚拟根文件系统的第二执行路径;
虚拟环境利用系统调用翻译器,将应用程序在虚拟根文件系统的第二执行路径翻译成应用程序在主机环境的第一执行路径。
可选地,虚拟环境根据预设加载器、应用程序镜像和动态链接器信息,利用第二预设函数,将应用程序和动态链接器加载至内存的步骤,具体包括:
获取第二预设函数的目标参数,其中,目标参数为应用程序在虚拟根文件系统的第二执行路径;
将第二预设函数的目标参数替换为预设加载器;
将应用程序镜像和动态链接器信息传递至预设加载器;
利用第二预设函数,将预设加载器加载至内存;
从内核态返回至用户态;
利用预设加载器,将应用程序和动态链接器加载至内存。
可选地,根据动态链接器和第三预设函数,执行应用程序的步骤,具体包括:
跳转至应用程序的第三预设函数;
获取应用程序依赖的动态链接库;
利用动态链接器将动态链接库加载至内存;
执行应用程序。
可选地,响应于应用程序运行指令,获取应用程序运行指令中包括的第一系统的应用程序之前,方法还包括:
编写预设加载器;
将预设加载器设置于虚拟环境内。
可选地,第一系统为Linux系统;第二系统为Android系统。
依据本申请第二方面,提供了一种应用程序的运行装置,适用于电子设备,电子设备包括第一系统的虚拟环境和第二系统的主机环境,虚拟环境包括系统调用翻译器,该装置包括:
获取模块,用于响应于应用程序运行指令,获取应用程序运行指令中包括的第一系统的应用程序;
第一生成模块,用于虚拟环境利用第一预设函数,生成目标进程;
截获模块,用于虚拟环境在利用第二预设函数以将应用程序放入目标进程之前,截获第二预设函数;
第二生成模块,用于虚拟环境利用系统调用翻译器,得到应用程序的应用程序镜像和动态链接器信息;
加载模块,用于虚拟环境根据预设加载器、应用程序镜像和动态链接器信息,利用第二预设函数,将应用程序和动态链接器加载至内存;
执行模块,用于根据动态链接器和第三预设函数,执行应用程序。
可选地,第二生成模块,具体用于:
虚拟环境利用系统调用翻译器,获取应用程序在主机环境的第一执行路径;
虚拟环境根据第一执行路径,得到应用程序的应用程序镜像和动态链接器信息。
可选地,获取模块,还用于获取应用程序在虚拟根文件系统的第二执行路径。
可选地,该装置还包括:
翻译模块,用于虚拟环境利用系统调用翻译器,将应用程序在虚拟根文件系统的第二执行路径翻译成应用程序在主机环境的第一执行路径。
可选地,加载模块,具体用于:
获取第二预设函数的目标参数,其中,目标参数为应用程序在虚拟根文件系统的第二执行路径;
将第二预设函数的目标参数替换为预设加载器;
将应用程序镜像和动态链接器的信息传递至预设加载器;
利用第二预设函数,将预设加载器加载至内存;
从内核态返回至用户态;
利用预设加载器,将应用程序和动态链接器加载至内存。
可选地,执行模块,具体用于:
跳转至应用程序的第三预设函数;
获取应用程序依赖的动态链接库;
利用动态链接器将动态链接库加载至内存;
执行应用程序。
可选地,该装置还包括:
编写模块,用于编写预设加载器;
设置模块,用于将预设加载器设置于虚拟环境内。
依据本申请第三方面,提供了一种电子设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现第一方面中任一项所述方法的步骤。
依据本申请第四方面,提供了一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面中任一项所述的方法的步骤。
借由上述技术方案,本申请提供的一种应用程序的运行方法、装置、电子设备及可读存储介质,具体地,虚拟环境在execvp系统调用执行应用程序前将其截获后,利用系统调用翻译器对应用程序的路径参数进行翻译,以将应用程序系统调用的所有路径参数修改翻译为Android系统上的正确路径,进而根据应用程序的正确路径得到应用程序镜像和动态链接器信息。进一步地,调用execvp函数将提前编写好的虚拟环境应用层的预设加载器加载至内存中,通过预设加载器将应用程序和动态链接器加载至内存中,跳转并执行应用程序。相较于现有技术中,通过chroot系统调用将应用程序的根目录切换到指定的目录的方式,本申请通过在execvp系统调用运行过程中插入一个提前编写的预设加载器,使得虚拟环境借助Linux的ptrace系统调用所提供的功能,以及虚拟环境应用层的二进制预设加载器,巧妙地解决了Android系统下execvp系统调用无法找到正确的应用程序路径的问题,绕过应用权限,进而使得Linux应用程序能够在没有root权限的情况下也能够在Android系统下运行,一方面,实现了无需对应用程序进行二次移植工作,大大降低了工作量,节省运行开销;另一方面,实现了无需运行在root权限下,兼容现有Android环境,并支持现有Android开发环境,无需针对虚拟环境二次开发,降低其开发成本。
上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本申请实施例提供的一种应用程序的运行方法流程示意图;
图2示出了本申请实施例提供的另一种应用程序的运行方法流程示意图;
图3示出了本申请实施例提供的一种应用程序的运行方法流程示意框图;
图4示出了本申请实施例提供的一种电子设备的结构示意图;
图5示出了本申请实施例提供的一种应用程序的运行装置的结构示意图。
具体实施方式
下面将参照附图更详细地描述本申请的示例性实施例。虽然附图中显示了本申请的示例性实施例,然而应当理解,可以以各种形式实现本申请而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本申请,并且能够将本申请的范围完整的传达给本领域的技术人员。
本申请实施例提供了一种应用程序的运行方法,如图1所示,该方法包括:
101、响应于应用程序运行指令,获取应用程序运行指令中包括的第一系统的应用程序。
本申请实施例提供了一种应用程序的运行方法,适用于电子设备,其中,电子设备包括第一系统的虚拟环境,以及与虚拟环境相间隔的第二系统的主机环境,其中,主机环境指的是以Android为主系统的环境。具体地,虚拟环境包括系统调用翻译器,系统调用翻译器用于对应用程序的路径参数进行翻译。需要说明的是,第一系统为Linux操作系统,第二系统为Android操作系统。
可选地,电子设备可以为计算机设备、平板电脑、移动终端和多媒体设备等,虚拟环境可以以Android APP的形式运行。
具体地,接收到应用程序运行指令后,获取该运行指令中的待执行的第一系统的应用程序,需要说明的是,该应用程序为基于Android系统的电子设备上的待运行的Linux应用程序。
102、虚拟环境利用第一预设函数,生成目标进程。
在该步骤中,在获取待运行的Linux应用程序后,虚拟环境调用第一预设函数创建一个新的子进程作为目标进程。需要说明的是,第一预设函数为fork函数;目标进程为用于执行应用程序的进程。
103、虚拟环境在利用第二预设函数以将应用程序放入目标进程之前,截获第二预设函数。
在该步骤中,在获取Linux应用程序后,如果直接采用虚拟环境通过fork一个子进程并执行execvp函数将应用程序放入子进程后加载Linux应用程序的方式,所调用的应用程序的根文件在Android的根文件系统内根本无法正确定位动态链接器。因为绝大多数Linux应用程序都是动态链接的,它们的加载和运行过程是主进程fork出子进程,子进程调用execvp函数系统调用将要执行的应用程序镜像和动态链接器加载到内存,通过动态链接器加载动态链接库。其后,跳转到应用程序的entry point(入口点)开始运行环境的初始化,初始化完成后开始运行应用程序自身的程序逻辑。然而,Linux应用程序使用GNU C库和相对应的动态链接器,而Android系统的应用程序使用其独有的Bionic C库和相对应的动态连接器,两者并不兼容,因此,动态链接的Linux应用程序因为找不到正确的动态链接器,进而导致无法在Android系统上直接运行。
基于上述问题,本申请在执行execvp函数,即第二预设函数以将应用程序放入子进程之前,虚拟环境截获execvp函数,使得子进程不再进行系统调用,进而使得系统调用处理逻辑由虚拟环境来接管,以避免出现动态链接器无法正确定位的问题。
可选地,子进程通过ptrace系统调用设置PTRACE-TRACEME指令,这样由这个子进程fork出来的所有子孙进程的系统调用都能够被虚拟环境的主进程截获。
104、虚拟环境利用系统调用翻译器,得到应用程序的应用程序镜像和动态链接器信息。
在该步骤中,应用程序在正常执行的时候一个系统只会有一个根。对于Linux应用程序来说,由于其自身为二进制程序,它肯定是要调用其自己的根,但是在Android的根文件系统中根本找不到这个文件的路径进而导致无法执行该程序。
基于上述问题,本申请通过在虚拟环境设置一个系统调用翻译器,其中,系统调用翻译器能够进行路径的参数翻译,将路径相关的参数从虚拟根文件系统路径翻译成Android文件系统路径,通过修改路径参数使得系统调用能够在Android系统上正确执行。进而通过翻译后的路径解析得到应用程序的应用程序镜像和动态链接器信息,需要说明的是,应用程序镜像指的是应用程序对应的文件。
在具体实施例中,应用程序“rrr.exe”在Android系统对应的路径为/system/rrr.exe:/==>system==>rrr.exe,如果该程序为Android系统的程序,那么按照该路径就可以找到对应的文件,但如果该程序是一个二进制程序,那么放到Android系统就执行不了,因为该二进制程序的根文件系统不对,此时,需要将根文件系统切换成/mnt/rrr.exe才能执行。
105、虚拟环境根据预设加载器、应用程序镜像和动态链接器信息,利用第二预设函数,将应用程序和动态链接器加载至内存。
在该步骤中,虚拟环境解析得到应用程序的应用程序镜像以及动态链接器后,将execvp函数,即第二预设函数中的应用程序的自身的路径参数替换为虚拟环境应用层的预设加载器,同时,将应用程序的程序镜像和动态链接器信息传递至预设加载器中。需要说明的是,预设加载器为提前编写的程序,该预设加载器不依赖任何环境就能加载起来。其后,execvp系统调用将预设加载器加载到内存,当预设加载器加载成功后,通过预设加载器将应用程序和动态链接器加载至内存中。
通过上述方式,基于现有技术中,通过操作系统内核将应用程序加载到内存中,然而,由于无法在Android系统上正确地定位到动态链接器,导致在Androdi系统上无法通过操作系统内核直接进行加载,只能通过应用权限进行加载的问题。本申请在执行应用程序之前对execvp函数进行截获,并对execvp中的参数进行替换,进而利用提前编写好的预设加载器将应用程序加载至内存中,成功地绕过应用权限,使得Linux应用程序能够在没有root权限的情况下也能够在Android系统下运行。
106、根据动态链接器和第三预设函数,执行应用程序。
在该步骤中,通过预设加载器将应用程序以及动态链接器加载至内存后,跳转至实际应用程序的start函数,即第三预设函数,并且通过动态链接器将应用城西依赖的动态链接库加载至内存中,执行应用程序。
本申请实施例提供的应用程序的运行方法,在虚拟环境在execvp系统调用执行应用程序前将其截获后,利用系统调用翻译器对应用程序的路径参数进行翻译,以将应用程序系统调用的所有路径参数修改翻译为Android系统上的正确路径,来得到应用程序镜像和动态链接器。进一步地,调用execvp函数将虚拟环境应用层的预设加载器加载至内存中,进而通过预设加载器将应用程序和动态链接器加载至内存中,来执行应用程序。相较于现有技术通过chroot系统调用将应用程序的根目录切换到指定的目录的方式,本申请通过在execvp系统调用运行过程中插入一个提前编写的预设加载器,使得虚拟环境借助Linux的ptrace系统调用所提供的功能,以应用层的二进制预设加载器,巧妙地解决了Android系统下execvp系统调用无法找到正确的动态链接器路径的问题,绕过应用权限,进而使得Linux应用程序能够在没有root权限的情况下也能够在Android系统下运行,一方面,实现了无需对应用程序进行二次移植工作,大大降低了工作量,节省运行开销;另一方面,实现了无需运行在root权限下,兼容现有Android环境,并支持现有Android开发环境,无需针对虚拟环境二次开发,降低其开发成本。
进一步的,作为上述实施例具体实施方式的细化和扩展,为了完整说明本实施例的具体实施过程,本申请实施例提供了另一种应用程序的运行方法,如图2所示,该方法包括:
201、编写预设加载器。
202、将预设加载器设置于虚拟环境内。
在步骤201和步骤202中,提前编写预设加载器,将编写好的预设加载器设置于虚拟环境中,由于预设加载器可以依赖任何runtime(内存管理)环境加载起来,利用预设加载器将应用程序以及动态链接器加载至内存时可绕过应用权限。
通过上述方式,虚拟环境通过在execvp系统调用运行过程中,插入一个提前设置好的预设加载器,解决了动态链接器路径无法正确定位的问题,实现了不需要root权限的Linux应用程序的加载。
203、响应于应用程序运行指令,获取应用程序运行指令中包括的第一系统的应用程序。
在该步骤中,接收到应用程序运行指令后,获取该运行指令中的待执行的第一系统的应用程序,需要说明的是,该应用程序为基于Android系统的电子设备上的待运行的Linux应用程序。
204、虚拟环境利用第一预设函数,生成目标进程。
205、虚拟环境在利用第二预设函数以将应用程序放入目标进程之前,截获第二预设函数。
在步骤204和步骤205中,在获取待运行的Linux应用程序后,虚拟环境调用第一预设函数创建一个新的子进程作为目标进程。需要说明的是,第一预设函数为fork函数;子进程为最终执行应用程序的进程。
进一步地,在执行execvp函数,即第二预设函数以将应用程序放入子进程之前,虚拟环境截获execvp函数,使得子进程不再进行系统调用,进而使得系统调用处理逻辑由虚拟环境来接管,以避免动态链接器无法正确定位导致应用程序无法加载。
通过上述方式,通过ptrace系统调用设置PTRACE-TRACEME指令,使得子进程fork出来的所有子孙进程的系统调用都能够被虚拟环境的主进程截获,以使子进程不再进行系统调用,进而使得系统调用处理逻辑会由虚拟环境来接管,避免执行系统调用时无法正确定位动态链接器的路径,导致应用程序无法正确执行。
206、虚拟环境利用系统调用翻译器,获取应用程序在主机环境的第一执行路径。
在该步骤中,应用程序在正常执行的时候一个系统只会有一个根。对于Linux应用程序来说,由于其自身为二进制程序,它肯定是要调用其自己的根,但是在Android的根文件系统中根本找不到这个文件的路径进而导致无法执行该程序。因此,本申请通过虚拟环境的系统调用翻译器,将路径相关的参数从虚拟文件系统路径翻译成Android文件系统路径,即第一执行路径。
在本申请实施例中,可选地,步骤206中,也即虚拟环境利用系统调用翻译器,获取应用程序在主机环境的第一执行路径,具体包括:获取应用程序在虚拟根文件系统的第二执行路径;虚拟环境利用系统调用翻译器,将应用程序在虚拟根文件系统的第二执行路径翻译成应用程序在主机环境的第一执行路径。
在该实施例中,虚拟环境包括虚拟根文件系统,需要说明的是,虚拟根文件系统指的是给Android上运行的二进制程序所提供的虚拟环境的根,然而,由于虚拟环境的虚拟文件系统与主机环境的根文件系统并不相同,即两者并非一个根,因此,如果一个程序为Linux应用程序,根据其自身的虚拟根文件系统得到的路径在Android系统中是执行不了的,必须将其虚拟根文件系统切换成Android系统的根文件路径才能执行。因此,本申请在获取到应用程序在虚拟根文件系统的第二路径后,通过系统调用翻译器,将其路径参数翻译为Android系统对应的根文件系统的路径参数,以得到应用程序在主机环境的第一执行路径。
在具体实施例中,假设虚拟环境的虚拟根文件系统位于目录/data/mnt,则可以利用系统调用翻译器,将应用文件“bash”在虚拟根文件系统的路径/usr/bin/bash改为在Android系统上的正确路径/data/mnt/usr/bin/bash。
通过上述方式,利用系统调用翻译器对路径参数进行翻译,实现了对动态链接器路径的正确定位。
207、虚拟环境根据第一执行路径,得到应用程序的应用程序镜像和动态链接器信息。
在该步骤中,虚拟环境在得到应用程序基于Android系统的正确路径后,即可对动态链接器的路径进行正确定位。进而根据正确路径参数解析得到应用程序的应用程序镜像和动态链接器。
208、获取第二预设函数的目标参数,其中,目标参数为应用程序在虚拟根文件系统的第二执行路径。
209、将第二预设函数的目标参数替换为预设加载器。
在步骤208和步骤209中,获取execvp函数,即第二预设函数的目标参数,需要说明的是,目标参数为execvp函数的第一个参数,为应用程序在虚拟根文件系统中的执行路径参数。其后,将该参数替换成预设加载器,以供后续调用execvp函数将预设加载器加载至预设内存中。
210、将应用程序镜像和动态链接器信息传递至预设加载器。
在该步骤中,将应用程序的程序镜像和动态链接器信息传递至预设加载器中,以供后续利用预设加载器将应用程序以及动态链接器加载至内存中。
211、利用第二预设函数,将预设加载器加载至内存。
212、从内核态返回至用户态。
213、利用预设加载器,将应用程序和动态链接器加载至内存。
在步骤211至步骤213中,虚拟程序调用execvp函数将预设加载器加载至内存中。当预设加载器加载成功后,从内核态返回至用户态。其后,利用预设加载器将应用程序和动态链接器加载到内存中。
214、跳转至应用程序的第三预设函数。
215、获取应用程序依赖的动态链接库。
216、利用动态链接器将动态链接库加载至内存。
217、执行应用程序。
在步骤214至步骤217中,将应用程序和动态链接器加载至内存后,跳转至应用程序的start函数,即第三预设函数。其后,获取应用程序依赖的动态链接库,通过动态链接器将应用程序依赖的动态链接库加载至内存后,执行应用程序。
在具体实施例中,本申请提供了一种应用程序的运行方法。具体地,随着基于Android系统的智能手机、智能电视和机顶盒及可穿戴设备等智能电子设备的不断发展,硬件性能不断增强,将一些大型的,之前运行在Linux系统上的应用程序运行在基于Android系统的智能设备上成为可能,也有了越来越多的相应需求。
具体地,如图3所示,为本申请应用程序的运行方法的示意框图,其中,虚拟环境通过fork一个子进程,即目标进程并执行execv加载linux应用程序,子进程通过ptrace系统调用设置PTRACE-TRACEME命令,这样由这个子进程fork/clone出来的所有子孙进程的系统调用都能够被虚拟环境主进程截获。进一步地,虚拟环境利用系统调用翻译器获取应用程序在主机环境上的执行路径,解析、获取应用程序镜像和动态链接器,将execvp函数中的目标参数替换成预设加载器,其中,目标参数为应用程序在虚拟根文件系统的执行路径。进一步地,execvp系统调用将预设加载器加载到内存中。当预设加载器加载成功后,从内核态返回至用户态,利用预设加载器将应用程序和动态链接器加载到内存。跳转并执行应用程序。
可选地,如图4所示,为电子设备的结构示意框图,具体地,电子设备包括LinuxBinary(Linux二进制)执行程序、虚拟环境、Android runtime(Android运行环境)以及Linux内核。其中,虚拟环境包括虚拟根文件系统和系统调用翻译器,Android runtime包括文件系统。虚拟环境向Linux Binary执行程序提供虚拟根文件系统和系统调用翻译器,以使系统调用翻译器能够对应用程序的路径参数进行翻译。可以理解的是,由于Android系统也是建立在Linux系统上的,Android的操作系统内核都是Linux内核,因此,在基于Android系统的电子设备上运行Linux应用程序是可以实现的。
本申请提供的应用程序运行方法,通过本发明的做法是综合应用Linux系统的ptrace系统调用函数和预加载技术,在Android系统上构建一个轻量级的虚拟运行环境运行Linux应用程序,使得虚拟环境借助Linux的Ptrace系统调用所提供的功能,通过一个应用层的二进制预设加载器,巧妙地解决了Android下execvp系统调用无法找到正确的链接器路径的问题,使得Linux应用程序能够在没有root权限的情况下也能够在Android系统下运行。
进一步地,作为图1所述方法的具体实现,本申请实施例提供了一种应用程序的运行装置500,适用于电子设备,电子设备包括第一系统的虚拟环境和第二系统的主机环境,虚拟环境包括系统调用翻译器,如图5所示,该装置包括:
获取模块501,用于响应于应用程序运行指令,获取应用程序运行指令中包括的第一系统的应用程序;
第一生成模块502,用于虚拟环境利用第一预设函数,生成目标进程;
截获模块503,用于虚拟环境在利用第二预设函数以将应用程序放入目标进程之前,截获第二预设函数;
第二生成模块504,用于虚拟环境利用系统调用翻译器,得到应用程序的应用程序镜像和动态链接器信息;
加载模块505,用于虚拟环境根据预设加载器、应用程序镜像和动态链接器信息,利用第二预设函数,将应用程序和动态链接器加载至内存;
执行模块506,用于根据动态链接器和第三预设函数,执行应用程序。
可选地,第二生成模块504,具体用于:
虚拟环境利用系统调用翻译器,获取应用程序在主机环境的第一执行路径;
虚拟环境根据第一执行路径,得到应用程序的应用程序镜像和动态链接器信息。
可选地,获取模块501,还用于获取应用程序在虚拟根文件系统的第二执行路径。
可选地,该装置还包括:
翻译模块507,用于虚拟环境利用系统调用翻译器,将应用程序在虚拟根文件系统的第二执行路径翻译成应用程序砸死主机环境的第一执行路径。
可选地,加载模块505,具体用于:
获取第二预设函数的目标参数,其中,目标参数为应用程序在虚拟根文件系统的第二执行路径;
将第二预设函数的目标参数替换为预设加载器;
将应用程序镜像传递至预设加载器;
利用第二预设函数,将预设加载器加载至内存;
从内核态返回至用户态;
利用预设加载器,将应用程序和动态链接器加载至内存。
可选地,执行模块506,具体用于:
跳转至应用程序的第三预设函数;
获取应用程序依赖的动态链接库;
利用动态链接器将动态链接库加载至内存;
执行应用程序。
可选地,该装置还包括:
编写模块508,用于编写预设加载器;
设置模块509,用于将预设加载器设置于虚拟环境内。
本申请实施例提供的应用程序的运行装置,虚拟环境在execvp系统调用执行应用程序前将其截获后,利用系统调用翻译器对应用程序的路径参数进行翻译,以将应用程序系统调用的所有路径参数修改翻译为Android系统上的正确路径,进而根据应用程序的正确路径得到应用程序镜像和动态链接器信息。进一步地,调用execvp函数将提前编写好的虚拟环境应用层的预设加载器加载至内存中,通过预设加载器将应用程序和动态链接器加载至内存中,跳转并执行应用程序。相较于现有技术中,通过chroot系统调用将应用程序的根目录切换到指定的目录的方式,本申请通过在execvp系统调用运行过程中插入一个提前编写的预设加载器,使得虚拟环境借助Linux的ptrace系统调用所提供的功能,以及虚拟环境应用层的二进制预设加载器,巧妙地解决了Android系统下execvp系统调用无法找到正确的应用程序路径的问题,绕过应用权限,进而使得Linux应用程序能够在没有root权限的情况下也能够在Android系统下运行,一方面,实现了无需对应用程序进行二次移植工作,大大降低了工作量,节省运行开销;另一方面,实现了无需运行在root权限下,兼容现有Android环境,并支持现有Android开发环境,无需针对虚拟环境二次开发,降低其开发成本。
在示例性实施例中,本申请还提供了一种电子设备,包括存储器和处理器。该存储器存储有计算机程序,处理器,用于执行存储器上所存放的程序,执行上述实施例中的应用程序的运行方法。
在示例性实施例中,本申请还提供了一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现所述的应用程序的运行方法的步骤。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本申请可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台电子设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施场景所述的方法。
本领域技术人员可以理解附图只是一个优选实施场景的示意图,附图中的模块或流程并不一定是实施本申请所必须的。
本领域技术人员可以理解实施场景中的装置中的模块可以按照实施场景描述进行分布于实施场景的装置中,也可以进行相应变化位于不同于本实施场景的一个或多个装置中。上述实施场景的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本申请序号仅仅为了描述,不代表实施场景的优劣。
以上公开的仅为本申请的几个具体实施场景,但是,本申请并非局限于此,任何本领域的技术人员能思之的变化都应落入本申请的保护范围。

Claims (10)

1.一种应用程序的运行方法,其特征在于,适用于电子设备,所述电子设备包括第一系统的虚拟环境和第二系统的主机环境,所述虚拟环境包括系统调用翻译器,所述方法包括:
响应于应用程序运行指令,获取所述应用程序运行指令中包括的所述第一系统的应用程序;
所述虚拟环境利用第一预设函数,生成目标进程,其中,所述第一预设函数为fork函数;所述目标进程为用于执行应用程序的进程;
所述虚拟环境在利用第二预设函数以将所述应用程序放入所述目标进程之前,截获所述第二预设函数;
所述虚拟环境利用所述系统调用翻译器,得到所述应用程序的应用程序镜像和动态链接器信息;
所述虚拟环境根据预设加载器、所述应用程序镜像和所述动态链接器信息,利用所述第二预设函数,将所述应用程序和动态链接器加载至内存;
根据所述动态链接器和第三预设函数,执行所述应用程序,其中,所述第三预设函数为所述应用程序的start函数。
2.根据权利要求1所述的方法,其特征在于,所述虚拟环境利用所述系统调用翻译器,得到所述应用程序的应用程序镜像和动态链接器信息的步骤,具体包括:
所述虚拟环境利用所述系统调用翻译器,获取所述应用程序在所述主机环境的第一执行路径;
所述虚拟环境根据所述第一执行路径,得到所述应用程序的所述应用程序镜像和所述动态链接器信息。
3.根据权利要求2所述的方法,其特征在于,所述虚拟环境包括虚拟根文件系统,所述虚拟环境利用所述系统调用翻译器,获取所述应用程序在所述主机环境的第一执行路径的步骤,具体包括:
获取所述应用程序在所述虚拟根文件系统的第二执行路径;
所述虚拟环境利用所述系统调用翻译器,将所述应用程序在所述虚拟根文件系统的第二执行路径翻译成所述应用程序在所述主机环境的所述第一执行路径。
4.根据权利要求3所述的方法,其特征在于,所述虚拟环境根据预设加载器、所述应用程序镜像和所述动态链接器信息,利用所述第二预设函数,将所述应用程序和所述动态链接器加载至内存的步骤,具体包括:
获取所述第二预设函数的目标参数,其中,所述目标参数为所述应用程序在所述虚拟根文件系统的所述第二执行路径;
将所述第二预设函数的所述目标参数替换为所述预设加载器;
将所述应用程序镜像和所述动态链接器信息传递至所述预设加载器;
利用所述第二预设函数,将所述预设加载器加载至所述内存;
从内核态返回至用户态;
利用所述预设加载器,将所述应用程序和所述动态链接器加载至所述内存。
5.根据权利要求1所述的方法,其特征在于,根据所述动态链接器和第三预设函数,执行所述应用程序的步骤,具体包括:
跳转至所述应用程序的所述第三预设函数;
获取所述应用程序依赖的动态链接库;
利用所述动态链接器将所述动态链接库加载至所述内存;
执行所述应用程序。
6.根据权利要求1至5中任一项所述的方法,其特征在于,响应于应用程序运行指令,获取所述应用程序运行指令中包括的所述第一系统的应用程序之前,所述方法还包括:
编写预设加载器;
将所述预设加载器设置于所述虚拟环境内。
7.根据权利要求1至5中任一项所述的方法,其特征在于,
第一系统为Linux系统;
第二系统为Android系统。
8.一种应用程序的运行装置,其特征在于,适用于电子设备,所述电子设备包括第一系统的虚拟环境和第二系统的主机环境,所述虚拟环境包括系统调用翻译器,所述装置包括:
获取模块,用于响应于应用程序运行指令,获取所述应用程序运行指令中包括的所述第一系统的应用程序;
第一生成模块,用于所述虚拟环境利用第一预设函数,生成目标进程,其中,所述第一预设函数为fork函数;所述目标进程为用于执行应用程序的进程;
截获模块,用于所述虚拟环境在利用第二预设函数以将所述应用程序放入所述目标进程之前,截获所述第二预设函数;
第二生成模块,用于所述虚拟环境利用所述系统调用翻译器,得到所述应用程序的应用程序镜像和动态链接器信息;
加载模块,用于所述虚拟环境根据预设加载器、所述应用程序镜像和动态链接器信息,利用所述第二预设函数,将所述应用程序和所述动态链接器加载至内存;
执行模块,用于根据所述动态链接器和第三预设函数,执行所述应用程序,其中,所述第三预设函数为所述应用程序的start函数。
9.一种电子设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
CN202211083290.1A 2022-09-06 2022-09-06 应用程序的运行方法、装置、电子设备及可读存储介质 Active CN115390945B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211083290.1A CN115390945B (zh) 2022-09-06 2022-09-06 应用程序的运行方法、装置、电子设备及可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211083290.1A CN115390945B (zh) 2022-09-06 2022-09-06 应用程序的运行方法、装置、电子设备及可读存储介质

Publications (2)

Publication Number Publication Date
CN115390945A CN115390945A (zh) 2022-11-25
CN115390945B true CN115390945B (zh) 2023-05-23

Family

ID=84124892

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211083290.1A Active CN115390945B (zh) 2022-09-06 2022-09-06 应用程序的运行方法、装置、电子设备及可读存储介质

Country Status (1)

Country Link
CN (1) CN115390945B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115827103B (zh) * 2022-12-19 2024-04-09 上海弘积信息科技有限公司 一种程序运行方法及系统
CN116541085B (zh) * 2023-07-05 2023-09-12 成都阿加犀智能科技有限公司 一种Android/Linux融合方法、装置、设备及存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6442752B1 (en) * 1999-08-26 2002-08-27 Unisys Corporation Method, apparatus, and computer program product for replacing a dynamic link library (dll) of a first computing environment with a dll of a second computing environment that can be invoked from the first computing environment in a transparent manner
CN103761139A (zh) * 2014-01-25 2014-04-30 湖南大学 一种基于动态库拦截的通用计算虚拟化实现方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060080682A1 (en) * 2004-10-12 2006-04-13 Picsel Research Ltd. Run time dynamic linking
CN114047960A (zh) * 2021-11-10 2022-02-15 北京鲸鲮信息系统技术有限公司 操作系统运行方法及装置、电子设备和存储介质

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6442752B1 (en) * 1999-08-26 2002-08-27 Unisys Corporation Method, apparatus, and computer program product for replacing a dynamic link library (dll) of a first computing environment with a dll of a second computing environment that can be invoked from the first computing environment in a transparent manner
CN103761139A (zh) * 2014-01-25 2014-04-30 湖南大学 一种基于动态库拦截的通用计算虚拟化实现方法

Also Published As

Publication number Publication date
CN115390945A (zh) 2022-11-25

Similar Documents

Publication Publication Date Title
CN115390945B (zh) 应用程序的运行方法、装置、电子设备及可读存储介质
US9836380B2 (en) Systems and methods for testing terminal applications
US6571388B1 (en) Building a custom software environment including pre-loaded classes
US7287190B2 (en) Simultaneous execution of test suites on different platforms
CN103177210B (zh) 一种在Android中植入动态污点分析模块的方法
US6637024B1 (en) Method and product for debugging a target java virtual machine having no debug information therein
CN111666096B (zh) 目标应用的热更新方法和装置、存储介质和电子设备
CN108229148B (zh) 一种基于Android虚拟机的沙箱脱壳方法及系统
US9516094B2 (en) Event-responsive download of portions of streamed applications
CN108446149B (zh) 一种第三方动态库接口拦截方法及系统
US20140331204A1 (en) Micro-execution for software testing
CN107391219B (zh) 函数编译方法和装置
JP2009501368A (ja) エミュレータパフォーマンスを向上させる仮想コードの選択的プリコンパイル
US11003668B2 (en) Programming language independent software testing environment
CN109857432B (zh) 一种游戏应用的热更新方法和装置
CN106055481B (zh) 计算机程序的测试方法及装置
US20150081269A1 (en) Language Localization Of Java Applications
CN110018831B (zh) 程序处理方法、装置及计算机可读存储介质
US10606612B2 (en) Context check bypass to enable opening shared-object libraries
CN103176903A (zh) MapReduce分布式系统程序的测试方法及设备
CN109144575B (zh) 跨操作系统运行应用的装置、方法、电子设备和存储器
US10133652B2 (en) Debugging optimized code using FAT binary
CN115658140A (zh) 一种sdk的打包方法、装置、终端以及存储介质
CN109947407B (zh) 一种数据获取方法及装置
Brizendine et al. Pre-built JOP chains with the JOP ROCKET: Bypassing DEP without ROP

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant