CN116009992A - 应用程序内的交互方法及相关装置 - Google Patents
应用程序内的交互方法及相关装置 Download PDFInfo
- Publication number
- CN116009992A CN116009992A CN202111237319.2A CN202111237319A CN116009992A CN 116009992 A CN116009992 A CN 116009992A CN 202111237319 A CN202111237319 A CN 202111237319A CN 116009992 A CN116009992 A CN 116009992A
- Authority
- CN
- China
- Prior art keywords
- shared memory
- sub
- main process
- animation engine
- 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.)
- Pending
Links
Images
Classifications
-
- 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
- Stored Programmes (AREA)
Abstract
本申请的实施例提供了一种应用程序内的交互方法及相关装置,该方法包括:在原生应用程序中嵌入动画引擎,原生应用程序包括原生程序对接模块;根据原生应用程序创建主进程,由主进程根据动画引擎和原生程序对接模块创建子进程;向子进程提供主进程的第一接口定义语言对象,向主进程提供所述子进程的第二接口定义语言对象;基于第一接口定义语言对象和第二接口定义语言对象进行主进程和子进程之间的交互;在动画引擎中调用原生程序对接模块的方法,在原生程序对接模块中调用动画引擎的接口,进行动画引擎和原生程序对接模块之间的交互。本申请基于多进程实现了原生应用程序和动画引擎的完整交互,可以使含有动画引擎的应用程序内的交互更加稳定。
Description
技术领域
本申请涉及软件开发技术领域,具体而言,涉及一种应用程序内的交互方法及相关装置。
背景技术
当前,对于含有动画引擎的应用程序,一般都是以动画引擎作为主工程。但如果在发展成熟的原生应用程序中嵌入动画引擎,通常会导致诸如黑屏、闪退、无响应等交互不够稳定的问题。
发明内容
本申请的实施例提供了一种应用程序内的交互方法及相关装置,进而至少在一定程度上可以使含有动画引擎的应用程序内部的交互更加稳定。
本申请的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本申请的实践而习得。
根据本申请实施例的一个方面,提供了一种应用程序内的交互方法,所述方法包括:在原生应用程序中嵌入动画引擎,所述原生应用程序包括原生程序对接模块;根据所述原生应用程序创建主进程,并由所述主进程根据所述动画引擎和所述原生程序对接模块创建子进程;向所述子进程提供所述主进程的第一接口定义语言对象,并向所述主进程提供所述子进程的第二接口定义语言对象;基于所述第一接口定义语言对象和所述第二接口定义语言对象进行所述主进程和所述子进程之间的交互;在所述动画引擎中调用所述原生程序对接模块中的方法,在所述原生程序对接模块中调用所述动画引擎提供的接口,以在所述子进程中进行所述动画引擎和所述原生程序对接模块之间的交互。
根据本申请实施例的一个方面,提供了一种应用程序内的交互装置,所述装置包括:嵌入单元,用于在原生应用程序中嵌入动画引擎,所述原生应用程序包括原生程序对接模块;创建单元,用于根据所述原生应用程序创建主进程,并由所述主进程根据所述动画引擎和所述原生程序对接模块创建子进程;提供单元,用于向所述子进程提供所述主进程的第一接口定义语言对象,并向所述主进程提供所述子进程的第二接口定义语言对象;第一交互单元,用于基于所述第一接口定义语言对象和所述第二接口定义语言对象进行所述主进程和所述子进程之间的交互;第二交互单元,用于在所述动画引擎中调用所述原生程序对接模块中的方法,在所述原生程序对接模块中调用所述动画引擎提供的接口,以在所述子进程中进行所述动画引擎和所述原生程序对接模块之间的交互。
在本申请的一些实施例中,基于前述方案,所述嵌入单元配置为:对动画引擎的程序包进行解压,得到解压结果;将所述解压结果拷贝至原生应用程序的工程目录中;对所述动画引擎对应的配置文件中的目标属性进行修改,以将所述动画引擎配置为单独进程。
在本申请的一些实施例中,基于前述方案,所述嵌入单元还用于:将所述动画引擎中的校验代码删除。
在本申请的一些实施例中,基于前述方案,所述提供单元配置为:当所述子进程中的活动组件启动时,通过所述子进程绑定所述主进程中的服务组件,并从所述服务组件中获取所述主进程的第一接口定义语言对象;通过所述子进程调用所述第一接口定义语言对象的方法,以将所述子进程的第二接口定义语言对象传递给所述主进程。
在本申请的一些实施例中,基于前述方案,所述第一交互单元还用于:在所述主进程中创建数据发送对象,并为所述数据发送对象创建对应的共享内存对象,所述共享内存对象与共享内存对应;获取所述共享内存对象对应的文件描述符和数据解析协议信息,所述数据解析协议信息包括所述共享内存的块信息和与所述共享内存中存储的数据相关的信息;将所述文件描述符和所述数据解析协议信息发送至所述子进程,由所述子进程根据接收到所述文件描述符和所述数据解析协议信息创建数据接收对象;在所述子进程中根据所述文件描述符和所述数据解析协议信息构造所述共享内存对象;在所述子进程中通过所述数据接收对象从所述共享内存对象对应的共享内存中读取数据。
在本申请的一些实施例中,基于前述方案,所述第一交互单元配置为:在所述子进程中创建新线程;通过所述新线程以轮询的方式从所述共享内存对象对应的共享内存中读取数据。
在本申请的一些实施例中,基于前述方案,所述第一交互单元配置为:新建共享内存文件;根据所述文件描述符和所述数据解析协议信息构造共享内存子对象;创建buffer映射对象;通过反射机制并基于所述buffer映射对象和所述共享内存子对象对所述共享内存文件进行赋值,得到所述共享内存对象。
在本申请的一些实施例中,基于前述方案,所述共享内存的大小为一帧画面数据大小与预定偏移量的长度之和。
在本申请的一些实施例中,基于前述方案,所述第一交互单元还用于:通过所述主进程和所述子进程分别从所述共享内存对象对应的共享内存中获取在指定位置上记录的信号量,作为目标信号量,其中,所述指定位置位于所述预定偏移量对应的共享内存中;在所述主进程和所述子进程中根据所述目标信号量确定是否访问所述共享内存对象对应的共享内存。
根据本申请实施例的一个方面,提供了一种计算机可读介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上述实施例中所述的应用程序内的交互方法。
根据本申请实施例的一个方面,提供了一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如上述实施例中所述的应用程序内的交互方法。
在本申请的一些实施例所提供的技术方案中,通过在原生应用程序中嵌入动画引擎之后,分别创建主进程和子进程,其中,主进程是根据原生应用程序创建的,而子进程是根据动画引擎以及原生应用程序中的原生程序对接模块而创建的,在此基础上,一方面,向主进程和子进程分别提供对方进程的接口定义语言对象,使得主进程和子进程可以基于接口定义语言对象进行交互,另一方面,原生程序对接模块可以调用动画引擎提供的接口,而动画引擎可以调用原生程序对接模块中的方法,这样就实现了动画引擎和原生程序对接模块间的交互。因此,整个方案以原生应用程序作为主工程,在原生应用程序中嵌入动画引擎的同时,基于多进程实现了应用程序中原生应用程序部分和动画引擎的完整交互,可以使含有动画引擎的应用程序内部的交互更加稳定。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1示出了可以应用本申请实施例的技术方案的示例性系统架构的示意图;
图2示出了根据本申请的一个实施例的应用程序内的交互方法的流程图;
图3示出了根据本申请的一个实施例的在原生应用程序中嵌入动画引擎的流程图;
图4示出了根据本申请的一个实施例的向主进程和子进程提供接口定义语言对象的流程图;
图5示出了根据本申请的一个实施例的基于多进程实现与动画引擎交互的结构图;
图6示出了根据本申请的一个实施例的利用共享内存实现应用程序内数据流交互的流程图;
图7示出了根据本申请的一个实施例的不同进程通过共享内存进行交互的原理示意图;
图8示出了根据本申请的一个实施例的不同进程对共享内存进行访问时实现读写同步的流程图;
图9示出了根据本申请的一个实施例的应用程序内的交互装置的框图;
图10示出了适于用来实现本申请实施例的电子设备的计算机系统的结构示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本申请将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本申请的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本申请的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本申请的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
随着互联网特别是移动互联网时代的到来,用户需要越来越丰富功能的应用程序(App,Application),越来越多的App需要为用户提供动画播放功能,而实现这一功能就需要在App中设置动画引擎。
在含有动画引擎Android的App中,一般都是以动画引擎作为主工程,如果以发展成熟的原生App为主工程,在原生App中嵌入动画引擎,基于单进程或多进程方式内嵌动画引擎,则会出现以下缺陷:
1.动画引擎限制造成二次闪退
一方面,大部分动画引擎设计之初,并不会考虑以原生App为主工程,并在其中内嵌动画引擎的这种接入方式,因此,会对引擎中暴露的Activity进行RootActivity校验,退出Activity,会杀掉整个进程。
另一方面,通常动画引擎会默认一个进程里只能初始化一次引擎,用完引擎后直接结束进程。所以并没有考虑怎样进行安全销毁。所以当再次打开引擎,由于上一次的实例没有销毁完全,会出现变量空指针,造成闪退。
2.基于多进程的嵌入方式
多进程间的交互方案实时性和稳定性不足,而且多进程在持续数据流交互场景中会引起内存极大增长,导致进程被杀。
为此,本申请首先提供了一种应用程序内的交互方法。本申请实施例提供的应用程序内的交互方法可以克服上述缺陷。本申请实施例提供的应用程序内的交互方法不仅可以通过多进程的方式将动画引擎内嵌到Android原生的App中,实现动画引擎与原生程序的完整交互,而且解决了多进程间的持续数据流交互引起内存增长问题。
图1示出了可以应用本申请实施例的技术方案的示例性系统架构的示意图。
如图1所示,系统架构可以包括终端设备(如图1中所示智能手机101、平板电脑102和便携式计算机103中的一种或多种,当然也可以是台式计算机、车载终端等等)、网络104、服务器105和个人计算机106。网络104用以在终端设备和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线通信链路、无线通信链路等等。在本申请实施例中,个人计算机106为本申请提供的一种应用程序内的交互方法的执行终端,且个人计算机106是由开发人员使用的。当本申请提供的应用程序内的交互方法应用于图1所示的系统架构中时,一个过程可以是这样的:首先,开发人员在个人计算机106上分别开发出原生应用程序和动画引擎,并将动画引擎嵌入在原生应用程序中,得到一个应用程序;接着,在应用程序中进一步设置相应的逻辑,使得在应用程序中启动之后进行以下过程:分别创建主进程和子进程,通过向对方进程提供对方进程的接口定义语言对象,实现主进程和子进程之间的交互,通过接口和方法的调用实现子进程内部的交互,这样,便基于多进程实现了内嵌有动画引擎的应用程序的内部交互;然后,开发人员将最终得到的应用程序包上传至服务器105中,这样,各终端设备便可以通过网络104从服务器105下载该应用程序包,并可以将应用程序包安装在终端设备上。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。比如服务器105可以是多个服务器组成的服务器集群等。
在本申请的一个实施例中,各终端设备使用的操作系统为Android系统。
在本申请的一个实施例中,应用程序在各终端设备上运行时,应用程序启动主进程和子进程,并通过在终端设备本地上的共享内存进行主进程和子进程之间的持续数据流交互。
在本申请的一个实施例中,子进程是通过建立的新线程以轮询的方式从共享内存中读取数据的。
在本申请的一个实施例中,主进程和子进程通过读取共享内存的指定位置中的信号量来确定是否与共享内存进行数据传输操作。
需要说明的是,虽然本申请实施例中原生应用程序和动画引擎均是由开发人员在个人计算机106上开发出来的,但在本申请的其他实施例中,原生应用程序和动画引擎中的任意一项程序可以由个人计算机106从其他设备获得,比如原生应用程序或动画引擎可以由个人计算机106从服务器中下载得到,而且原生应用程序和动画引擎可以分别来自不同的设备;虽然本申请实施例中,在完成应用程序包的构造之后,直接将其上传至服务器中,但在本申请的其他实施例中,还可以先将应用程序包发送至测试终端,由测试终端完成对应用程序包的测试之后,再将应用程序包上传至服务器。本申请实施例对此不作任何限定,本申请的保护范围也不应因此而受到任何限制。
并且,易于理解,本申请实施例所提供的应用程序内的交互方法一般由终端设备执行,相应地,应用程序内的交互装置一般设置于终端设备中。但是,在本申请的其它实施例中,服务器也可以与终端设备具有相似的功能,从而执行本申请实施例所提供的应用程序内的交互的方案。
可以通过服务器对基于本申请实施例提供的方法构建的应用程序向用户终端分发,基于本申请实施例提供的方法构建的应用程序所对应的服务端也可以部署在服务器上。服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
本申请实施例可以应用于云计算技术中,具体地,可以通过云计算技术向用户终端下发根据本申请实施例的方法所构建的应用程序。云计算(cloud computing)是一种计算模式,它将计算任务分布在大量计算机构成的资源池上,使各种应用系统能够根据需要获取计算力、存储空间和信息服务。提供资源的网络被称为“云”。“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。
作为云计算的基础能力提供商,会建立云计算资源池(简称云平台,一般称为IaaS(Infrastructure as a Service,基础设施即服务))平台,在资源池中部署多种类型的虚拟资源,供外部客户选择使用。云计算资源池中主要包括:计算设备(为虚拟化机器,包含操作系统)、存储设备、网络设备。
按照逻辑功能划分,在IaaS(Infrastructure as a Service,基础设施即服务)层上可以部署PaaS(Platform as a Service,平台即服务)层,PaaS层之上再部署SaaS(Software as a Service,软件即服务)层,也可以直接将SaaS部署在IaaS上。PaaS为软件运行的平台,如数据库、web容器等。SaaS为各式各样的业务软件,如web门户网站、短信群发器等。一般来说,SaaS和PaaS相对于IaaS是上层。
以下对本申请实施例的技术方案的实现细节进行详细阐述:
图2示出了根据本申请的一个实施例的应用程序内的交互方法的流程图,该应用程序内的交互方法可以由具有计算、存储功能的设备来执行,比如可以是图1中所示的个人计算机106。参照图2所示,该应用程序内的交互方法至少包括以下步骤:
在步骤210中,在原生应用程序中嵌入动画引擎,原生应用程序包括原生程序对接模块。
原生应用程序可以是Android系统中原生的App,基于本申请实施例提供的应用程序内的交互方法所构建的应用程序可以是能够在Android系统上部署的App。本申请实施例的方案可以应用于任何具备动画播放功能的应用程序中。
以原生应用程序作为主工程,在原生应用程序中嵌入动画引擎之后,得到初始项目工程,初始项目工程中尚未实现动画引擎与原生应用程序的可靠交互,需要在初始项目工程中进一步增加其他交互逻辑,这些交互逻辑可以用于执行步骤220-步骤250的方法,从而实现动画引擎与原生应用程序的完整交互过程,进而得到一个完整的内嵌有动画引擎的应用程序。
原生程序对接模块是原生应用程序中用于与动画引擎通信的模块,即原生应用程序与动画引擎通信的中介。
图3示出了根据本申请的一个实施例的在原生应用程序中嵌入动画引擎的流程图。如图3所示,包括以下步骤:
在步骤310中,对动画引擎的程序包进行解压,得到解压结果。
将对引擎主工程打包得到的apk(Android application package,Android应用程序包)解压,得到解压结果。
在步骤320中,将解压结果拷贝至原生应用程序的工程目录中。
对解压结果进行分析,将其中编译出的产物拷贝到原生App的工程目录下。
在步骤330中,对动画引擎对应的配置文件中的目标属性进行修改,以将动画引擎配置为单独进程。
对于引擎对外暴露的Activity组件,在对应的manifest文件里配置android:process属性,将其配置成单独的进程。
在本申请的一个实施例中,所述方法还包括:将动画引擎中的校验代码删除。
具体地,可以在对动画引擎的apk进行解压,并得到包含引擎源码的解压结果之后,将引擎源码中关于RootActivity的逻辑删除。
在本申请实施例中,通过修改引擎源码去掉RootActivity校验的逻辑,避免了因RootActivity校验而杀掉动画引擎对应的进程,进而避免了App发生闪退的情况,提高了App的稳定性。
在步骤220中,根据原生应用程序创建主进程,并由主进程根据动画引擎和原生程序对接模块创建子进程。
创建的主进程可以执行原生应用程序中的代码,这些代码可以不包括原生程序对接模块。
在本申请的一个实施例中,所述方法还包括:启动动画引擎对应的Activity组件。
具体地,主进程可以使用startActivity方法启动Activity组件和子进程。
在步骤230中,向子进程提供主进程的第一接口定义语言对象,并向主进程提供子进程的第二接口定义语言对象。
第一接口定义语言对象和第二接口定义语言对象均为AIDL(Android InterfaceDefinition Language,安卓接口定义语言)对象。
AIDL是一款可供用户用来抽象化IPC(Inter-Process Communication,进程间通信)的工具,利用AIDL提供的接口可以跨进程进行通信。
图4示出了根据本申请的一个实施例的向主进程和子进程提供接口定义语言对象的流程图。如图4所示,包括以下步骤:
在步骤410中,当子进程中的活动组件启动时,通过子进程绑定主进程中的服务组件,并从服务组件中获取主进程的第一接口定义语言对象。
具体地,主进程通过startActivity(Intent intent)唤起子进程,在子进程动画引擎暴露的Activity组件启动后,主动去Bind主进程的Service组件,并且在其中的serviceConnection中,拿到主进程的AIDL对象。
在步骤420中,通过子进程调用第一接口定义语言对象的方法,以将子进程的第二接口定义语言对象传递给主进程。
子进程通过调用主进程的AIDL对象的方法,将自己的AIDL对象传递给主进程。这样主进程也能够持有子进程的AIDL对象了,也就能调用子进程提供的方法。如此,就可以实现主进程和子进程的RPC(remote procedure call,远程过程调用)通信。
在本申请实施例中,通过使主进程和子进程分别持有对方的AIDL对象,实现了进程间通信。
请继续参见图2,在步骤240中,基于第一接口定义语言对象和第二接口定义语言对象进行主进程和子进程之间的交互。
子进程通过调用第一接口定义语言对象对应的方法与主进程进行通信,主进程通过调用第二接口定义语言对象对应的方法与子进程进行通信。
图5示出了根据本申请的一个实施例的基于多进程实现与动画引擎交互的结构图。如图5所示,动画引擎和Bridge类均位于子进程中。首先,动画引擎通过反射,调用子进程中与Bridge类相关的原生java方法,子进程再通过主进程的sub-call-main AIDL对象,调用主进程的对应方法;然后,当调用成功后,主进程的返回值发送给子进程的main-call-sub AIDL对象,并通过该main-call-sub AIDL对象向子进程中的Bridge类传递返回值。当主进程想要控制子进程的时候,通过调用子进程的AIDL对象提供的远端方法,来实现控制调用。
在步骤250中,在动画引擎中调用原生程序对接模块中的方法,在原生程序对接模块中调用动画引擎提供的接口,以在子进程中进行动画引擎和原生程序对接模块之间的交互。
请继续参见图5,完整的交互过程可分为:动画引擎->子进程Java原生->主进程Java原生->子进程Java原生->动画引擎,其中,子进程Java原生为Bridge类。具体地,在原生侧定义一个Bridge类,作为原生与动画引擎通信的核心Bridge,并在动画引擎设定该Bridge的路径。动画引擎可以通过反射机制调用子进程的原生静态方法,如在JavaScript中可通过callStaticMethod方法调用到该约定路径类的某个静态方法。在参数中,传入Java的类名、方法名、方法签名、依赖参数等,就可以直接调用Java的静态方法,并且能获得Java方法的返回值。在子进程中,Bridge类在获取到主进程通过main-call-sub AIDL对象向子进程传递的返回值之后,Bridge类可以通过调用动画引擎暴露的接口来向动画引擎传递返回值。
由于在多进程中的变量和数据都是独立的,如果在音视频等场景需要满足在子进程中也处理主进程中的持续数据流,就会导致占用两份内存,引起内存增长,从而导致进程被杀。
基于此,本申请实施例还实现了在持续数据流交互场景下的内存优化。
图6示出了根据本申请的一个实施例的利用共享内存实现应用程序内数据流交互的流程图。如图6所示,利用共享内存实现应用程序内数据流交互至少可以包括以下步骤:
在步骤610中,在主进程中创建数据发送对象,并为数据发送对象创建对应的共享内存对象,共享内存对象与共享内存对应。
比如,以主进程和子进程之间进行多路视频的数据流传输为例,主进程收到一路数据流时进行初始化操作,此时会建立一个负责进行数据传输的dataSender对象,每一个dataSender对象会持有一块共享内存。
共享内存对象即为MemoryFile,MemoryFile是Android为匿名共享内存而封装的一个对象,用于进程间大数据传递。因此,共享内存对象和MemoryFile都具有对应的共享内存。
在步骤620中,获取共享内存对象对应的文件描述符和数据解析协议信息,数据解析协议信息包括共享内存的块信息和与共享内存中存储的数据相关的信息。
具体地,在dataSender对象的构造函数中创建一块共享内存并唯一标志命名,该块共享内存配置有对应的数据解析协议信息。由于dataSender对象创建的共享内存被抽象为MemoryFile,而在MemoryFile中文件描述符是私有的,因此需要通过反射获取MemoryFile的文件描述符,序列化并持有。
在数据解析协议信息中,共享内存的块信息可以包括共享内存的块的大小,与共享内存中存储的数据相关的信息可以包括帧数据的长宽、视频流的格式、偏移量等附加信息。
在步骤630中,将文件描述符和数据解析协议信息发送至子进程,由子进程根据接收到文件描述符和数据解析协议信息创建数据接收对象。
在本申请的一个实施例中,将文件描述符和数据解析协议信息发送至子进程,包括:将文件描述符和数据解析协议信息转换为预定格式;将转换结果发送至子进程。
在本申请的一个实施例中,将文件描述符和数据解析协议信息发送至子进程,包括:通过第二接口定义语言对象将文件描述符和数据解析协议信息发送至子进程。
具体地,在主进程初始化后,dataSender对象通过AIDL方式将共享内存的文件描述符以及MemoryFile对应的解析协议转成json串发送到子进程。
在步骤640中,在子进程中根据文件描述符和数据解析协议信息构造共享内存对象。
子进程在获取到dataSender对象发来的json串之后,基于json串中的文件描述符和数据解析协议信息构造出同样的共享内存对象。
在本申请的一个实施例中,在子进程中根据文件描述符和数据解析协议信息构造共享内存对象,包括:新建共享内存文件;根据文件描述符和数据解析协议信息构造共享内存子对象;创建buffer映射对象;通过反射机制并基于buffer映射对象和共享内存子对象对共享内存文件进行赋值,得到共享内存对象。
具体而言,MemoryFile是对SharedMemory的封装,里面两个核心的私有成员变量是SharedMemory和buffer映射。在Android8.0以后,对MemoryFile源码进行了变更,变成了对ShareMemoryFile的封装,导致无法通过反射的方式构造出共享内存。因此,针对Android8.0以后的系统,需要先新建一个MemoryFile文件,然后通过反射构造出SharedMemory,并创建一块buffer映射,在最后将ShareMemory与buffer映射通过反射的方式set进MemoryFile文件,从而完成MemoryFile的共享内存的重定向。
在步骤650中,在子进程中通过数据接收对象从共享内存对象对应的共享内存中读取数据。
在子进程得到共享内存对象之后,便可以访问对应的共享内存。
在本申请的一个实施例中,在子进程中通过数据接收对象从共享内存对象对应的共享内存中读取数据,包括:在子进程中创建新线程;通过新线程以轮询的方式从共享内存对象对应的共享内存中读取数据。
具体地,轮询是定期确定是否需要从共享内存中读取数据,进而根据确定结果进行数据读取操作的过程,整个过程周而复始地进行。
由于轮询任务在Binder Thread中会阻塞AIDL的调用,会导致进程间无法通信。本申请实施例中,通过新开一个线程来以轮询的方式读取数据,确保了在执行轮询任务时也可以实现进程间通信。
在本申请实施例中,不同进程直接对同一块共享内存进行操作,实现了进程间通信,提高了通信效率,而且大大减少了内存占用,解决了多进程间的持续数据流交互引起内存增长问题,避免了杀进程的情况,大大降低了闪退、无响应等问题出现的可能性。
在本申请的一个实施例中,所述方法还包括:每当数据读取完成,对游标进行重置。
具体地,使用FileInputStream的方式读取数据,这种情况下,需要每次读完后重置游标,否则会造成下次读取失败。
在本申请的一个实施例中,共享内存的大小为一帧画面数据大小与预定偏移量的长度之和。
具体地,共享内存可以是一个共享内存块,共享内存块的大小=一帧画面数据大小+预定偏移量,预定偏移量为长度可以为1byte,用来存储0,1模拟pv信号量以控制不同进程间的线程读写。
在本申请实施例中,通过在共享内存中保留一帧画面数据的大小,使得不同进程可以通过共享内存进行画面数据传输的过程更为简单和直接。
在本申请的其他实施例中,还可以设置其他共享内存的大小,比如,可以将共享内存的大小设置为两帧画面数据大小与预定偏移量的长度之和。
图7示出了根据本申请的一个实施例的不同进程通过共享内存进行交互的原理示意图。请参见图7所示,进程A和进程B分别具有自身的逻辑地址空间,两个进程可以访问物理内存中的同一块共享内存,其中,进程A可以向该块共享内存中写入数据,进程B可以从该块共享内存中读取数据;同理,进程B也可以向该块共享内存中写入数据,进程A也可以从该块共享内存中读取数据。
图8示出了根据本申请的一个实施例的不同进程对共享内存进行访问时实现读写同步的流程图。如图8所示,可以包括以下步骤:
在步骤810中,通过主进程和子进程分别从共享内存对象对应的共享内存中获取在指定位置上记录的信号量,作为目标信号量,其中,指定位置位于预定偏移量对应的共享内存中。
请继续参见图7,共享内存可以为图7示出的整个物理内存。物理内存共分为8块,每块物理内存可以对应着一路数据流。对于图7实施例中由文字标识出的一块共享内存,该块共享内存可以包括预定偏移量对应的部分和数据对应的部分,指定位置可以位于预定偏移量对应的部分。
在步骤820中,在主进程和子进程中根据目标信号量确定是否访问共享内存对象对应的共享内存。
具体地,主进程和子进程的首先根据自己的任务设定好轮询时间。如主进程中的数据流每33ms写一次数据,子进程是每20ms读一次数据。若有一方没有读完或者写完,另一方放弃此次的读写任务。
当主进程开始向这块MemoryFile写入数据的时候,会首先去读取这个偏移量位置的信号量的值。如果信号量的值为0,说明此时MemoryFile里的数据为空,或者子进程已经消费了MemoryFile里的数据,此时MemoryFile处于可写入状态,此时,主进程开始写入。当主进程写入完毕后,就将这个位置的值置为1,表示此时MemoryFile里的数据可消费。当下次主进程帧数据到达,想要再次写入时,如果读取到这个位置依然为1,那么表明子进程还没有读取完毕,将这次写入操作放弃。
子进程同理,每次读取数据时先读取偏移量位置的值,如果该值为1,表明MemoryFile里有数据可消费,此时进行读取。当读取完毕后,将这个偏移量位置的值置为0,表示数据可写入。
在本申请实施例中,高效且准确地实现了进程间对共享内存的读写同步,保证了对共享内存进行数据读写的有序进行。
综上所述,根据本申请实施例提供的应用程序内的交互方法,通过在原生应用程序中嵌入动画引擎之后,分别创建主进程和子进程,其中,主进程是根据原生应用程序创建的,而子进程是根据动画引擎以及原生应用程序中的原生程序对接模块而创建的,在此基础上,一方面,向主进程和子进程分别提供对方进程的接口定义语言对象,使得主进程和子进程可以基于接口定义语言对象进行交互,另一方面,原生程序对接模块可以调用动画引擎提供的接口,而动画引擎可以调用原生程序对接模块中的方法,这样就实现了动画引擎和原生程序对接模块间的交互。因此,整个方案以原生应用程序作为主工程,在原生应用程序中嵌入动画引擎的同时,基于多进程实现了应用程序中原生应用程序部分和动画引擎的完整交互,可以使含有动画引擎的应用程序内部的交互更加稳定。此外,还通过共享内存机制,优化了多进程方案下的内存消耗,避免了进程被杀;同时,通过根据信号量来确定对共享内存的访问操作是否执行,避免了在共享内存中的数据读写错误,确保了不同进程对共享内存的读写可以高效顺利进行。
以下介绍本申请的装置实施例,可以用于执行本申请上述实施例中的应用程序内的交互方法。对于本申请装置实施例中未披露的细节,请参照本申请上述的应用程序内的交互方法的实施例。
图9示出了根据本申请的一个实施例的应用程序内的交互装置的框图。
参照图9所示,根据本申请的一个实施例的应用程序内的交互装置900,包括:嵌入单元910、创建单元920、提供单元930、第一交互单元940和第二交互单元950。其中,嵌入单元910用于在原生应用程序中嵌入动画引擎,所述原生应用程序包括原生程序对接模块;创建单元920用于根据所述原生应用程序创建主进程,并由所述主进程根据所述动画引擎和所述原生程序对接模块创建子进程;提供单元930用于向所述子进程提供所述主进程的第一接口定义语言对象,并向所述主进程提供所述子进程的第二接口定义语言对象;第一交互单元940用于基于所述第一接口定义语言对象和所述第二接口定义语言对象进行所述主进程和所述子进程之间的交互;第二交互单元950用于在所述动画引擎中调用所述原生程序对接模块中的方法,在所述原生程序对接模块中调用所述动画引擎提供的接口,以在所述子进程中进行所述动画引擎和所述原生程序对接模块之间的交互。
在本申请的一些实施例中,基于前述方案,嵌入单元910配置为:对动画引擎的程序包进行解压,得到解压结果;将所述解压结果拷贝至原生应用程序的工程目录中;对所述动画引擎对应的配置文件中的目标属性进行修改,以将所述动画引擎配置为单独进程。
在本申请的一些实施例中,基于前述方案,嵌入单元910还用于:将所述动画引擎中的校验代码删除。
在本申请的一些实施例中,基于前述方案,提供单元930配置为:当所述子进程中的活动组件启动时,通过所述子进程绑定所述主进程中的服务组件,并从所述服务组件中获取所述主进程的第一接口定义语言对象;通过所述子进程调用所述第一接口定义语言对象的方法,以将所述子进程的第二接口定义语言对象传递给所述主进程。
在本申请的一些实施例中,基于前述方案,第一交互单元940还用于:在所述主进程中创建数据发送对象,并为所述数据发送对象创建对应的共享内存对象,所述共享内存对象与共享内存对应;获取所述共享内存对象对应的文件描述符和数据解析协议信息,所述数据解析协议信息包括所述共享内存的块信息和与所述共享内存中存储的数据相关的信息;将所述文件描述符和所述数据解析协议信息发送至所述子进程,由所述子进程根据接收到所述文件描述符和所述数据解析协议信息创建数据接收对象;在所述子进程中根据所述文件描述符和所述数据解析协议信息构造所述共享内存对象;在所述子进程中通过所述数据接收对象从所述共享内存对象对应的共享内存中读取数据。
在本申请的一些实施例中,基于前述方案,第一交互单元940配置为:在所述子进程中创建新线程;通过所述新线程以轮询的方式从所述共享内存对象对应的共享内存中读取数据。
在本申请的一些实施例中,基于前述方案,第一交互单元940配置为:新建共享内存文件;根据所述文件描述符和所述数据解析协议信息构造共享内存子对象;创建buffer映射对象;通过反射机制并基于所述buffer映射对象和所述共享内存子对象对所述共享内存文件进行赋值,得到所述共享内存对象。
在本申请的一些实施例中,基于前述方案,所述共享内存的大小为一帧画面数据大小与预定偏移量的长度之和。
在本申请的一些实施例中,基于前述方案,第一交互单元940还用于:通过所述主进程和所述子进程分别从所述共享内存对象对应的共享内存中获取在指定位置上记录的信号量,作为目标信号量,其中,所述指定位置位于所述预定偏移量对应的共享内存中;在所述主进程和所述子进程中根据所述目标信号量确定是否访问所述共享内存对象对应的共享内存。
图10示出了适于用来实现本申请实施例的电子设备的计算机系统的结构示意图。
需要说明的是,图10示出的电子设备的计算机系统1000仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图10所示,计算机系统1000包括中央处理单元(Central Processing Unit,CPU)1001,其可以根据存储在只读存储器(Read-Only Memory,ROM)1002中的程序或者从存储部分1008加载到随机访问存储器(Random Access Memory,RAM)1003中的程序而执行各种适当的动作和处理,例如执行上述实施例中所述的方法。在RAM 1003中,还存储有系统操作所需的各种程序和数据。CPU 1001、ROM 1002以及RAM 1003通过总线1004彼此相连。输入/输出(Input/Output,I/O)接口1005也连接至总线1004。
以下部件连接至I/O接口1005:包括键盘、鼠标等的输入部分1006;包括诸如阴极射线管(Cathode Ray Tube,CRT)、液晶显示器(Liquid Crystal Display,LCD)等以及扬声器等的输出部分1007;包括硬盘等的存储部分1008;以及包括诸如LAN(Local AreaNetwork,局域网)卡、调制解调器等的网络接口卡的通信部分1009。通信部分1009经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至I/O接口1005。可拆卸介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储部分1008。
特别地,根据本申请的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本申请的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1009从网络上被下载和安装,和/或从可拆卸介质1011被安装。在该计算机程序被中央处理单元(CPU)1001执行时,执行本申请的系统中限定的各种功能。
需要说明的是,本申请实施例所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)、闪存、光纤、便携式紧凑磁盘只读存储器(Compact Disc Read-Only Memory,CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、有线等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。其中,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本申请实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。
作为一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现上述实施例中所述的方法。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本申请实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、触控终端、或者网络设备等)执行根据本申请实施方式的方法。
本领域技术人员在考虑说明书及实践这里公开的实施方式后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
Claims (10)
1.一种应用程序内的交互方法,其特征在于,所述方法包括:
在原生应用程序中嵌入动画引擎,所述原生应用程序包括原生程序对接模块;
根据所述原生应用程序创建主进程,并由所述主进程根据所述动画引擎和所述原生程序对接模块创建子进程;
向所述子进程提供所述主进程的第一接口定义语言对象,并向所述主进程提供所述子进程的第二接口定义语言对象;
基于所述第一接口定义语言对象和所述第二接口定义语言对象进行所述主进程和所述子进程之间的交互;
在所述动画引擎中调用所述原生程序对接模块中的方法,在所述原生程序对接模块中调用所述动画引擎提供的接口,以在所述子进程中进行所述动画引擎和所述原生程序对接模块之间的交互。
2.根据权利要求1所述的应用程序内的交互方法,其特征在于,所述在原生应用程序中嵌入动画引擎,包括:
对动画引擎的程序包进行解压,得到解压结果;
将所述解压结果拷贝至原生应用程序的工程目录中;
对所述动画引擎对应的配置文件中的目标属性进行修改,以将所述动画引擎配置为单独进程。
3.根据权利要求2所述的应用程序内的交互方法,其特征在于,所述方法还包括:
将所述动画引擎中的校验代码删除。
4.根据权利要求1所述的应用程序内的交互方法,其特征在于,所述向所述子进程提供所述主进程的第一接口定义语言对象,并向所述主进程提供所述子进程的第二接口定义语言对象,包括:
当所述子进程中的活动组件启动时,通过所述子进程绑定所述主进程中的服务组件,并从所述服务组件中获取所述主进程的第一接口定义语言对象;
通过所述子进程调用所述第一接口定义语言对象的方法,以将所述子进程的第二接口定义语言对象传递给所述主进程。
5.根据权利要求1所述的应用程序内的交互方法,其特征在于,所述方法还包括:
在所述主进程中创建数据发送对象,并为所述数据发送对象创建对应的共享内存对象,所述共享内存对象与共享内存对应;
获取所述共享内存对象对应的文件描述符和数据解析协议信息,所述数据解析协议信息包括所述共享内存的块信息和与所述共享内存中存储的数据相关的信息;
将所述文件描述符和所述数据解析协议信息发送至所述子进程,由所述子进程根据接收到所述文件描述符和所述数据解析协议信息创建数据接收对象;
在所述子进程中根据所述文件描述符和所述数据解析协议信息构造所述共享内存对象;
在所述子进程中通过所述数据接收对象从所述共享内存对象对应的共享内存中读取数据。
6.根据权利要求5所述的应用程序内的交互方法,其特征在于,所述在所述子进程中通过所述数据接收对象从所述共享内存对象对应的共享内存中读取数据,包括:
在所述子进程中创建新线程;
通过所述新线程以轮询的方式从所述共享内存对象对应的共享内存中读取数据。
7.根据权利要求5所述的应用程序内的交互方法,其特征在于,所述在所述子进程中根据所述文件描述符和所述数据解析协议信息构造所述共享内存对象,包括:
新建共享内存文件;
根据所述文件描述符和所述数据解析协议信息构造共享内存子对象;
创建buffer映射对象;
通过反射机制并基于所述buffer映射对象和所述共享内存子对象对所述共享内存文件进行赋值,得到所述共享内存对象。
8.根据权利要求5所述的应用程序内的交互方法,其特征在于,所述共享内存的大小为一帧画面数据大小与预定偏移量的长度之和。
9.根据权利要求8所述的应用程序内的交互方法,其特征在于,所述方法还包括:
通过所述主进程和所述子进程分别从所述共享内存对象对应的共享内存中获取在指定位置上记录的信号量,作为目标信号量,其中,所述指定位置位于所述预定偏移量对应的共享内存中;
在所述主进程和所述子进程中根据所述目标信号量确定是否访问所述共享内存对象对应的共享内存。
10.一种应用程序内的交互装置,其特征在于,所述装置包括:
嵌入单元,用于在原生应用程序中嵌入动画引擎,所述原生应用程序包括原生程序对接模块;
创建单元,用于根据所述原生应用程序创建主进程,并由所述主进程根据所述动画引擎和所述原生程序对接模块创建子进程;
提供单元,用于向所述子进程提供所述主进程的第一接口定义语言对象,并向所述主进程提供所述子进程的第二接口定义语言对象;
第一交互单元,用于基于所述第一接口定义语言对象和所述第二接口定义语言对象进行所述主进程和所述子进程之间的交互;
第二交互单元,用于在所述动画引擎中调用所述原生程序对接模块中的方法,在所述原生程序对接模块中调用所述动画引擎提供的接口,以在所述子进程中进行所述动画引擎和所述原生程序对接模块之间的交互。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111237319.2A CN116009992A (zh) | 2021-10-22 | 2021-10-22 | 应用程序内的交互方法及相关装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111237319.2A CN116009992A (zh) | 2021-10-22 | 2021-10-22 | 应用程序内的交互方法及相关装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116009992A true CN116009992A (zh) | 2023-04-25 |
Family
ID=86030424
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111237319.2A Pending CN116009992A (zh) | 2021-10-22 | 2021-10-22 | 应用程序内的交互方法及相关装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116009992A (zh) |
-
2021
- 2021-10-22 CN CN202111237319.2A patent/CN116009992A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2019215877A (ja) | ビジュアルコンテンツ開発 | |
US20200183710A1 (en) | Deploying cross-platform applications on mobile devices with native and web components | |
US10185558B2 (en) | Language-independent program composition using containers | |
US9778942B2 (en) | Generating a replacement binary for emulation of an application | |
CN111984269A (zh) | 提供应用构建服务的方法及应用构建平台 | |
US20170192773A1 (en) | Mobile applications | |
CN112189187B (zh) | 统一平台的可扩展性 | |
CN111984270A (zh) | 应用部署方法和系统 | |
CN112199164A (zh) | 一种保证容器镜像一致性的方法 | |
CN108376066B (zh) | 代码处理装置及代码处理方法 | |
US20170083387A1 (en) | High-performance computing framework for cloud computing environments | |
WO2022199136A1 (zh) | 应用改造方法、系统、集群、介质及程序产品 | |
CN112235132B (zh) | 动态配置服务的方法、装置、介质以及服务器 | |
CN106775916B (zh) | 减小应用安装包的方法、装置及电子设备 | |
CN114461411A (zh) | 业务处理系统、方法、设备及介质 | |
CN111367561A (zh) | 软件程序远程开发方法及装置 | |
Pierfederici | Distributed Computing with Python | |
CN116107623A (zh) | 一种软件开发方法、装置及电子设备 | |
CN116009992A (zh) | 应用程序内的交互方法及相关装置 | |
CN114860203A (zh) | 项目创建方法、装置、服务器及存储介质 | |
US10579373B2 (en) | Seamless extension porting | |
CN114028801A (zh) | 基于云端的用户输入方法、装置、设备及存储介质 | |
CN114356520A (zh) | 微应用的运行方法、装置、设备、存储介质及程序产品 | |
CN115373869A (zh) | 基于aar的进程处理方法、装置及电子设备 | |
CN115202673A (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 | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40085620 Country of ref document: HK |