CN105975333B - 应用程序运行控制的方法及装置 - Google Patents
应用程序运行控制的方法及装置 Download PDFInfo
- Publication number
- CN105975333B CN105975333B CN201510993178.5A CN201510993178A CN105975333B CN 105975333 B CN105975333 B CN 105975333B CN 201510993178 A CN201510993178 A CN 201510993178A CN 105975333 B CN105975333 B CN 105975333B
- Authority
- CN
- China
- Prior art keywords
- resource
- application
- destination application
- program
- native applications
- 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
Links
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/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/482—Application
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种应用程序运行控制的方法,包括:反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,目标应用程序的所需资源与原生应用程序的所需资源一一对应;通过钩子函数对目标应用程序的活动进程进行监控;当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与目标应用程序的所需资源一一对应的原生应用程序的所需资源。本发明还提供了一种应用程序运行控制的装置。通过执行目标应用程序的相关资源,能够实现与执行原生应用程序的相关资源完全相同的执行结果;且目标应用程序运行在通过宿主应用程序构建的沙箱中,其安装及运行活动均不被系统所感知。
Description
技术领域
本发明涉及计算机技术领域,具体而言,本发明涉及一种应用程序运行控制的方法,及一种应用程序运行控制的装置。
背景技术
随着时代的发展,各种终端设备已成为人们生活中必不可少的工具,各种功能强大的终端操作系统及终端应用程序不断涌现,为用户带来了更加便捷的体验。现有技术中,应用程序在终端设备的系统环境中仅可以唯一的形式安装并运行,即对于一种即时通信类应用程序,在一台终端设备中仅可以安装并运行一个该即时通信类应用程序,用户仅可以通过唯一的账号登录并对其执行相关操作。但是,随着即时通信类应用程序的普及,越来越多的用户希望在一台终端设备中通过多个账号登录一种即时通信类应用程序以实现对不同好友信息的区分管理及交流。现有技术中,具有通过多个域账号在不同操作系统之间的切换来实现在一台终端设备中通过多个账号登录一种即时通信类应用程序的解决方案。但是,该方案需要最高系统级别的权限且基于多操作系统才可以实现,并不具有普适性。
现有技术中,沙箱是一种按照安全策略限制程序行为的执行环境,目前已经广泛实用于各种操作系统中。以Android为例,一些应用程序,出于实现应用程序固有功能需要之外的目的,特别是商业目的,随意申请系统权限,获取用户隐私数据、执行网络访问、保持设备活动、发送短信行为等。轻则可能导致用户隐私数据泄露,或者占用系统资源,重则可能通过恶意扣费、植入广告、消耗资费、欺诈诱骗等,使用户遭受损失。因此,通过沙箱技术提供的执行环境,由沙箱对系统的资源、权限进行管理,让应用程序于该沙箱中运行,应用程序的访问先经沙箱按安全策略进行审查,由此,形成一种相对于系统本身的隔离运行效果,可以有效地保护系统的安全。对于沙箱中所用到的安全策略,适应各种不同的操作系统有不同的细节考虑,这些有关技术实现的基本知识,均已为本领域技术人员所掌握,恕不赘述。
因此,需要一种通过沙箱技术来执行目标应用程序运行的解决方案,使得运行于沙箱中目标应用程序可实现原生应用程序的全部功能及相应服务。
发明内容
为克服上述技术问题或者至少部分地解决上述技术问题,特提出以下技术方案:
本发明的实施例提出了一种应用程序运行控制的方法,包括:
反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,所述目标应用程序的所需资源与原生应用程序的所属资源一一对应;
通过钩子函数对所述目标应用程序的活动进程进行监控;
当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与所述目标应用程序的所属资源一一对应的所述原生应用程序的所属资源。
优选地,加载该安装包所实现的目标应用程序的步骤,包括:
通过所述宿主应用程序,来建立所述目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系。
优选地,建立所述目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系,具体包括:
解析所述安装包以确定目标应用程序的所属资源的资源名;
根据目标应用程序的所属资源的资源名,加载与原生应用程序的所需资源一一对应的资源。
优选地,所述目标应用程序包括预留扩展项,以用于与所述原生应用程序的扩展资源相匹配。
优选地,该方法还包括:检测到所述原生应用程序的更新服务,基于所述目标应用程序的预留扩展项更新所述目标应用程序的所需资源。
其中,所述宿主应用程序的资源文件和/或动态库文件与所述安装包中的相应文件相同。
优选地,该方法还包括:
通过执行所述目标应用程序的所需资源,以实现与执行所述原生应用程序的所属资源相同的执行结果。
其中,所述目标应用程序的所属资源,包括以下至少任一项:
ActivityManagerService资源;
PackageManagerService资源;
Activity组件;
Service组件;
Broadcast Receiver组件;
Content Provider组件。
本发明的另一实施例提出了一种应用程序运行控制的装置,包括:
加载模块,用于反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,所述目标应用程序的所需资源与原生应用程序的所需资源一一对应;
监控模块,用于通过钩子函数对所述目标应用程序的活动进程进行监控;
调用模块,用于当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与所述目标应用程序的所需资源一一对应的所述原生应用程序的所需资源。
优选地,所述加载模块包括:
建立单元,用于通过所述宿主应用程序,来建立所述目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系。
优选地,所述建立单元具体包括:
解析子单元,用于解析所述安装包以确定目标应用程序的所需资源的资源名;
加载子单元,用于根据目标应用程序的所需资源的资源名,加载与原生应用程序的所需资源一一对应的资源。
优选地,所述目标应用程序包括预留扩展项,以用于与所述原生应用程序的扩展资源相匹配。
优选地,该装置还包括:
更新模块,用于检测到所述原生应用程序的更新服务,基于所述目标应用程序的预留扩展项更新所述目标应用程序的所需资源。
其中,所述宿主应用程序的资源文件和/或动态库文件与所述安装包中的相应文件相同。
优选地,还包括:
实现模块,用于通过执行所述目标应用程序的所需资源,以实现与执行所述原生应用程序的所需资源相同的执行结果。
其中,所述目标应用程序的所需资源,包括以下至少任一项:
ActivityManagerService资源;
PackageManagerService资源;
Activity组件;
Service组件;
Broadcast Receiver组件;
Content Provider组件。
本发明的实施例中,借助反射调用机制去加载与宿主应用程序具有相同包名的目标应用程序,由于与宿主应用程序具有相同的包名,在Android系统中,既能使活动组件和服务组件建立与ActivityManagerService的正常通信,又能使活动组件、服务组件以及广播组件等,顺利被PackageManagerService识别,降低现有技术中有关加壳应用程序运行异常的错误率;由于宿主应用程序与目标应用程序使用了相同的包名,不必为被反射调用的目标应用程序的各个组件(Activity,Service,Broadcast Receiver和Content Provider)单独构造主函数入口(ActivityThread.main),也不必考虑因包名而带来的PackageManagerService校验的程序实现复杂度问题,从而大大提高程序运行效率;通过宿主应用程序中建立起原安装包的目标应用程序与沙箱运行环境之间的通信,使得目标应用程序的活动过程可以进一步被沙箱运行环境监视,从而对其适用安全策略,并通过在宿主应用程序中建立目标应用程序的所需资源与原生应用程序的所需资源一一对应,可在宿主应用程序中通过钩子函数调用目标应用程序的所需的对应资源,确保目标应用程序能被宿主应用程序正常加载并保持安全运行,且实现了目标应用程序完全独立于原生应用程序。
本发明中,通过执行目标应用程序的相关资源,能够实现与执行原生应用程序的相关资源完全相同的执行结果;且目标应用程序运行在通过宿主应用程序构建的沙箱中,其安装及运行活动均不被系统所感知,从而可以解决现有技术中,对于一种即时通信类应用程序,在一台终端设备中仅可以安装并运行一个该即时通信类应用程序,同时,用户仅可以通过唯一的账号登录并对其执行相关操作的瓶颈。实现了用户希望在一台终端设备中通过多个账号登录一种即时通信类应用程序以实现对不同好友信息的区分管理及交流的实际应用目的。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明中一个实施例的应用程序运行控制的方法的流程图;
图2为本发明中另一实施例的应用程序运行控制的装置的结构示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本发明以下即将描述的一种应用程序运行控制方法和装置所实施的应用场景,是安装在移动终端上的基于Android操作系统的运行环境。
本领域技术人员应当知晓,本发明是基于免Root提权而提出的,然而,提权操作只是Android系统所实施的权限管理控制,本发明也当然地适用于已经Root提权的Android操作系统中。
本发明是基于沙箱原理而提出的,故而,本领域技术人员得以结合公知的沙箱实现原理来理解本发明的实施。沙箱的作用是为目标应用程序的提供相对封闭的运行环境,使应用程序对系统的资源访问,借助沙箱安全策略的应用,而被限制在规定的范围之内。因而,本发明的实质在于提供一种沙箱实例,从两个方面来实现,第一方面是提供构造目标应用程序的解决方案,第二方面是提供与前者相应的运行控制方案。这两个方面可以被集成到一个沙箱实现软件中,利用其第一方面的实现对目标应用程序进行加工,进而利用其第二方面的实现,为目标应用程序提供安全的沙箱运行环境。
有鉴于此,本发明的应用程序运行控制的方法,主要体现沙箱实例的第一方面,用于加工适配于相应的沙箱运行环境的目标应用程序。
图1为本发明中一个实施例的应用程序运行控制的方法的流程图。
其中,在发明的实施例中,目标应用程序为本发明需要实现的应用程序,实现的目标应用程序需要具有原生应用程序的全部功能,能够提供与原生应用程序完全相同的服务。宿主应用程序是实现目标应用程序的加壳应用程序,通过宿主应用程序完成目标应用程序的安装与运行。
步骤S110:反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,目标应用程序的所需资源与原生应用程序的所需资源一一对应;步骤S120:通过钩子函数对目标应用程序的活动进程进行监控;步骤S130:当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与目标应用程序的所需资源一一对应的原生应用程序的所需资源。
本发明的实施例中,借助反射调用机制去加载与宿主应用程序具有相同包名的目标应用程序,由于与宿主应用程序具有相同的包名,在Android系统中,既能使活动组件和服务组件建立与ActivityManagerService的正常通信,又能使活动组件、服务组件以及广播组件等,顺利被PackageManagerService识别,降低现有技术中有关加壳应用程序运行异常的错误率;由于宿主应用程序与目标应用程序使用了相同的包名,不必为被反射调用的目标应用程序的各个组件(Activity,Service,BroadcastReceiver和Content Provider)单独构造主函数入口(ActivityThread.main),也不必考虑因包名而带来的PackageManagerService校验的程序实现复杂度问题,从而大大提高程序运行效率;通过宿主应用程序中建立起原安装包的目标应用程序与沙箱运行环境之间的通信,使得目标应用程序的活动过程可以进一步被沙箱运行环境监视,从而对其适用安全策略,并通过在宿主应用程序中建立目标应用程序的所需资源与原生应用程序的所需资源一一对应,可在宿主应用程序中通过钩子函数调用目标应用程序的所需的对应资源,确保目标应用程序能被宿主应用程序正常加载并保持安全运行,且实现了目标应用程序完全独立于原生应用程序。
本发明中,通过执行目标应用程序的相关资源,能够实现与执行原生应用程序的相关资源完全相同的执行结果;且目标应用程序运行在通过宿主应用程序构建的沙箱中,其安装及运行活动均不被系统所感知,从而可以解决现有技术中,对于一种即时通信类应用程序,在一台终端设备中仅可以安装并运行一个该即时通信类应用程序,同时,用户仅可以通过唯一的账号登录并对其执行相关操作的瓶颈。实现了用户希望在一台终端设备中通过多个账号登录一种即时通信类应用程序以实现对不同好友信息的区分管理及交流的实际应用目的。
步骤S110:反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,目标应用程序的所需资源与原生应用程序的所需资源一一对应。
其中,目标应用程序的所需资源,包括但不限于:
ActivityManagerService资源;
PackageManagerService资源;
Activity组件;
Service组件;
Broadcast Receiver组件;
Content Provider组件。
其中,宿主应用程序的资源文件和/或动态库文件与安装包中的相应文件相同。
具体地,通过反射机制调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,随后加载该安装包所实现的目标应用程序,并将目标应用程序的所需全部资源与原生应用程序的所需全部资源一一对应。
Android操作系统有其不同于其他操作系统的原理,Android为开发者提供四大组件,具体指Activity、Service、Broadcast Receiver以及Content Provider等组件。Android应用程序以APK安装包的形式提供给用户进行安装,APK安装包中,具有用于封装实现各个组件的程序代码的classes.dex代码文件以及用于表达应用程序所用的各个组件的注册信息以及权限申请信息等内容的Androidmanifest.xml配置文件。由于应用程序的安装过程就是PackageManagerService(PMS)解析Androidmanifest.xml文件的过程,而本发明中应用程序安装包没有安装在本地,因此无法得到应用程序的相关属性信息,但只有获取如Activity组件、Service组件、Broadcast Receiver组件、ContentProvider组件等信息时,才能通过ActivityManagerService(AMS)正常运行应用程序。
本实施例所采用的反射机制可以为Java反射机制,Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象的方法的功能即为JAVA语言的反射机制。
通过反射机制,调用AssetManager中的addAssetPath方法,将宿主应用程序安装文件中的资源加载到Resource中,通过Resource对象调用宿主应用程序安装文件中的资源。在获取宿主应用程序安装文件资源之前,首先要由宿主程序新建DexClassLoader加载宿主应用程序安装包,然后新建AssetManager加载宿主应用程序安装文件的资源,最后通过Resource对象读取宿主应用程序安装文件的资源。
优选地,加载该安装包所实现的目标应用程序的步骤包括步骤S111(图中未示出)。步骤S111(图中未示出):通过宿主应用程序,来建立目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系。
例如,终端设备的操作系统为Android系统,目标应用程序为App1’,该目标应用程序欲实现原生应用程序App1的全部功能与相应服务;在终端设备的宿主应用程序中,“App1’.apk”为宿主应用程序附带资源的安装包,通过Java反射机制调用安装包“App1’.apk”,随后加载“App1’.apk”所实现的目标应用程序App1’,在宿主应用程序中加载“App1’.apk”的过程中,创建目标应用程序App1’的所需全部资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件,其中,目标应用程序App1’的所需全部资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件一一对应且相同于原生应用程序即在终端设备Android操作系统中运行的App1的所需全部资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件。
优选地,建立目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系的步骤具体包括步骤S112(图中未示出)和步骤S113(图中未示出)。步骤S112:解析安装包以确定目标应用程序的所需资源的资源名;步骤S113:根据目标应用程序的所需资源的资源名,加载与原生应用程序的所需资源一一对应的资源。
解析应用程序的原安装包的手段,为本领域技术人员所熟知。安装包APK文件本质上是利用ZIP压缩技术结合签名技术实现的压缩包,因此,一方面可以通过解压技术释放其内部文件,另一方面还可通过Apktool之类的工具软件获取其内部文件(在这种情况下其代码文件会被反向为.smali文件)。本领域技术人员均能娴熟地利用这些公知技术在一个给定目录中对原安装包进行处理,从而通过内存操作(非文件操作)的方式来获得其中的内部文件。
Android应用程序在运行的过程中,是通过一个称为AssetsManager资源管理器来读取打包在APK文件里面的资源文件的。应用程序的每一个Activity组件都关联一个ContextImpl对象,这个ContextImpl对象就是用来描述Activity组件的运行上下文环境的。调用这个ContextImpl对象的成员函数init来执行初始化Activity组件运行上下文环境的工作,其中就包括创建用来访问应用程序资源的Resources对象和AssetsManager对象的工作。其中,ContextImpl.init函数就定义在文件frameworks/base/core/java/android/app/ContextImpl.java中。ContextImpl.init函数中的参数packageInfo指向的是一个loadedApk对象,这个loadedApk对象描述的是当前正在启动组件所属的Apk。用来访问应用程序资源的Resources对象是通过调用参数packageInfo所指向的是一个loadedApk对象的成员函数getResources来创建的。由此可知,可创建Resources对象,以提取或访问应用程序资源。
例如,解析安装包“App1’.apk”以确定目标应用程序App1’的所需全部资源的资源名,如ActivityManagerService、PackageManagerService、Activity、Service、BroadcastReceiver和Content Provider,随后在宿主应用程序中创建原生应用程序App1的所需全部资源一一对应的资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件。
优选地,目标应用程序包括预留扩展项,以用于与原生应用程序的扩展资源相匹配。
具体地,在宿主应用程序中加载目标应用程序App1’的过程中,同时加载目标应用程序App1’的预留扩展项,以用于与原生应用程序App1的扩展资源相匹配。
例如,在宿主应用程序中加载目标应用程序App1’的过程中,同时加载目标应用程序App1’的预留扩展项,当原生应用程序App1发生更新时,如增加了用户界面布局的XML文件“layout.xml”,可在目标应用程序App1’的预留扩展项里创建对应的用户界面布局的XML文件“layout.xml”。
步骤S120:通过钩子函数对目标应用程序的活动进程进行监控。
这里需要补充的是:术语“钩子”涵盖了用于通过拦截在软件组件之间传递的函数调用、消息、或事件来改变或增加操作系统、应用程序、或其他软件组件的行为的技术。而处理这种被拦截的函数调用、事件或消息的代码就被称为钩子hook函数。钩子通常用于各种目标,包括对功能进行调试和对功能进行扩展。其示例可以包括在键盘或鼠标事件传递到应用程序之前拦截它们,或者拦截系统调用(system call)、或者系统函数行为、函数执行结果等,以监视或修改应用程序或其他组件的功能等等。本实施例即可采用钩子hook函数接管所述应用程序运行时所需的安装自校验操作。
作为一个沙箱实例,使目标应用程序运行于沙箱运行环境中,监控目标应用程序的活动进程是沙箱运行环境的核心实现者,负责实现一下的功能:通过监控目标应用程序对资源的访问,使目标应用程序进程能够实现对对应资源的正常调用。例如,上述有关对目标应用程序App1’的安装包的资源进行的调用,可以通过监控具体调用资源的具体调用指令,利用Hook技术来实现。可将通过钩子函数对目标应用程序的活动进程进行监控的方式注册为服务进程,以钩子函数关联目标应用程序App1’活动进程的调用指令以实现对目标应用程序App1’的活动监控。
步骤S130:当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与目标应用程序的所需资源一一对应的原生应用程序的所需资源。
例如,利用钩子函数对相关调用指令的入口点进行监视,截获此一调用指令,并获取目标应用程序App1’访问的资源的名称,如钩子函数获取到目标应用程序App1’访问的资源为ActivityManagerService,随后转向执行相应的钩子函数,由该钩子函数调用与原生应用程序对应的ActivityManagerService资源。
在一优选实施例中,该方法还包括步骤S140(图中未示出)。步骤S140:检测到原生应用程序的更新服务,基于目标应用程序的预留扩展项更新目标应用程序的所需资源。
例如,当宿主应用程序检测到原生应用程序App1的更新服务时,如更新服务中包括增加了用户界面布局的XML文件“layout.xml”,在目标应用程序App1’的预留扩展项里创建对应的用户界面布局的XML文件“layout.xml”,实现对目标应用程序App1’的相应更新。
在一优选实施例中,该方法还包括S150(图中未示出)。步骤S150:通过执行目标应用程序的所需资源,以实现与执行原生应用程序的所需资源相同的执行结果。
例如,通过执行原生应用程序App1所需终端设备Android系统的ActivityManagerService资源可激活启动原生应用程序App1,在宿主应用程序中,通过执行目标应用程序App1’所需的宿主应用程序中的ActivityManagerService资源可激活启动目标应用程序App1’。
在本优选实施例中,通过执行目标应用程序的相关资源,能够实现与执行原生应用程序的相关资源完全相同的执行结果;且目标应用程序运行在通过宿主应用程序构建的沙箱中,其安装及运行活动均不被系统所感知,从而可以解决现有技术中,对于一种即时通信类应用程序,在一台终端设备中仅可以安装并运行一个该即时通信类应用程序,同时,用户仅可以通过唯一的账号登录并对其执行相关操作的瓶颈。实现了用户希望在一台终端设备中通过多个账号登录一种即时通信类应用程序以实现对不同好友信息的区分管理及交流的实际应用目的。
图2为本发明中另一实施例的应用程序运行控制的装置的结构示意图。
其中,在发明的实施例中,目标应用程序为本发明需要实现的应用程序,实现的目标应用程序需要具有原生应用程序的全部功能,能够提供与原生应用程序完全相同的服务。宿主应用程序是实现目标应用程序的加壳应用程序,通过宿主应用程序完成目标应用程序的安装与运行。
加载模块210反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,目标应用程序的所需资源与原生应用程序的所需资源一一对应;监控模块220通过钩子函数对目标应用程序的活动进程进行监控;调用模块230当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与目标应用程序的所需资源一一对应的原生应用程序的所需资源。
加载模块210反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,目标应用程序的所需资源与原生应用程序的所需资源一一对应。
其中,目标应用程序的所需资源,包括但不限于:
ActivityManagerService资源;
PackageManagerService资源;
Activity组件;
Service组件;
Broadcast Receiver组件;
Content Provider组件。
其中,宿主应用程序的资源文件和/或动态库文件与安装包中的相应文件相同。
具体地,通过反射机制调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,随后加载该安装包所实现的目标应用程序,并将目标应用程序的所需全部资源与原生应用程序的所需全部资源一一对应。
Android操作系统有其不同于其他操作系统的原理,Android为开发者提供四大组件,具体指Activity、Service、Broadcast Receiver以及Content Provider等组件。Android应用程序以APK安装包的形式提供给用户进行安装,APK安装包中,具有用于封装实现各个组件的程序代码的classes.dex代码文件以及用于表达应用程序所用的各个组件的注册信息以及权限申请信息等内容的Androidmanifest.xml配置文件。由于应用程序的安装过程就是PackageManagerService(PMS)解析Androidmanifest.xml文件的过程,而本发明中应用程序安装包没有安装在本地,因此无法得到应用程序的相关属性信息,但只有获取如Activity组件、Service组件、Broadcast Receiver组件、ContentProvider组件等信息时,才能通过ActivityManagerService(AMS)正常运行应用程序。
本实施例所采用的反射机制可以为Java反射机制,Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象的方法的功能即为JAVA语言的反射机制。
通过反射机制,调用AssetManager中的addAssetPath方法,将宿主应用程序安装文件中的资源加载到Resource中,通过Resource对象调用宿主应用程序安装文件中的资源。在获取宿主应用程序安装文件资源之前,首先要由宿主程序新建DexClassLoader加载宿主应用程序安装包,然后新建AssetManager加载宿主应用程序安装文件的资源,最后通过Resource对象读取宿主应用程序安装文件的资源。
优选地,加载模块210包括建立单元(图中未示出);建立单元通过所述宿主应用程序,来建立所述目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系。
例如,终端设备的操作系统为Android系统,目标应用程序为App1’,该目标应用程序欲实现原生应用程序App1的全部功能与相应服务;在终端设备的宿主应用程序中,“App1’.apk”为宿主应用程序附带资源的安装包,通过Java反射机制调用安装包“App1’.apk”,随后加载“App1’.apk”所实现的目标应用程序App1’,在宿主应用程序中加载“App1’.apk”的过程中,创建目标应用程序App1’的所需全部资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件,其中,目标应用程序App1’的所需全部资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件一一对应且相同于原生应用程序即在终端设备Android操作系统中运行的App1的所需全部资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件。
优选地,建立单元具体包括解析子单元(图中未示出)和加载子单元(图中未示出)。解析子单元:解析安装包以确定目标应用程序的所需资源的资源名;加载子单元:根据目标应用程序的所需资源的资源名,加载与原生应用程序的所需资源一一对应的资源。
解析应用程序的原安装包的手段,为本领域技术人员所熟知。安装包APK文件本质上是利用ZIP压缩技术结合签名技术实现的压缩包,因此,一方面可以通过解压技术释放其内部文件,另一方面还可通过Apktool之类的工具软件获取其内部文件(在这种情况下其代码文件会被反向为.smali文件)。本领域技术人员均能娴熟地利用这些公知技术在一个给定目录中对原安装包进行处理,从而通过内存操作(非文件操作)的方式来获得其中的内部文件。
Android应用程序在运行的过程中,是通过一个称为AssetsManager资源管理器来读取打包在APK文件里面的资源文件的。应用程序的每一个Activity组件都关联一个ContextImpl对象,这个ContextImpl对象就是用来描述Activity组件的运行上下文环境的。调用这个ContextImpl对象的成员函数init来执行初始化Activity组件运行上下文环境的工作,其中就包括创建用来访问应用程序资源的Resources对象和AssetsManager对象的工作。其中,ContextImpl.init函数就定义在文件frameworks/base/core/java/android/app/ContextImpl.java中。ContextImpl.init函数中的参数packageInfo指向的是一个loadedApk对象,这个loadedApk对象描述的是当前正在启动组件所属的Apk。用来访问应用程序资源的Resources对象是通过调用参数packageInfo所指向的是一个loadedApk对象的成员函数getResources来创建的。由此可知,可创建Resources对象,以提取或访问应用程序资源。
例如,解析安装包“App1’.apk”以确定目标应用程序App1’的所需全部资源的资源名,如ActivityManagerService、PackageManagerService、Activity、Service、BroadcastReceiver和Content Provider,随后在宿主应用程序中创建原生应用程序App1的所需全部资源一一对应的资源如ActivityManagerService资源、PackageManagerService资源、Activity组件、Service组件、Broadcast Receiver组件和Content Provider组件。
优选地,目标应用程序包括预留扩展项,以用于与原生应用程序的扩展资源相匹配。
具体地,在宿主应用程序中加载目标应用程序App1’的过程中,同时加载目标应用程序App1’的预留扩展项,以用于与原生应用程序App1的扩展资源相匹配。
例如,在宿主应用程序中加载目标应用程序App1’的过程中,同时加载目标应用程序App1’的预留扩展项,当原生应用程序App1发生更新时,如增加了用户界面布局的XML文件“layout.xml”,可在目标应用程序App1’的预留扩展项里创建对应的用户界面布局的XML文件“layout.xml”。
监控模块220通过钩子函数对目标应用程序的活动进程进行监控。
这里需要补充的是:术语“钩子”涵盖了用于通过拦截在软件组件之间传递的函数调用、消息、或事件来改变或增加操作系统、应用程序、或其他软件组件的行为的技术。而处理这种被拦截的函数调用、事件或消息的代码就被称为钩子hook函数。钩子通常用于各种目标,包括对功能进行调试和对功能进行扩展。其示例可以包括在键盘或鼠标事件传递到应用程序之前拦截它们,或者拦截系统调用(system call)、或者系统函数行为、函数执行结果等,以监视或修改应用程序或其他组件的功能等等。本实施例即可采用钩子hook函数接管所述应用程序运行时所需的安装自校验操作。
作为一个沙箱实例,使目标应用程序运行于沙箱运行环境中,监控目标应用程序的活动进程是沙箱运行环境的核心实现者,负责实现一下的功能:通过监控目标应用程序对资源的访问,使目标应用程序进程能够实现对对应资源的正常调用。例如,上述有关对目标应用程序App1’的安装包的资源进行的调用,可以通过监控具体调用资源的具体调用指令,利用Hook技术来实现。可将通过钩子函数对目标应用程序的活动进程进行监控的方式注册为服务进程,以钩子函数关联目标应用程序App1’活动进程的调用指令以实现对目标应用程序App1’的活动监控。
调用模块230当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与目标应用程序的所需资源一一对应的原生应用程序的所需资源。
例如,利用钩子函数对相关调用指令的入口点进行监视,截获此一调用指令,并获取目标应用程序App1’访问的资源的名称,如钩子函数获取到目标应用程序App1’访问的资源为ActivityManagerService,随后转向执行相应的钩子函数,由该钩子函数调用与原生应用程序对应的ActivityManagerService资源。
在一优选实施例中,该装置还包括更新模块(图中未示出)。更新模块检测到原生应用程序的更新服务,基于目标应用程序的预留扩展项更新目标应用程序的所需资源。
例如,当宿主应用程序检测到原生应用程序App1的更新服务时,如更新服务中包括增加了用户界面布局的XML文件“layout.xml”,在目标应用程序App1’的预留扩展项里创建对应的用户界面布局的XML文件“layout.xml”,实现对目标应用程序App1’的相应更新。
在一优选实施例中,该装置还包括实现模块(图中未示出)。实现模块通过执行目标应用程序的所需资源,以实现与执行原生应用程序的所需资源相同的执行结果。
例如,通过执行原生应用程序App1所需终端设备Android系统的ActivityManagerService资源可激活启动原生应用程序App1,在宿主应用程序中,通过执行目标应用程序App1’所需的宿主应用程序中的ActivityManagerService资源可激活启动目标应用程序App1’。
在本优选实施例中,通过执行目标应用程序的相关资源,能够实现与执行原生应用程序的相关资源完全相同的执行结果;且目标应用程序运行在通过宿主应用程序构建的沙箱中,其安装及运行活动均不被系统所感知,从而可以解决现有技术中,对于一种即时通信类应用程序,在一台终端设备中仅可以安装并运行一个该即时通信类应用程序,同时,用户仅可以通过唯一的账号登录并对其执行相关操作的瓶颈。实现了用户希望在一台终端设备中通过多个账号登录一种即时通信类应用程序以实现对不同好友信息的区分管理及交流的实际应用目的。
本技术领域技术人员可以理解,本发明包括涉及用于执行本申请中所述操作中的一项或多项的设备。这些设备可以为所需的目的而专门设计和制造,或者也可以包括通用计算机中的已知设备。这些设备具有存储在其内的计算机程序,这些计算机程序选择性地激活或重构。这样的计算机程序可以被存储在设备(例如,计算机)可读介质中或者存储在适于存储电子指令并分别耦联到总线的任何类型的介质中,所述计算机可读介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随即存储器)、EPROM(Erasable ProgrammableRead-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically ErasableProgrammable Read-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,可读介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。
本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流图中的每个框以及这些结构图和/或框图和/或流图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其他可编程数据处理方法的处理器来实现,从而通过计算机或其他可编程数据处理方法的处理器来执行本发明公开的结构图和/或框图和/或流图的框或多个框中指定的方案。
本技术领域技术人员可以理解,本发明中已经讨论过的各种操作、方法、流程中的步骤、措施、方案可以被交替、更改、组合或删除。进一步地,具有本发明中已经讨论过的各种操作、方法、流程中的其他步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。进一步地,现有技术中的具有与本发明中公开的各种操作、方法、流程中的步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (16)
1.一种应用程序运行控制的方法,其特征在于,包括:
反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,所述目标应用程序的所需资源与原生应用程序的所需资源一一对应;
通过钩子函数对所述目标应用程序的活动进程进行监控;
当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与所述目标应用程序的所需资源一一对应的所述原生应用程序的所需资源。
2.根据权利要求1所述应用程序运行控制的方法,其中,加载该安装包所实现的目标应用程序的步骤,包括:
通过所述宿主应用程序,来建立所述目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系。
3.根据权利要求2所述的应用程序运行控制的方法,其中,建立所述目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系,具体包括:
解析所述安装包以确定目标应用程序的所需资源的资源名;
根据目标应用程序的所需资源的资源名,加载与原生应用程序的所需资源一一对应的资源。
4.根据权利要求1所述的应用程序运行控制的方法,所述目标应用程序包括预留扩展项,以用于与所述原生应用程序的扩展资源相匹配。
5.根据权利要求4所述的应用程序运行控制的方法,该方法还包括:
检测到所述原生应用程序的更新服务,基于所述目标应用程序的预留扩展项更新所述目标应用程序的所需资源。
6.根据权利要求1所述的应用程序运行控制的方法,其中,所述宿主应用程序的资源文件和/或动态库文件与所述安装包中的相应文件相同。
7.根据权利要求1-6任一项所述的应用程序运行控制的方法,还包括:
通过执行所述目标应用程序的所需资源,以实现与执行所述原生应用程序的所需资源相同的执行结果。
8.根据权利要求1所述的应用程序运行控制的方法,其中,所述目标应用程序的所需资源,包括以下至少任一项:
ActivityManagerService资源;
PackageManagerService资源;
Activity组件;
Service组件;
Broadcast Receiver组件;
Content Provider组件。
9.一种应用程序运行控制的装置,其特征在于,包括:
加载模块,用于反射调用与宿主应用程序具有相同包名的作为宿主应用程序附带资源的安装包,以加载该安装包所实现的目标应用程序,其中,所述目标应用程序的所需资源与原生应用程序的所需资源一一对应;
监控模块,用于通过钩子函数对所述目标应用程序的活动进程进行监控;
调用模块,用于当通过钩子函数监测到对目标应用程序的活动进程的调用指令时,调用与所述目标应用程序的所需资源一一对应的所述原生应用程序的所需资源。
10.根据权利要求9所述应用程序运行控制的装置,其中,所述加载模块包括:
建立单元,用于通过所述宿主应用程序,来建立所述目标应用程序的所需资源与原生应用程序的所需资源的一一对应关系。
11.根据权利要求10所述的应用程序运行控制的装置,其中,所述建立单元具体包括:
解析子单元,用于解析所述安装包以确定目标应用程序的所需资源的资源名;
加载子单元,用于根据目标应用程序的所需资源的资源名,加载与原生应用程序的所需资源一一对应的资源。
12.根据权利要求9所述的应用程序运行控制的装置,所述目标应用程序包括预留扩展项,以用于与所述原生应用程序的扩展资源相匹配。
13.根据权利要求12所述的应用程序运行控制的装置,该装置还包括:
更新模块,用于检测到所述原生应用程序的更新服务,基于所述目标应用程序的预留扩展项更新所述目标应用程序的所需资源。
14.根据权利要求9所述的应用程序运行控制的装置,其中,所述宿主应用程序的资源文件和/或动态库文件与所述安装包中的相应文件相同。
15.根据权利要求9-14任一项所述的应用程序运行控制的装置,还包括:
实现模块,用于通过执行所述目标应用程序的所需资源,以实现与执行所述原生应用程序的所需资源相同的执行结果。
16.根据权利要求9所述的应用程序运行控制的装置,其中,所述目标应用程序的所需资源,包括以下至少任一项:
ActivityManagerService资源;
PackageManagerService资源;
Activity组件;
Service组件;
Broadcast Receiver组件;
Content Provider组件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510993178.5A CN105975333B (zh) | 2015-12-24 | 2015-12-24 | 应用程序运行控制的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510993178.5A CN105975333B (zh) | 2015-12-24 | 2015-12-24 | 应用程序运行控制的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105975333A CN105975333A (zh) | 2016-09-28 |
CN105975333B true CN105975333B (zh) | 2019-05-31 |
Family
ID=56988302
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510993178.5A Active CN105975333B (zh) | 2015-12-24 | 2015-12-24 | 应用程序运行控制的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105975333B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108121561B (zh) * | 2016-11-28 | 2021-08-17 | 百度在线网络技术(北京)有限公司 | 应用程序修复方法、装置和系统 |
CN106708580A (zh) * | 2016-12-27 | 2017-05-24 | 北京奇虎科技有限公司 | 应用程序免安装运行的方法、系统及智能终端 |
US10747874B2 (en) * | 2018-05-22 | 2020-08-18 | NortonLifeLock, Inc. | Systems and methods for controlling an application launch based on a security policy |
CN111324888B (zh) * | 2018-12-13 | 2024-05-10 | 北京奇虎科技有限公司 | 应用程序启动时的验证方法、装置、电子设备及存储介质 |
CN111324386B (zh) * | 2018-12-13 | 2024-08-20 | 北京奇虎科技有限公司 | 分身应用程序的启动方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8196213B2 (en) * | 2008-07-11 | 2012-06-05 | Microsoft Corporation | Verification of un-trusted code for consumption on an insecure device |
CN103885763A (zh) * | 2012-12-21 | 2014-06-25 | 腾讯科技(深圳)有限公司 | 操作系统资源访问方法和系统 |
CN104376255A (zh) * | 2014-11-28 | 2015-02-25 | 北京奇虎科技有限公司 | 应用程序运行控制方法与装置 |
CN104462879A (zh) * | 2014-11-28 | 2015-03-25 | 北京奇虎科技有限公司 | 应用程序免Root运行控制方法与装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9307009B2 (en) * | 2012-02-15 | 2016-04-05 | Mobilespan Inc. | Presenting execution of a remote application in a mobile device native format |
-
2015
- 2015-12-24 CN CN201510993178.5A patent/CN105975333B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8196213B2 (en) * | 2008-07-11 | 2012-06-05 | Microsoft Corporation | Verification of un-trusted code for consumption on an insecure device |
CN103885763A (zh) * | 2012-12-21 | 2014-06-25 | 腾讯科技(深圳)有限公司 | 操作系统资源访问方法和系统 |
CN104376255A (zh) * | 2014-11-28 | 2015-02-25 | 北京奇虎科技有限公司 | 应用程序运行控制方法与装置 |
CN104462879A (zh) * | 2014-11-28 | 2015-03-25 | 北京奇虎科技有限公司 | 应用程序免Root运行控制方法与装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105975333A (zh) | 2016-09-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105975333B (zh) | 应用程序运行控制的方法及装置 | |
CN105955782B (zh) | 应用程序运行控制的方法及装置 | |
CN106156186B (zh) | 一种数据模型管理装置、服务器及数据处理方法 | |
CN106384045B (zh) | 基于应用程序虚拟化的安卓存储应用沙箱及通信方法 | |
CN104992081B (zh) | 一种Android应用程序第三方代码的安全增强方法 | |
CN105389263B (zh) | 应用软件权限监控方法、系统及设备 | |
CN106357609B (zh) | 一种创建用户的方法和系统、公网服务器及私有云设备 | |
CN106650427B (zh) | 沙箱运行环境的检测方法及检测装置 | |
CN110119350A (zh) | 软件开发工具包测试方法、装置和设备及计算机存储介质 | |
CN106066803B (zh) | 应用程序运行控制的方法及装置 | |
CN103514395B (zh) | 插件权限控制方法及系统 | |
CN111552568A (zh) | 云服务调用方法和装置 | |
CN105094996A (zh) | 基于动态权限验证的Android系统安全增强方法及系统 | |
CN106547590A (zh) | 隐私应用程序的启动方法和启动装置 | |
CN112527252A (zh) | 小程序管理方法及装置、小程序平台、电子设备、介质 | |
CN110427752A (zh) | 一种沙箱监控应用程序的方法、移动终端及存储介质 | |
WO2017004918A1 (zh) | 安全控制方法、装置和计算机存储介质 | |
CN104899481A (zh) | 防止应用程序反编译的系统及其方法 | |
CN106293821B (zh) | 获取及传输应用程序数据、运行应用程序的方法及装置 | |
CN105447384B (zh) | 一种反监控的方法、系统及移动终端 | |
CN107943622B (zh) | 备用运维方法、装置和系统 | |
CN112463266A (zh) | 执行策略生成方法、装置、电子设备以及存储介质 | |
CN105608774A (zh) | 一种智能门禁控制系统及其控制方法 | |
RU2520395C2 (ru) | Способ и система для контроля системы, связанной с безопасностью | |
CN111385253A (zh) | 一种面向配电自动化系统网络安全的脆弱性检测系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20220729 Address after: Room 801, 8th floor, No. 104, floors 1-19, building 2, yard 6, Jiuxianqiao Road, Chaoyang District, Beijing 100015 Patentee after: BEIJING QIHOO TECHNOLOGY Co.,Ltd. Address before: 100088 room 112, block D, 28 new street, new street, Xicheng District, Beijing (Desheng Park) Patentee before: BEIJING QIHOO TECHNOLOGY Co.,Ltd. Patentee before: Qizhi software (Beijing) Co.,Ltd. |
|
TR01 | Transfer of patent right |