CN115390945A - 应用程序的运行方法、装置、电子设备及可读存储介质 - Google Patents
应用程序的运行方法、装置、电子设备及可读存储介质 Download PDFInfo
- Publication number
- CN115390945A CN115390945A CN202211083290.1A CN202211083290A CN115390945A CN 115390945 A CN115390945 A CN 115390945A CN 202211083290 A CN202211083290 A CN 202211083290A CN 115390945 A CN115390945 A CN 115390945A
- Authority
- CN
- China
- Prior art keywords
- application program
- virtual environment
- preset
- application
- preset function
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44505—Configuring for program initiating, e.g. using registry, configuration files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
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.一种应用程序的运行方法,其特征在于,适用于电子设备,所述电子设备包括第一***的虚拟环境和第二***的主机环境,所述虚拟环境包括***调用翻译器,所述方法包括:
响应于应用程序运行指令,获取所述应用程序运行指令中包括的所述第一***的应用程序;
所述虚拟环境利用第一预设函数,生成目标进程;
所述虚拟环境在利用第二预设函数以将所述应用程序放入所述目标进程之前,截获所述第二预设函数;
所述虚拟环境利用所述***调用翻译器,得到所述应用程序的应用程序镜像和动态链接器信息;
所述虚拟环境根据预设加载器、所述应用程序镜像和所述动态链接器信息,利用所述第二预设函数,将所述应用程序和动态链接器加载至内存;
根据所述动态链接器和第三预设函数,执行所述应用程序。
2.根据权利要求1所述的方法,其特征在于,所述虚拟环境利用所述***调用翻译器,得到所述应用程序的应用程序镜像和动态链接器信息的步骤,具体包括:
所述虚拟环境利用所述***调用翻译器,获取所述应用程序在所述主机环境的第一执行路径;
所述虚拟环境根据所述第一执行路径,得到所述应用程序的所述应用程序镜像和所述动态链接器信息。
3.根据权利要求2所述的方法,其特征在于,所述虚拟环境包括虚拟根文件***,所述虚拟环境利用所述***调用翻译器,获取所述应用程序在所述主机环境的第一执行路径的步骤,具体包括:
获取所述应用程序在所述虚拟根文件***的第二执行路径;
所述虚拟环境利用所述***调用翻译器,将所述应用程序在所述虚拟根文件***的第二执行路径翻译成所述应用程序在所述主机环境的所述第一执行路径。
4.根据权利要求2所述的方法,其特征在于,所述虚拟环境根据预设加载器、所述应用程序镜像和所述动态链接器信息,利用所述第二预设函数,将所述应用程序和所述动态链接器加载至内存的步骤,具体包括:
获取所述第二预设函数的目标参数,其中,所述目标参数为所述应用程序在所述虚拟根文件***的所述第二执行路径;
将所述第二预设函数的所述目标参数替换为所述预设加载器;
将所述应用程序镜像和所述动态链接器信息传递至所述预设加载器;
利用所述第二预设函数,将所述预设加载器加载至所述内存;
从内核态返回至用户态;
利用所述预设加载器,将所述应用程序和所述动态链接器加载至所述内存。
5.根据权利要求1所述的方法,其特征在于,根据所述动态链接器和第三预设函数,执行所述应用程序的步骤,具体包括:
跳转至所述应用程序的所述第三预设函数;
获取所述应用程序依赖的动态链接库;
利用所述动态链接器将所述动态链接库加载至所述内存;
执行所述应用程序。
6.根据权利要求1至5中所述的方法,其特征在于,响应于应用程序运行指令,获取所述应用程序运行指令中包括的所述第一***的应用程序之前,所述方法还包括:
编写预设加载器;
将所述预设加载器设置于所述虚拟环境内。
7.根据权利要求1至5中任一项所述的方法,其特征在于,
第一***为Linux***;
第二***为Android***。
8.一种应用程序的运行装置,其特征在于,适用于电子设备,所述电子设备包括第一***的虚拟环境和第二***的主机环境,所述虚拟环境包括***调用翻译器,所述装置包括:
获取模块,用于响应于应用程序运行指令,获取所述应用程序运行指令中包括的所述第一***的应用程序;
第一生成模块,用于所述虚拟环境利用第一预设函数,生成目标进程;
截获模块,用于所述虚拟环境在利用第二预设函数以将所述应用程序放入所述目标进程之前,截获所述第二预设函数;
第二生成模块,用于所述虚拟环境利用所述***调用翻译器,得到所述应用程序的应用程序镜像和动态链接器信息;
加载模块,用于所述虚拟环境根据预设加载器、所述应用程序镜像和动态链接器信息,利用所述第二预设函数,将所述应用程序和所述动态链接器加载至内存;
执行模块,用于根据所述动态链接器和第三预设函数,执行所述应用程序。
9.一种电子设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
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 true CN115390945A (zh) | 2022-11-25 |
CN115390945B 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) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115827103A (zh) * | 2022-12-19 | 2023-03-21 | 上海弘积信息科技有限公司 | 一种程序运行方法及*** |
CN116541085A (zh) * | 2023-07-05 | 2023-08-04 | 成都阿加犀智能科技有限公司 | 一种Android/Linux融合方法、装置、设备及存储介质 |
Citations (4)
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 |
US20060080682A1 (en) * | 2004-10-12 | 2006-04-13 | Picsel Research Ltd. | Run time dynamic linking |
CN103761139A (zh) * | 2014-01-25 | 2014-04-30 | 湖南大学 | 一种基于动态库拦截的通用计算虚拟化实现方法 |
CN114047960A (zh) * | 2021-11-10 | 2022-02-15 | 北京鲸鲮信息***技术有限公司 | 操作***运行方法及装置、电子设备和存储介质 |
-
2022
- 2022-09-06 CN CN202211083290.1A patent/CN115390945B/zh active Active
Patent Citations (4)
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 |
US20060080682A1 (en) * | 2004-10-12 | 2006-04-13 | Picsel Research Ltd. | Run time dynamic linking |
CN103761139A (zh) * | 2014-01-25 | 2014-04-30 | 湖南大学 | 一种基于动态库拦截的通用计算虚拟化实现方法 |
CN114047960A (zh) * | 2021-11-10 | 2022-02-15 | 北京鲸鲮信息***技术有限公司 | 操作***运行方法及装置、电子设备和存储介质 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115827103A (zh) * | 2022-12-19 | 2023-03-21 | 上海弘积信息科技有限公司 | 一种程序运行方法及*** |
CN115827103B (zh) * | 2022-12-19 | 2024-04-09 | 上海弘积信息科技有限公司 | 一种程序运行方法及*** |
CN116541085A (zh) * | 2023-07-05 | 2023-08-04 | 成都阿加犀智能科技有限公司 | 一种Android/Linux融合方法、装置、设备及存储介质 |
CN116541085B (zh) * | 2023-07-05 | 2023-09-12 | 成都阿加犀智能科技有限公司 | 一种Android/Linux融合方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115390945B (zh) | 2023-05-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115390945B (zh) | 应用程序的运行方法、装置、电子设备及可读存储介质 | |
US6571388B1 (en) | Building a custom software environment including pre-loaded classes | |
CN109062617B (zh) | 一种支持多类型设备的平台的应用方法、移动终端 | |
CN108121594B (zh) | 一种进程管理方法及装置 | |
CN111666096B (zh) | 目标应用的热更新方法和装置、存储介质和电子设备 | |
Hayden et al. | State transfer for clear and efficient runtime updates | |
US8756616B2 (en) | System and method for reducing the static footprint of mixed-language JAVA classes | |
KR20170094136A (ko) | 2개의 명령어 세트 아키텍처들에 따라 컴파일링된 애플리케이션 코드의 실행을 위한 시스템 및 방법 | |
US11507362B1 (en) | System and method for generating a binary patch file for live patching of an application | |
JP2015531502A (ja) | アプリケーション用の中間言語コードからネイティブコードを生成すること | |
US20130117733A1 (en) | Simultaneously targeting multiple homogeneous and heterogeneous runtime environments | |
CN100492387C (zh) | 基于Keil C51的软件保护开发的方法和*** | |
WO2019005228A1 (en) | AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM | |
CN109597631B (zh) | 一种进程的升级方法、装置及电子设备 | |
CN109857432B (zh) | 一种游戏应用的热更新方法和装置 | |
CN110659031A (zh) | 应用程序的编译方法、装置、电子设备及存储介质 | |
US9116855B2 (en) | Data processing system and data processing method | |
CN115629971A (zh) | 一种应用的开发***和开发方法 | |
CN102364433A (zh) | 在ARM处理器上实现Wine构建工具移植的方法 | |
Kang | Function call interception techniques | |
CN110018831B (zh) | 程序处理方法、装置及计算机可读存储介质 | |
US20130305233A1 (en) | Method and system for separate compilation of device code embedded in host code | |
CN114490103A (zh) | 一种操作***接口调用方法、装置以及电子设备 | |
CN115658140A (zh) | 一种sdk的打包方法、装置、终端以及存储介质 | |
CN109144575B (zh) | 跨操作***运行应用的装置、方法、电子设备和存储器 |
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 |