一种轻量级移动应用虚拟化系统转让专利

申请号 : CN202010588083.6

文献号 : CN111796909A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王总辉章新豪刘沛宇陈文志

申请人 : 浙江大学

摘要 :

本发明公开了一种轻量级移动应用虚拟化系统,包括设于Android系统的容器启动辅助进程和AMS进程,用于管理容器的容器根进程;所述容器启动辅助进程构建Intent数据包,并根据Intent数据包创建并发送创建虚拟化应用请求至所述AMS进程;所述AMS进程接收创建虚拟化应用请求并解析接收的Intent数据包,并根据Intent数据包向容器根进程发送创建容器进程请求;所述容器根进程创建并初始化应用运行环境,在接收到创建容器进程请求后创建容器进程,所述容器进程根据发送的加载容器应用请求从所述AMS进程获得容器应用的包信息,并启动该容器应用。以减少应用虚拟化需要占用的系统资源。

权利要求 :

1.一种轻量级移动应用虚拟化系统,其特征在于,包括设于Android系统的容器启动辅助进程和Activity Manager Service进程,还包括用于管理容器的容器根进程;

其中,所述容器启动辅助进程构建Intent数据包,并根据Intent数据包创建并发送创建虚拟化应用请求至所述Activity Manager Service进程;

所述Activity Manager Service进程接收创建虚拟化应用请求并解析接收的Intent数据包,并根据Intent数据包向容器根进程发送创建容器进程请求;根据接收的加载容器应用请求发送容器应用的包信息至所述容器根进程;

所述容器根进程创建并初始化应用运行环境,在接收到创建容器进程请求后创建容器进程,所述容器进程根据发送的加载容器应用请求从所述Activity Manager Service进程获得容器应用的包信息,并启动该容器应用。

2.如权利要求1所述的轻量级移动应用虚拟化系统,其特征在于,在构建Intent数据包时,向Intent数据包添加用于识别请求启动的是虚拟化应用的FLAG_ACTIVITY_CONTAINER标识。

3.如权利要求1所述的轻量级移动应用虚拟化系统,其特征在于,所述容器启动辅助进程在发送启动创建容器应用的请求前,还进行应用检查,向所述Package Manager Service发起目标组件查询请求,查看要启动的目标组件是否被安装,如果目标组件没有安装,向所述Package Manager Service发起目标组件安装请求,并根据目标组件安装请求传入的目标应用的安装包地址,安装目标应用。

4.如权利要求1所述的轻量级移动应用虚拟化系统,其特征在于,所述Activity Manager Service对Intent数据包解析后,根据Intent数据中记录的目标应用程序的包名和UID查看当前Android系统中是否安装目标应用程序,若存在安装记录,则查找并判断目标应用程序的应用进程是否存在,若应用进程不存在,则根据目标应用程序的包名和UID创建一个新的记录,用以存储应用程序的信息;

检查Intent数据中是否包含FLAG_ACTIVITY_CONTAINER标志,在包含FLAG_ACTIVITY_CONTAINER标志时,则通过容器socket向所述容器根进程发送容器进程创建请求。

5.如权利要求1所述的轻量级移动应用虚拟化系统,其特征在于,所述容器根进程创建并初始化应用运行环境包括:创建一个Java虚拟机、注册jni函数,加载jni函数中的ZygoteInit类和预加载Java类和Android资源。

6.如权利要求1所述的轻量级移动应用虚拟化系统,其特征在于,所述创建容器进程包括:

检查所述创建容器进程请求中的uid、gid、gids、capabilities安全权限和应用程序的abi,检查通过后调用fork系统调用创建相应的子进程并加载ActivityThread进行容器应用的初始化;

ActivityThread在初始化过程中会设置应用中需要使用的系统路径、设置当前应用的证书保存的位置、设置进程的名称并创建Binder线程池,用以处理Android系统服务的Binder通信。

7.如权利要求1所述的轻量级移动应用虚拟化系统,其特征在于,所述

ActivityManagerService收到加载容器应用请求后,根据Binder请求发送者的uid查找容器应用的包信息,并将包信息传递给所述容器进程;

所述容器进程在收到目标容器应用的包信息后加载并启动目标容器应用。

8.如权利要求1~7任一项所述的轻量级移动应用虚拟化系统,其特征在于,所述容器根进程为每个容器设一个容器标识符作为容器应用实例ID,该容器标识符映射了容器应用实例与对应的应用进程记录的匹配关系;

通过该容器标识符与应用程序ID,当容器标识符与应用程序ID与已经存在的容器标识符与应用程序ID无法匹配时,为容器应用创建新的容器进程和新的Activity Stack,实现同应用多虚拟化实例。

9.如权利要求1~7任一项所述的轻量级移动应用虚拟化系统,其特征在于,所述容器根进程还为每个容器创建一个允许访问权限列表,为每个允许访问权限列表设置一个名称Namespace ID;

当容器应用要通过Android系统的service manager服务访问Android系统的系统服务时,service manager服务根据Namespace ID对应的允许访问权限列表中包含的访问服务开放对应的系统服务给容器应用。

说明书 :

一种轻量级移动应用虚拟化系统

技术领域

[0001] 本发明属于虚拟化技术领域,具体涉及一种轻量级移动应用虚拟化系统。

背景技术

[0002] 移动智能设备的出现和普及,带来了诸多问题和挑战。移动应用市场巨大的需求引导移动应用开发门槛降低,再加上智能设备操作系统不完善的权限机制和安全模型,移动操作系统成为当前病毒软件最具吸引力的目标。同时,用户对于移动应用的依赖加深,需要多个终端设备扮演不同的用户角色应对不同的应用场景需求,以保护用户个人隐私和数据安全。
[0003] 虚拟化技术具有提升应用的安全和满足解决多场景角色需求的特性,将虚拟化技术和移动操作系统相结合是目前解决方案的重要方向。不同于传统操作系统应用虚拟化,安卓设备内核初始化完成后会运行安卓操作系统,安卓系统中运行大量的系统服务,供用户态进程访问系统资源。应用市场中的app需要在安卓系统框架中安装、加载和运行,受安卓系统的控制和管理。现有的解决方案都是通过系统级虚拟化,如Cells,Condroid,Nezha,Gemini,将一个完整的安卓操作系统运行在虚拟机或容器中,为用户应用提供资源访问服务,再在虚拟化的操作系统环境下运行目标应用,这大大增加了应用虚拟化的响应时间和资源消耗,在资源有限的智能设备终端上并不适用。
[0004] 申请公布号为CN106572014A公开了一种虚拟化网络系统,申请公布号为CN103207762A公开了一种存储虚拟化系统,这两中虚拟化系统均不适用于Android系统。

发明内容

[0005] 本发明的目的就是提供一种轻量级移动应用虚拟化系统,以减少应用虚拟化需要占用的系统资源,提高了应用虚拟化在智能移动设备上的可用性。
[0006] 为实现上述发明目的,本发明提供以下技术方案:
[0007] 一种轻量级移动应用虚拟化系统,包括设于Android系统的容器启动辅助进程和Activity Manager Service(AMS)进程,还包括用于管理容器的容器根进程;
[0008] 其中,所述容器启动辅助进程构建Intent数据包,并根据Intent数据包创建并发送创建虚拟化应用的请求至所述Activity Manager Service进程;
[0009] 所述Activity Manager Service进程接收创建虚拟化应用的请求并解析接收的Intent数据包,并根据Intent数据包向容器根进程发送创建容器进程请求;根据接收的加载容器应用请求发送容器应用的包信息至所述容器根进程;
[0010] 所述容器根进程创建并初始化应用运行环境,在接收到创建容器进程请求后创建容器进程,所述容器进程根据发送的加载容器应用请求从所述Activity Manager Service进程获得容器应用的包信息,并启动该容器应用。
[0011] 其中,在构建Intent数据包时,向Intent数据包添加用于识别请求启动的是虚拟化应用的FLAG_ACTIVITY_CONTAINER标识。
[0012] 优选地,所述容器启动辅助进程在发送启动创建容器应用的请求前,还进行应用检查,向所述Package Manager Service发起目标组件查询请求,查看要启动的目标组件是否被安装,如果目标组件没有安装,向所述Package Manager Service发起目标组件安装请求,并根据目标组件安装请求传入的目标应用的安装包地址,安装目标应用。
[0013] 优选地,所述Activity Manager Service对Intent数据包解析后,根据Intent数据中记录的目标应用程序的包名和UID查看当前Android系统中是否安装目标应用程序,若存在安装记录,则查找并判断目标应用程序的应用进程是否存在,若应用进程不存在,则根据目标应用程序的包名和UID创建一个新的记录,用以存储应用程序的信息;
[0014] 检查Intent数据中是否包含FLAG_ACTIVITY_CONTAINER标志,在包含FLAG_ACTIVITY_CONTAINER标志时,则通过容器socket向所述容器根进程发送容器进程创建请求。
[0015] 优选地,所述容器根进程创建并初始化应用运行环境包括:
[0016] 创建一个Java虚拟机、注册jni函数,加载jni函数中的ZygoteInit类和预加载Java类和Android资源。
[0017] 优选地,所述创建容器进程包括:
[0018] 检查所述创建容器进程请求中的uid、gid、gids、capabilities安全权限和应用程序的abi,检查通过后调用fork系统调用创建相应的子进程并加载ActivityThread进行容器应用的初始化;
[0019] ActivityThread在初始化过程中会设置应用中需要使用的系统路径、设置当前应用的证书保存的位置、设置进程的名称并创建Binder线程池,用以处理Android系统服务的Binder通信。
[0020] 优选地,所述ActivityManagerService收到加载容器应用请求后,根据Binder请求发送者的uid查找容器应用的包信息,并将包信息传递给所述容器进程;
[0021] 所述容器进程在收到目标容器应用的包信息后加载并启动目标容器应用。
[0022] 为了实现应用虚拟化实例,所述容器根进程为每个容器设一个容器标识符作为容器应用实例ID,该容器标识符映射了容器应用实例与对应的应用进程记录的匹配关系;
[0023] 通过该容器标识符与应用程序ID,当容器标识符与应用程序ID与已经存在的容器标识符与应用程序ID无法匹配时,为容器应用创建新的容器进程和新的Activity Stack,实现同应用多虚拟化实例。
[0024] 优选地,所述容器根进程还为每个容器创建一个允许访问权限列表,为每个允许访问权限列表设置一个名称Namespace ID;
[0025] 当容器应用要通过Android系统的service manager服务访问Android系统的系统服务时,service manager服务根据Namespace ID对应的允许访问权限列表中包含的访问服务开放对应的系统服务给容器应用。
[0026] 与现有技术相比,本发明具有的有益效果为:
[0027] 本发明提供的轻量级移动应用虚拟化系统在安卓操作系统环境下,利用容器技术实现应用级虚拟化,同一个应用可以具备多个虚拟化实例,同时控制虚拟化应用对系统服务的访问限制。减少了应用虚拟化需要占用的系统资源,提高了应用虚拟化在智能移动设备上的可用性,为提升应用的安全性和解决多场景角色需求提供了巨大的支持。

附图说明

[0028] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动前提下,还可以根据这些附图获得其他附图。
[0029] 图1是实施例提供的轻量级移动应用虚拟化系统的框架图;
[0030] 图2是实施例提供的应用虚拟化多实例的示例图;
[0031] 图3是实施例提供的系统服务访问控制的流程图。

具体实施方式

[0032] 为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不限定本发明的保护范围。
[0033] 为了实现在安卓操作系统环境下,实现应用级虚拟化,同一个应用可以具备多个虚拟化实例,控制虚拟化应用对系统服务的访问限制。提供了一种轻量级移动应用虚拟化系统,如图1所示,该轻量级移动应用虚拟化系统包括设于Android系统的容器启动辅助进程contaienrTool和Activity Manager Service进程,还包括用于管理容器的容器根进程container-init。containerTool向安卓系统服务ActivityManagerService进程发送创建虚拟化应用请求,container-init进程初始化应用运行环境并接收到ActivityManagerService启动应用请求后,创建进程并加载目标应用。整个系统的运作流程如图1所示。
[0034] 容器启动辅助进程contaienrTool设于Android系统host,主要实现构建Intent、应用检查和向ActivityManagerService发送创建虚拟化应用请求功能。
[0035] 针对构建Intent流程,containerTool根据启动者的用户标识以及目标应用组件名构建Intent数据包,该Intent数据包是android系统用于数据传输的数据包,并向Intent数据包添加FLAG_ACTIVITY_CONTAINER标识,该FLAG_ACTIVITY_CONTAINER标识用于识别请求启动的是正常的应用还是虚拟化应用。
[0036] 在发送启动创建容器应用的请求前,容器启动辅助进程还进行应用检查,向所述Package Manager Service发起目标组件查询请求,查看要启动的目标组件是否被安装,如果目标组件没有安装,向所述Package Manager Service发起目标组件安装请求,并根据目标组件安装请求传入的目标应用的安装包地址,安装目标应用。
[0037] 当应用检查结束后,容器启动辅助进程向ActivityManagerService发起的创建虚拟化应用的请求,并传入之前创建的Intent数据包,向宿主机上的安卓系统请求创建虚拟化应用。
[0038] ActivityManagerService进程为安卓系统自带的服务进程,本发明对其进行了功能修改,该ActivityManagerService主要用于处理创建虚拟化应用请求。
[0039] ActivityManagerService进程收到创建虚拟化应用请求后,解析该创建虚拟化应用请求包含的Intent数据包,根据Intent数据中记录的目标应用程序的包名和UID查看当前Android系统中是否安装目标应用程序,若存在安装记录,则查找并判断目标应用程序的应用进程是否存在,若应用进程不存在,则根据目标应用程序的包名和UID创建一个新的记录,用以存储应用程序的信息;
[0040] 检查Intent数据中是否包含FLAG_ACTIVITY_CONTAINER标志,在包含FLAG_ACTIVITY_CONTAINER标志时,则通过容器socket向所述容器根进程发送容器进程创建请求。
[0041] 容器根进程container-init为实现虚拟化应用的核心,主要用于创建并初始化应用运行环境、创建容器进程和启动容器应用,下面针对每部分进行详细说明。
[0042] 容器根进程container-init在创建并初始化应用运行环境过程中,主要创建一个Java虚拟机、注册jni函数,加载jni函数中的ZygoteInit类和预加载Java类和Android资源。
[0043] 容器根进程在接收到创建容器进程请求后创建容器进程,具体检查所述创建容器进程请求中的uid、gid、gids、capabilities安全权限和应用程序的abi,检查通过后调用fork系统调用创建相应的子进程并加载ActivityThread进行容器应用的初始化;
[0044] ActivityThread在初始化过程中会设置应用中需要使用的系统路径、设置当前应用的证书保存的位置、设置进程的名称并创建Binder线程池,用以处理Android系统服务的Binder通信。
[0045] ActivityManagerService收到加载容器应用请求后,根据Binder请求发送者的uid查找容器应用的包信息,并将包信息传递给所述容器进程;容器进程在收到目标容器应用的包信息后加载并启动目标容器应用。
[0046] 当容器启动的目标应用没有在宿主机或者其他容器内启动时,由于找不到与之匹配应用进程记录以及Activity Stack,ActivityManagerService会为其创建新的容器进程和Activity Stack,用以启动和存放目标应用的Activity。而当宿主机或者其他容器启动了同名的目标应用时,由于记录ID存在,所以ActivityManagerService不会创建相应的容器进程和Activity Stack,导致容器进程启动失败。
[0047] 当容器启动的目标应用没有在宿主机或者其他容器内启动时,由于Activity Record中找不到与之匹配应用进程记录以及Activity Stack,ActivityManagerService会为其创建新的容器进程和Activity Stack,用以启动和存放目标应用的Activity。而当宿主机或者其他容器启动了已经存在的应用的多个虚拟化实例时,由于记录ID存在,ActivityManagerService不会创建相应的容器进程和Activity Stack,导致应用虚拟化启动失败。
[0048] 图2描述了应用虚拟化多实例解决方案,容器根进程为每个容器设一个容器标识符作为容器应用实例ID,该容器标识符映射了容器应用实例与对应的应用进程记录的匹配关系;
[0049] 实施例中使用容器IPC Namespace ID作为用户ID的标识符,不同的容器拥有不同的IPC Namespace ID,由于用户ID的标识符不同,不同容器之间的应用记录相互隔离。当ActivityManagerService根据UID+APPId作为索引查找记录时,只查找当前容器对应的应用记录列表,启动同类应用时,由于UID+APPId无法匹配,则会为应用容器创建新的容器进程和新的Activity Stack,实现同应用多虚拟化实例。
[0050] 安卓应用虚拟化实例和宿主机上的用户共享宿主机上的安卓系统服务,应用实例通过service manager服务获取相应的服务的地址便可以通过系统服务获取相应的系统资源,这增加了宿主机上数据泄露的风险,例如设备的传感器数据,网络信息等等。
[0051] 如图3所示,该轻量级移动应用虚拟化系统对安卓应用虚拟化实例在系统服务访问权限上进行了访问权限控制。具体地,容器根进程还为每个容器创建一个允许访问权限列表,为每个允许访问权限列表设置一个名称Namespace ID;当容器应用要通过Android系统的service manager服务访问Android系统的系统服务时,service manager服务根据Namespace ID对应的允许访问权限列表中包含的访问服务开放对应的系统服务给容器应用。
[0052] 当用户应用希望获取服务时,需要向service manager发送服务查询请求service manager服务接收到请求后调用do_find_service方法,根据请求方发送的服务名称查询服务地址。若相应的服务地址存在,则检查服务请求方是否满足SELinux服务访问权限,若满足,则将服务地址返还给Binderclient。在创建应用容器时,我们将允许容器访问的系统服务名称写进配置文件中。当容器运行时,通过解析应用容器,将容器的名称、容器的IPC Namespace ID以及容器允许访问的系统服务建立映射。当虚拟化应用实例希望获取服务时,通过current->nsproxy->ipc_ns将当前进程的IPC Namespace发送给servicemanager。servicemanager收到服务查询请求并检查请求发送方的SELinux服务访问权限满足后,通过Namespace ID到系统服务的映射检查当前请求调用方是否可以获取所请求的服务名,若检查不通过,则拒绝系统资源获取。
[0053] 实施例提供的轻量级移动应用虚拟化系统在安卓操作系统上设计并实现轻量级应用级虚拟化,相比于现有的系统级虚拟化,通过多个应用实例共享安卓系统服务的方式降低了应用虚拟化在响应时间,内存占用,磁盘占用等系统资源的消耗。同时,轻量级移动应用虚拟化系统的技术实现对安卓系统源码进行了修改,增强了本方案的可移植性,可以适配在不同版本和不同厂商定制的安卓系统中。
[0054] 以上所述的具体实施方式对本发明的技术方案和有益效果进行了详细说明,应理解的是以上所述仅为本发明的最优选实施例,并不用于限制本发明,凡在本发明的原则范围内所做的任何修改、补充和等同替换等,均应包含在本发明的保护范围之内。