在x86架构上运行ARM APK的模拟器装置和方法
【专利摘要】提供了一种在x86架构上运行ARM?APK的模拟器装置和方法。一种Android模拟器装置,包括:APK安装模块,解析安装的APK并对包含ARM的动态链接库的APK进行标记;APK运行模块,根据APK安装模块所做的标记使被启动的APK运行在对应的虚拟机上,其中,虚拟机包括基于x86架构的虚拟机和基于ARM架构的虚拟机;CPU指令翻译模块,将运行在基于ARM架构的虚拟机上的APK的CPU指令翻译成x86指令。
【专利说明】在x86架构上运行ARM APK的模拟器装置和方法
【技术领域】
[0001]本发明涉及模拟器【技术领域】,更具体地,涉及一种在x86架构上运行包含ARM动态链接库的APK的Android模拟器装置和方法。
【背景技术】
[0002]目前,Android操作系统被广泛应用于移动计算领域。在Android操作系统的应用程序开发中,通常会使用Android模拟器。Android模拟器能够模拟除了接听和拨打电话外的所有移动设备上的典型功能和行为。Android模拟器提供了大量的导航和控制键,从而使用户可以通过鼠标或键盘点击这些按键来为应用程序产生事件。同时,Android模拟器还可显示Android自带应用程序和用户的应用程序。为了便于模拟和测试应用程序,Android模拟器允许用户的应用程序通过Android平台服务调用其他程序、访问网络、播放音频和视频、保存和传输数据、通知用户、渲染图像过渡和场景。Android模拟器同样具有强大的调试能力,例如能够记录内核输出的控制台、模拟程序中断(比如接收短信或打入电话)、模拟数据通道中的延时效果和遗失。因此,Android模拟器的使用对于Android应用程序的开发具有重要的意义。
[0003]Android模拟器分为ARM架构和x86架构两种。其中,x86架构下的Android模拟器的性能是ARM架构下的Android模拟器(以下简称“ARM模拟器”)的10倍以上。但是,x86架构下的Android模拟器无法运行包含ARM动态链接库的APK (以下简称为“ARM APK"),原因是x86架构的CPU指令集与ARM架构的CPU指令集不兼容。
[0004]因此,需要一种在X86架构的模拟器上运行包含ARM动态链接库的APK的Android模拟器装置和方法。
【发明内容】
[0005]本发明的一方面提供一种在x86架构上运行包含ARM动态链接库的APK的Android模拟器装置,包括:APK安装模块,解析安装的APK并对包含ARM的动态链接库的APK进行标记;APK运行模块,根据APK安装模块所做的标记使被启动的APK运行在对应的虚拟机上,其中,虚拟机包括基于x86架构的虚拟机和基于ARM架构的虚拟机;CPU指令翻译模块,将运行在基于ARM架构的虚拟机上的APK的CPU指令翻译成x86指令。
[0006]根据本发明的一方面,APK安装模块通过判断在APK的Iib目录下是否包含“arm”目录来确定APK是否包含ARM动态链接库。
[0007]根据本发明的一方面,APK安装模块在确定安装的APK包含ARM动态链接库的情况下,在该APK的目录下新建用于指示ARM动态链接库的存在的文件。
[0008]根据本发明的一方面,Android模拟器装置还包括:虚拟机模块,根据APK运行模块发出的通知消息来初始化对应的虚拟机,并使用对应的虚拟机来运行被启动的APK,其中,基于x86架构的虚拟机和基于ARM架构的虚拟机被实现为Android Dalvik虚拟机的Zygote 进程。[0009]根据本发明的一方面,基于ARM架构的虚拟机运行在CPU指令翻译模块启动的进程之上。
[0010]根据本发明的另一方面,一种在X86架构的Android模拟器上运行包含ARM动态链接库的APK的方法包括:解析安装的APK并对包含ARM的动态链接库的APK进行标记;根据APK安装模块所做的标记使被启动的APK运行在对应的虚拟机上其中,虚拟机包括基于x86架构的虚拟机和基于ARM架构的虚拟机;将运行在基于ARM架构的虚拟机上的APK的CPU指令翻译成x86指令。
[0011 ] 根据本发明的另一方面,对包含ARM的动态链接库的APK进行标记包括:通过判断在APK的Iib目录下是否包含“arm”目录来确定APK是否包含ARM动态链接库。
[0012]根据本发明的另一方面,对包含ARM的动态链接库的APK进行标记包括:如果确定安装的APK包含ARM动态链接库,则在该APK的目录下新建用于指示ARM动态链接库的存在的文件。
[0013]根据本发明的另一方面,根据APK安装模块所做的标记使被启动的APK运行在对应的虚拟机上包括:发出通知消息以通知Android模拟器使用不同的虚拟机来运行被启动的APK,其中,基于x86的虚拟机和基于ARM的虚拟机分别实现为Android Dalvik虚拟机的Zygote 进程。
[0014]根据本发明的另一方面,基于ARM架构的虚拟机运行在CPU指令翻译模块启动的进程之上。
【专利附图】
【附图说明】
[0015]通过下面结合附图进行的描述,本发明的上述和其他目的和特点将会变得更加清楚,其中:
[0016]图1是示出根据本发明实施例的在x86架构上运行包含ARM动态链接库的APK的Android模拟器装置的配置框图;
[0017]图2是示出根据本发明实施例的在x86架构的Android模拟器上运行包含ARM动态链接库的APK的方法的流程图。
【具体实施方式】
[0018]下面提供参照附图进行的描述以有助于全面理解如权利要求及其等同物所限定的本发明的示例性实施例。在所述描述中,除非明确指明,否则相同的变量具有相同的定义。所述描述包括各种详细的细节以有助于理解,而这些描述将被认为仅为示例性的。因此,本领域的普通技术人员将意识到在不脱离本发明的范围和精神的情况下可做出在此描述的各种改变和变型。另外,为了清晰和简洁,可省略对公知功能和构造的描述。
[0019]图1是示出根据本发明实施例的用于在x86架构上运行包含ARM动态链接库的APK的Android模拟器装置的配置框图。
[0020]如图1所示,根据本发明实施例的于在x86架构上运行包含ARM动态链接库的APK的Android模拟器装置100包括:APK安装模块110、APK启动模块120、虚拟机模块130和CPU指令翻译模块140。
[0021]APK安装模块110用于解析用户所安装的APK,并在安装的APK包含ARM的动态链接库时对该APK进行特殊的标记。
[0022]通常,在x86架构的Android模拟器上运行的Android系统中,其支持的指令集变量被设置为“x86”。在用户安装APK时,Android模拟器会将APK文件解压,然后查询Iib目录下是否有x86目录。如果有,则Android模拟器将x86目录下的动态链接库文件拷贝到Android系统中;如果没有,则不进行任何操作。
[0023]根据本发明实施例的用于在x86架构上运行包含ARM动态链接库的APK的模拟器装置100的APK安装模块110在此基础上进行了扩展。根据本发明实施例的APK安装模块110判断安装的APK是否是包含有ARM动态链接库。[0024]具体地,根据本发明的一个实施例,APK安装模块110可根据以下方式来判断APK中是否存在ARM动态链接库。APK安装模块110将模拟器100支持的指令集变量设置为“x86”和“arm”两个值。在用户安装APK时,在对APK进行解压之后,APK安装模块110会优先判断在APK的Iib目录下是否包含x86目录。如果有,则APK安装模块110将x86目录下的动态链接库文件拷贝到Android系统中。如果不存在x86目录,则APK安装模块110还判断安装的APK的Iib目录下是否存在“arm”目录。如果存在“arm”目录,则APK安装模块110确定安装的APK中存在ARM动态链接库。
[0025]接下来,在确定存在ARM动态链接库之后,APK安装模块110将arm目录下的库文件拷贝到android系统中,并且对该安装的APK进行标记。根据本发明的一个实施例,APK安装模块110可以在APK的目录下新建一个用于指示ARM动态链接库的存在的文件。例如,可以将该文件命名为“ARM_FLAG”,并且文件内容为空。这样,在后续的处理中,如果APK包含“ARM_FLAG”文件,就表明该APK包含ARM的动态链接库(以下,称为ARM APK);反之,如果不存在该文件,则表明该APK不包含ARM动态链接库。
[0026]在安装完成之后运行该安装的APK时,APK运行模块120根据APK安装模块110做的标记来相应地运行该APK。具体地,APK运行模块120可检查运行的APK的目录下是否存在名称为“ARM_FLAG”的文件。如果存在该文件,则APK运行模块120发送消息通知虚拟机模块130使用ARM架构的虚拟机来运行APK。如果不存在该文件,则APK运行模块120发送消息通知虚拟机模块130使用x86架构的虚拟机来运行该APK。应理解,在APK中添加指示包含ARM动态链接库的标记的方式不限于上述的方法,例如,还可在APK中添加指示ARM动态链接库的语句等方式。
[0027]虚拟机模块130包括基于x86架构的虚拟机和基于ARM架构的虚拟机,虚拟机模块130可根据APK运行模块120的通知消息来初始化并使用不同的虚拟机来运行APK。基于x86的虚拟机和基于ARM的虚拟机可分别实现为Android Dalvik虚拟机的Zygote进程。这样,包含ARM动态链接库的APK可运行在基于ARM架构的虚拟机上,从而无论APK包含x86或是ARM的动态链接库,都可以在模拟器100中被启动。
[0028]CPU指令翻译模块140用于将ARM架构下的CPU指令翻译成x86指令。基于ARM架构的虚拟机可运行在CPU指令翻译模块140之上。当APK运行模块120确定要运行ARMAPK时,其通知CPU指令翻译模块140启动一个进程,并将运行在基于ARM的虚拟机上的ARMAPK的程序加载入该进程,开始运行主函数main。这样,CPU指令翻译模块140可将每一条ARM指令翻译成x86指令,从而可以在x86的Android模拟器上执行。例如,在ARM动态链接库被加载后给出vadd.?16指令,则CPU指令翻译模块140将该指令翻译成paddw指令,然后通过x86的Android模拟器使x86架构的CPU执行该指令。又例如,当ARM动态链接库给出vshl.u8指令时,CPU指令翻译模块140将该指令翻译成psllw、movd、pinsrw、pand四个指令,然后让x86的CPU执行该组指令。
[0029]应理解,以上的APK安装模块110、APK启动模块120、虚拟机模块130和CPU指令翻译模块140可根据实际需求被划分为更多的模块,或者被组合为更少的模块。
[0030]下面将参照图2的流程图来说明根据本发明实施例的在x86架构的Android模拟器上运行包含ARM动态链接库的APK的方法。
[0031]首先,在步骤S201,对安装的APK进行分析并对包含ARM动态链接库的APK进行标记。具体地,在安装模块对APK进行解压之后,首先可判断安装的APK的Iib目录下是否存在“arm”目录。如果存在“arm”目录,则确定安装的APK中存在ARM动态链接库。这时,可将ARM动态链接库拷贝到Android系统,并在APK的目录下新建一个文件,命名为“ARM_FLAG”,文件内容为空,该文件可以用于指示ARM动态链接库的存在。当然,可以采用其它本领域的技术人员已知的任何方式来对APK进行标记以指示ARM动态链接库的存在。相反,如果不存在“arm”目录而存在“x86”目录,则将x86的动态链接库拷贝到Android系统中。
[0032]接下来,在步骤S203,确定当前运行的APK是否存在指示ARM动态链接库的标记。具体地,检查当前运行的APK的目录下是否存在指示ARM动态链接库的存在的标记。例如,可检查APK的目录下是否存在名称为“ARM_FLAG”的文件。如果不存在该文件,则在步骤S205,使用x86架构的虚拟机来运行该APK。如果在步骤S203确定APK包含指示ARM动态链接库的标记,则在步骤S207使用ARM架构的虚拟机来运行APK。
[0033]这里,基于x86的虚拟机和基于ARM的虚拟机可分别实现为Android Dalvik虚拟机的Zygote进程。包含ARM动态链接库的APK可运行在基于ARM架构的虚拟机上。
[0034]然后,在步骤S209,将运行在基于ARM架构的虚拟机上的APK的CPU指令翻译成x86指令。基于ARM架构的虚拟机可运行在CPU指令翻译的进程之上。
[0035]通过以上过程,基于x86架构的Android模拟器可运行包含ARM动态链接库的APK,从而可以在具有更高性能的平台上实现APK的运行,从而极大地方便了 APK的开发和调试。
[0036]根据本发明的方法可被记录在包括执行由计算机实现的各种操作的程序指令的计算机可读介质中。介质也可以只包括程序指令或者包括与程序指令相结合的数据文件、数据结构等。计算机可读介质的例子包括磁介质(例如硬盘、软盘和磁带);光学介质(例如CD-ROM和DVD);磁光介质(例如,光盘);以及特别配制用于存储并执行程序指令的硬件装置(例如,只读存储器(ROM)、随机存取存储器(RAM)、闪存等)。介质也可以是包括传输规定程序指令、数据结构等的信号的载波的传输介质(例如光学线或金属线、波导等)。程序指令的例子包括例如由编译器产生的机器码和包含可使用解释器由计算机执行的高级代码的文件。
[0037]尽管已经参照本发明的示例性实施例具体显示和描述了本发明,但是本领域的技术人员应该理解,在不脱离由权利要求限定的本发明的精神和范围的情况下,可以对其进行形式和细节上的各种改变。
【权利要求】
1.一种在X86架构上运行包含ARM动态链接库的APK的Android模拟器装置,包括: APK安装模块,解析安装的APK并对包含ARM的动态链接库的APK进行标记; APK运行模块,根据APK安装模块所做的标记使被启动的APK运行在对应的虚拟机上,其中,虚拟机包括基于x86架构的虚拟机和基于ARM架构的虚拟机; CPU指令翻译模块,将运行在基于ARM架构的虚拟机上的APK的CPU指令翻译成x86指令。
2.如权利要求1所述的Android模拟器装置,其中,APK安装模块通过判断在APK的Iib目录下是否包含“arm”目录来确定APK是否包含ARM动态链接库。
3.如权利要求1所述的Android模拟器装置,其中,APK安装模块在确定安装的APK包含ARM动态链接库的情况下,在该APK的目录下新建用于指示ARM动态链接库的存在的文件。
4.如权利要求1所述的Android模拟器装置,还包括:虚拟机模块,根据APK运行模块发出的通知消息来初始化对应的虚拟机,并使用对应的虚拟机来运行被启动的APK,其中,基于x86架构的虚拟机和基于ARM架构的虚拟机被实现为Android Dalvik虚拟机的Zygote 进程。
5.如权利要求4所述的Android模拟器装置,其中,基于ARM架构的虚拟机运行在CPU指令翻译模块启动的进程之上。
6.一种在x86架构的Android模拟器上运行包含ARM动态链接库的APK的方法,包括: 解析安装的APK并对包含ARM的动态链接库的APK进行标记; 根据APK安装模块所做的标记使被启动的APK运行在对应的虚拟机上其中,虚拟机包括基于x86架构的虚拟机和基于ARM架构的虚拟机; 将运行在基于ARM架构的虚拟机上的APK的CPU指令翻译成x86指令。
7.如权利要求6所述的方法,其中,对包含ARM的动态链接库的APK进行标记包括:通过判断在APK的Iib目录下是否包含“arm”目录来确定APK是否包含ARM动态链接库。
8.如权利要求6所述的方法,其中,对包含ARM的动态链接库的APK进行标记包括:如果确定安装的APK包含ARM动态链接库,则在该APK的目录下新建用于指示ARM动态链接库的存在的文件。
9.如权利要求6所述的方法,其中,根据APK安装模块所做的标记使被启动的APK运行在对应的虚拟机上包括:发出通知消息以通知Android模拟器使用不同的虚拟机来运行被启动的APK,其中,基于x86的虚拟机和基于ARM的虚拟机分别实现为Android Dalvik虚拟机的Zygote进程。
10.如权利要求9所述的方法,其中,基于ARM架构的虚拟机运行在CPU指令翻译模块启动的进程之上。
【文档编号】G06F9/455GK103885814SQ201410104264
【公开日】2014年6月25日 申请日期:2014年3月20日 优先权日:2014年3月20日
【发明者】孙元臻, 张蔚, 禤彪 申请人:百度在线网络技术(北京)有限公司