CN113791790A - 一种应用程序更新方法、装置、电子设备及存储介质 - Google Patents

一种应用程序更新方法、装置、电子设备及存储介质 Download PDF

Info

Publication number
CN113791790A
CN113791790A CN202110951051.2A CN202110951051A CN113791790A CN 113791790 A CN113791790 A CN 113791790A CN 202110951051 A CN202110951051 A CN 202110951051A CN 113791790 A CN113791790 A CN 113791790A
Authority
CN
China
Prior art keywords
function
file
bridge
flutter
interface
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
Application number
CN202110951051.2A
Other languages
English (en)
Inventor
单鹏涛
李�昊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuba Co Ltd
Original Assignee
Wuba Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Wuba Co Ltd filed Critical Wuba Co Ltd
Priority to CN202110951051.2A priority Critical patent/CN113791790A/zh
Publication of CN113791790A publication Critical patent/CN113791790A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping
    • G06F9/4406Loading of operating system

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供了一种应用程序更新方法、装置、电子设备及存储介质。该方法包括:从服务端下载用于对Flutter的界面进行逻辑更新的JS文件;确定响应监听到的界面的事件所需执行的JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行JS函数得到JS函数的执行结果并返回Flutter,以响应事件。如此,只需应用程序自动从服务端下载用于对Flutter的界面进行逻辑更新的JS文件,而无需用户重新手动下载和安装新版本的应用程序(具有用于对Flutter的界面进行逻辑更新的JS文件的新版本的应用程序),就可以实现界面的逻辑的更新,也即实现了界面的逻辑的动态化更新,非常方便。

Description

一种应用程序更新方法、装置、电子设备及存储介质
技术领域
本发明涉及计算机技术领域,尤其涉及一种应用程序更新方法、装置、电子设备及存储介质。
背景技术
Flutter作为一个新兴的移动UI框架,可以构建适用于iOS的高质量的用户界面。但是,相关技术中的实现方案,Flutter并不支持应用程序的iOS用户界面对应的逻辑的动态化,当需要更新iOS用户界面对应的逻辑时,用户需要重新手动下载和安装新版本的应用程序,导致使用不便。
发明内容
本发明实施例提供一种应用程序更新方法、装置、电子设备及存储介质,以解决相关技术中的问题。
本发明的目的是通过以下技术方案实现的:
第一方面,本发明实施例提供一种应用程序更新方法,包括:
从服务端下载用于对Flutter的界面进行逻辑更新的JS文件,所述JS文件是通过Flutter的编程语言重新编写的Flutter的界面的代码转换得到的;
确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,以响应所述事件。
在一种可能的实施方式中,所述确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,包括:
在自定义的第一桥接中,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数,并传入自定义的第二桥接;
在所述第二桥接中,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,将所述JS函数的执行结果返回所述第一桥接;
在所述第一桥接中,将所述JS函数的执行结果返回Flutter。
在一种可能的实施方式中,在所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数之前,还包括:
将第一自定义函数注入到所述JS引擎的JS执行上下文中;
所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,包括:
通过所述第一自定义函数,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数。
在一种可能的实施方式中,还包括:
在应用程序启动初始化中,初始化所述第二桥接;
在所述第二桥接的初始化过程中,将第二自定义函数注入到所述JS引擎的JS执行上下文中;
所述将所述JS函数的执行结果发送给所述第一桥接,包括:
通过所述第二自定义函数,将所述JS函数的执行结果返回所述第一桥接。
在一种可能的实施方式中,所述JS文件是通过Flutter的编程语言重新编写的Flutter的界面的代码编译时产生的抽象语法树转换得到的。
第二方面,本发明实施例提供一种应用程序更新装置,包括:
下载模块,用于从服务端下载用于对Flutter的界面进行逻辑更新的JS文件;
执行模块,用于确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,以响应所述事件。
在一种可能的实施方式中,所述执行模块,具体用于:
在自定义的第一桥接中,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数,并传入自定义的第二桥接;
在所述第二桥接中,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,将所述JS函数的执行结果返回所述第一桥接;
在所述第一桥接中,将所述JS函数的执行结果返回Flutter。
在一种可能的实施方式中,所述执行模块,具体用于在所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数之前,将第一自定义函数注入到所述JS引擎的JS执行上下文中;通过所述第一自定义函数,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数。
在一种可能的实施方式中,所述执行模块,具体用于:
在应用程序启动初始化中,初始化所述第二桥接;在所述第二桥接的初始化过程中,将第二自定义函数注入到所述JS引擎的JS执行上下文中;
通过所述第二自定义函数,将所述JS函数的执行结果返回所述第一桥接。
在一种可能的实施方式中,所述JS文件是通过Flutter的编程语言重新编写的Flutter的界面的代码编译时产生的抽象语法树转换得到的。
第三方面,本发明实施例提供一种电子设备,包括:处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面中任一项所述的应用程序更新方法的步骤。
第四方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面中任一项所述的应用程序更新方法的步骤。
上述技术方案中的优点或有益效果至少包括:可以从服务端下载用于对Flutter的界面进行逻辑更新的JS文件,对于监听到的界面的事件,可以确定为响应监听到的事件,需要执行的JS文件中的JS函数,此时,可以在终端的操作系统所携带的JS引擎的辅助下执行需要执行的JS函数,并将执行结果返回Flutter,从而使得Flutter可以响应监听到的事件。由于界面的事件的响应是基于逻辑更新后的JS文件实现的,而非原有的逻辑,实现了界面的逻辑的更新,如此,只需应用程序自动从服务端下载用于对Flutter的界面进行逻辑更新的JS文件,而无需用户重新手动下载和安装新版本的应用程序(具有用于对Flutter的界面进行逻辑更新的JS文件的新版本的应用程序),就可以实现界面的逻辑的更新,也即实现了界面的逻辑的动态化更新,非常方便。
上述概述仅仅是为了说明书的目的,并不意图以任何方式进行限制。除上述描述的示意性的方面、实施方式和特征之外,通过参考附图和以下的详细描述,本发明进一步的方面、实施方式和特征将会是容易明白的。
附图说明
图1是本发明实施例提供的一种示例性的硬件系统架构图。
图2是本发明实施例提供的一种示例性的应用程序更新方法的流程图。
图3是本发明实施例提供的一种示例性的应用程序更新方法的流程图。
图4是本发明实施例提供的一种示例性的应用程序更新方法的流程图。
图5是本发明实施例提供的一种示例性的应用程序更新装置的结构示意图。
图6是本发明实施例提供的一种示例性的电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明实施例提供的一种示例性的硬件系统架构图,如图1所示,该硬件系统架构包括服务端101和终端102。终端102可以从服务端101下载应用程序并进行安装。该应用程序的界面为Flutter的界面。当需要更新界面的逻辑时,开发人员可以基于Flutter的编程语言重新编写界面的代码,然后基于本发明实施例提供的应用程序更新方法,对终端的应用程序的Flutter的界面的逻辑进行更新。下面对本发明实施例提供的应用程序更新方法进行详细地介绍。
图2是本发明实施例提供的一种示例性的应用程序更新方法的流程图。如图2所示,该应用程序更新方法至少包括如下步骤:
步骤201、从服务端下载用于对Flutter的界面进行逻辑更新的JS文件。
实际应用中,当需要更新界面的逻辑时,开发人员可以基于Flutter的编程语言,如Dart语言,重新编写Flutter的界面的代码,该代码中包含用户界面和用户界面对应的逻辑。举例来说,用户界面中包含可点击的按钮,那么,按钮被点击之后,所要实现的功能则需要逻辑代码来实现,在更新之前,能够实现功能a,例如点击后变成红色,在更新之后,则能够实现功能b,例如点击后变成绿色。然后,对重新编写的Flutter的界面的代码进行转换,得到用于对Flutter的界面进行逻辑更新的JS文件。
步骤202、确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,以响应所述事件。
实际应用中,操作系统即终端的原生操作系统,可以为iOS操作系统等。原生操作系统中可以携带JS引擎(JavaScriptCore)。JavaScriptCore是一个开源的框架,是WebKit(跨平台的浏览器引擎)的一部分,提供了JS代码与原生代码交互的能力。
其中,界面的事件可以是用户输入触发的事件,例如按钮点击等事件,也可以是预设的自动触发的事件,例如通知、提醒等事件。响应该事件时,则可以基于JS函数的执行结果,渲染界面。
本实施例中,可以从服务端下载用于对Flutter的界面进行逻辑更新的JS文件,对于监听到的界面的事件,可以确定为响应监听到的事件,需要执行的JS文件中的JS函数,此时,可以在终端的操作系统所携带的JS引擎的辅助下执行需要执行的JS函数,并将执行结果返回Flutter,从而使得Flutter可以响应监听到的事件。由于界面的事件的响应是基于逻辑更新后的JS文件实现的,而非原有的逻辑,实现了界面的逻辑的更新,如此,只需应用程序自动从服务端下载用于对Flutter的界面进行逻辑更新的JS文件,而无需用户重新手动下载和安装新版本的应用程序(具有用于对Flutter的界面进行逻辑更新的JS文件的新版本的应用程序),就可以实现界面的逻辑的更新,也即实现了界面的逻辑的动态化更新,非常方便。
在示例性实施例中,所述JS文件可以通过Flutter的编程语言重新编写的Flutter的界面的代码编译时产生的抽象语法树转换得到的。本实施例中,由于JS文件是通过Flutter的编程语言重新编写的Flutter的界面的代码转换得到的,也就是说,界面更新前后的代码都采用Flutter这一种语言编写,实现更加简单。
示例性的,可以基于Fair对重新编写的Flutter的界面的代码进行转换。Fair是一个为Flutter设计的动态化的开源框架。
实际应用中,在Fair中,可以拦截Dart语言的Flutter的界面的代码编译时产生的抽象语法树,然后基于拦截到的抽象语法树,生成领域特定语言(DSL,Domain SpecificLanguage)文件和对应的JS文件。其中,DSL文件为用于描述界面的布局的文件。JS文件为用于描述界面的逻辑的文件。编译时,可以采用运行前(AOT,Ahead Of Time)编译的方式。示例性的,在Fair中,通过Dart的build_runner和Analyzer组件库实现AOT编译期间的拦截,以得到抽象语法树。这里,Dart的build_runner和Analyzer是Flutter的两个组件库。执行编译是Flutter执行的,Fair借用2个组件库的能力在编译期间插入了一些描述和注解(目的是为了后面解析使用),在编译完成后得到了编译产物,即DSL文件和对应的JS文件。
其中,build_runner提供了一些用于生成文件的通用命令,这些命令中有的可以用于测试生成的文件,有的可以用于对外提供这些生成的文件以及它们的源代码,能够扫描出每个dart文件中类成员变量、构造函数、所有父类、注释等。Analyzer用于代码分析,可以直接对整个项目进行扫描,针对每个dart文件扫描出的语法树进行分析。
实施中,在终端侧,在Fair中,基于DSL文件,可以通过Dart的runtime实现界面布局的动态化。runtime即运行时刻,是指一个程序在运行的状态。具体的,在Fair中,通过将DSL文件解析成Dart可识别的语法,然后通过Dart的runtime能够将该可识别的语法执行生成Flutter的界面,这样实现了用户界面的动态化了。
在示例性实施例中,所述确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,如图3所示,其具体实现方式可以包括:
步骤301、在自定义的第一桥接中,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数,并传入自定义的第二桥接。
Flutter本身具有多种通信通道,例如FlutterMethodChannel、FlutterBasicMessageChannel等用于与原生操作系统通信的通道。这里,可以将Flutter用于与原生操作系统通信的通道作为Flutter与第一桥接进行通信的通道。本步骤中,可以通过Flutter提供的用于与原生操作系统通信的通道,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数,并传入自定义的第二桥接。也即,Flutter可以通过与原生操作系统通信的通道,将所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数传入到第一桥接,基于此,在第一桥接中,可以确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数。
步骤302、在所述第二桥接中,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文(JSContext)中的所述JS文件中的所述JS函数,将所述JS函数的执行结果返回所述第一桥接。
步骤303、在所述第一桥接中,将所述JS函数的执行结果返回Flutter。
同样的,可以通过Flutter提供的用于与操作系统Native通信的通道,将所述JS函数的执行结果返回Flutter。
本实施例中,提供了自定义的第一桥接和第二桥接两个桥接,来实现Flutter和JS引擎之间的交互,从而实现对Flutter的界面的事件进行监听,并对监听到的事件所需执行的已注入到JS引擎中的JS文件的JS函数进行调用并返回执行结果,如此,对于应用程序的开发人员来说,无需再考虑Flutter和JS引擎之间的交互,在开发Flutter的界面时,没有额外的适配工作,只需要正常的进行Flutter的开发即可,使得界面的逻辑的动态化实现更加简单。
在示例性实施例中,在从服务端下载用于对Flutter的界面进行逻辑更新的JS文件之后,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数之前,上述应用程序更新方法还可以包括:将所述JS文件注入到所述JS引擎的JS执行上下文中,以便执行JS文件中的JS函数。具体的,可以在Flutter中,将下载的JS文件通过与原生操作系统通信的通道,发送给第一桥接,在第一桥接中,将JS文件传入第二桥接,在第二桥接中,将所述JS文件注入到所述JS引擎的JS执行上下文中。
在示例性实施例中,在所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数之前,还包括:将第一自定义函数注入到所述JS引擎的JS执行上下文中;所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,具体实现方式可以包括:通过所述第一自定义函数,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数。
本实施例中,提供了用于基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数的第一自定义函数。实施中,可以将第一自定义函数携带在应用程序的安装包中。该第一自定义函数也是一种JS函数。因此,可以在调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数之前,及时将第一自定义函数注入到了JS引擎的JS执行上下文中,以便后续调用。
实施中,应用程序的安装包中可以携带自定义JS文件,该自定义JS文件中包含用于实现自定义功能的多个自定义函数,例如第一自定义函数。可以在Flutter中,将自定义JS文件通过与原生操作系统通信的通道,发送给第一桥接,在第一桥接中,将自定义JS文件传入第二桥接,在第二桥接中,将自定义JS文件注入到所述JS引擎的JS执行上下文中。如此,可以通过执行自定义JS文件中的自定义函数,来实现相应的功能。
在示例性实施例中,上述应用程序更新方法还可以包括:在应用程序启动初始化中,初始化所述第二桥接;在所述第二桥接的初始化过程中,将第二自定义函数注入到所述JS引擎的JS执行上下文中;所述将所述JS函数的执行结果发送给所述第一桥接,其具体实现方式可以包括:通过所述第二自定义函数,将所述JS函数的执行结果返回所述第一桥接。
本实施例中,在应用程序启动初始化的过程中,对第二桥接进行初始化,更加及时。并且,提供了用于将所述JS函数的执行结果返回所述第一桥接的第二自定义函数。实施中,可以将第二自定义函数携带在应用程序的安装包中。该第二自定义函数也是一种JS函数。因此,可以在第二桥接的初始化的过程中,及时将第二自定义函数注入到了JS引擎的JS执行上下文中,以便后续返回JS文件中的JS函数的执行结果时调用。
在示例性实施例中,上述应用程序更新方法还可以包括:在检测到退出界面时,清理JS引擎中注入的该界面对应的JS文件。具体的,可以在Flutter中,将退出界面的名称传入第一桥接,在第一桥接中,将退出界面的名称传入第二桥接,在第二桥接中,将退出界面的名称对应的JS文件置为空。实施中,可以通过自定义JS文件中的第三自定义函数,将退出界面的名称对应的JS文件置为空。如此,可以及时进行内存回收,减少对内存的占用。
在示例性实施例中,上述应用程序更新方法还可以包括:JS执行上下文中注入的函数所在的线程不同于Flutter的线程。也即,JS执行上下文中注入的函数所在的线程(简称JS线程)与Flutter的线程分开,避免对Flutter的线程造成影响导致界面卡顿。
需要说明的是,本发明实施例的应用程序更新方法可以通过组件库的形式携带在应用程序的安装包中。在应用程序安装之后,每次启动应用程序时,可以初始化组件库并启动应用程序更新流程。
示例性的,上述组件库可以包括三个部分:第一桥接(Flutterbridge)、流程管理器(FairProcessManager)和第二桥接(JSbridge)。其中,FairProcessManager可以作为入口,并管理整个应用程序更新流程。
下面通过具体应用场景进行更加详细地说明。
iOS操作系统中,基于Flutter的应用程序启动时,可以调用启动入口didfinishLaunch,在didfinishLaunch中注册Flutter引擎,并通过GeneratedPluginRegistrant(静态注册)初始化用于实现本发明实施例提供的应用程序更新方法的组件库(FairPlugin),该组件库是基于Fair实现的。如图4所示,初始化时,首先初始化流程管理器,开启整个流程。然后,流程管理器初始化第一桥接和第二桥接。第二桥接初始化的过程中,可以初始化JScontext,注入setData(即第二自定义函数),以及初始化JS线程。
另外,应用程序的安装包中携带有自定义JS文件(baseJS),该自定义JS文件中包含多个自定义函数,例如第一自定义函数。
当需要更新界面的逻辑时,首先可以采用Flutter的编程语言Dart重新编写界面的代码,然后基于Fair,通过Dart的build_runner+Analyzer组件库实现该代码AOT编译期间的拦截,将拦截产物生成DSL文件和对应的JS文件。服务端将DSL文件和JS文件通过下发到iOS终端的应用程序中。
在iOS终端,基于DSL文件和JS文件实现Flutter的界面和对应逻辑的动态化。通过将DSL文件解析成Dart可识别的语法,然后通过Dart的runtime能够将该可识别的语法执行生成Flutter的界面,这样实现了用户界面的动态化了。而用户界面对应的逻辑动态化的实现如下:
在第一桥接中,将Flutter通过FlutterMethodChannel传递来的baseJS传入流程管理器,以及将Flutter通过FlutterMethodChannel传递来的JS文件传入流程管理器。
在流程管理器中,基于预设的第一桥接协议,将baseJS和JS文件传入第二桥接。
在第二桥接中,将baseJS和JS文件注入到JSContext中。
在第一桥接中,获取Flutter通过FlutterBasicMessageChannel传递来的响应监听到的界面的事件所需执行的JS文件中的JS函数的名称和调用JS函数所需的参数,将JS函数的名称和参数传入流程管理器。
在流程管理器中,基于预设的第一桥接协议,将JS函数的名称和参数传入第二桥接接口,以调用第二桥接接口。
在第二桥接中,通过第一自定义函数,基于传入的JS函数的名称和参数,调用JSContext中注入的JS函数,并将JS函数的执行结果传入第二自定义函数,以调用第二自定义函数,第二自定义函数将JS函数的执行结果返回流程管理器。
在流程管理器中,基于预设的第二桥接协议,调用第一桥接接口,以将JS函数的执行结果通过FlutterBasicMessageChannel或者FFI(外部函数接口,Foreign FunctionInterfac)返回Flutter。其中,FlutterBasicMessageChannel是以异步方式返回Flutter。FFI是以同步方式返回Flutter。
本方案通过Fair的组件库支持了Flutter的界面逻辑动态化在iOS终端的实现,并且使iOS开发人员接入时无需考虑交互方案和逻辑,接入Fair的iOS开发人员,在通过Flutter开发页面时,没有额外的适配工作,因为已通过Fair组件库实现好了,只需要正常的Flutter开发即可,使用方便。
图5是本发明实施例提供的一种示例性的应用程序更新装置的结构示意图。
如图5所示,本发明实施例提供的一种应用程序更新装置500,包括:
下载模块501,用于从服务端下载用于对Flutter的界面进行逻辑更新的JS文件;
执行模块502,用于确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,以响应所述事件。
在一种可能的实施方式中,所述执行模块,具体用于:
在自定义的第一桥接中,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数,并传入自定义的第二桥接;
在所述第二桥接中,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,将所述JS函数的执行结果返回所述第一桥接;
在所述第一桥接中,将所述JS函数的执行结果返回Flutter。
在一种可能的实施方式中,所述执行模块,具体用于在所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数之前,将第一自定义函数注入到所述JS引擎的JS执行上下文中;通过所述第一自定义函数,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数。
在一种可能的实施方式中,所述执行模块,具体用于:
在应用程序启动初始化中,初始化所述第二桥接;在所述第二桥接的初始化过程中,将第二自定义函数注入到所述JS引擎的JS执行上下文中;
通过所述第二自定义函数,将所述JS函数的执行结果返回所述第一桥接。
在一种可能的实施方式中,所述JS文件是通过Flutter的编程语言重新编写的Flutter的界面的代码编译时产生的抽象语法树转换得到的。
本发明实施例各装置中的各模块的功能可以参见上述应用程序更新方法实施例中的对应描述,在此不再赘述。
优选的,本发明实施例还提供了一种电子设备,包括:处理器,存储器,存储在存储器上并可在处理器上运行的计算机程序,该计算机程序被处理器执行时实现上述应用程序更新方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
图6是本申请实施例提供的一种示例性的电子设备的结构示意图。如图6所示,该电子设备可以包括:处理器601、通信接口602、存储器603和通信总线604,其中,处理器601,通信接口602,存储器603通过通信总线604完成相互间的通信。处理器601可以调用存储器603中的计算机程序,以执行以上任一实施例中的应用程序更新方法。
本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述应用程序更新方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,均属于本发明的保护之内。
本领域普通技术人员可以意识到,结合本发明实施例中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

Claims (12)

1.一种应用程序更新方法,其特征在于,包括:
从服务端下载用于对Flutter的界面进行逻辑更新的JS文件;
确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,以响应所述事件。
2.根据权利要求1所述的方法,其特征在于,所述确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,包括:
在自定义的第一桥接中,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数,并传入自定义的第二桥接;
在所述第二桥接中,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,将所述JS函数的执行结果返回所述第一桥接;
在所述第一桥接中,将所述JS函数的执行结果返回Flutter。
3.根据权利要求2所述的方法,其特征在于,在所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数之前,还包括:
将第一自定义函数注入到所述JS引擎的JS执行上下文中;
所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,包括:
通过所述第一自定义函数,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数。
4.根据权利要求2所述的方法,其特征在于,还包括:
在应用程序启动初始化中,初始化所述第二桥接;
在所述第二桥接的初始化过程中,将第二自定义函数注入到所述JS引擎的JS执行上下文中;
所述将所述JS函数的执行结果发送给所述第一桥接,包括:
通过所述第二自定义函数,将所述JS函数的执行结果返回所述第一桥接。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述JS文件是通过Flutter的编程语言重新编写的Flutter的界面的代码编译时产生的抽象语法树转换得到的。
6.一种应用程序更新装置,其特征在于,包括:
下载模块,用于从服务端下载用于对Flutter的界面进行逻辑更新的JS文件;
执行模块,用于确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数,以及在操作系统携带的JS引擎的辅助下执行所述JS函数得到所述JS函数的执行结果并返回Flutter,以响应所述事件。
7.根据权利要求6所述的装置,其特征在于,所述执行模块,具体用于:
在自定义的第一桥接中,确定响应监听到的所述界面的事件所需执行的所述JS文件中的JS函数的名称和调用所述JS函数所需的参数,并传入自定义的第二桥接;
在所述第二桥接中,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数,将所述JS函数的执行结果返回所述第一桥接;
在所述第一桥接中,将所述JS函数的执行结果返回Flutter。
8.根据权利要求7所述的装置,其特征在于,所述执行模块,具体用于在所述基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数之前,将第一自定义函数注入到所述JS引擎的JS执行上下文中;通过所述第一自定义函数,基于传入的所述JS函数的名称和调用所述JS函数的参数,调用已注入到所述JS引擎的执行上下文中的所述JS文件中的所述JS函数。
9.根据权利要求7所述的装置,其特征在于,所述执行模块,具体用于:
在应用程序启动初始化中,初始化所述第二桥接;在所述第二桥接的初始化过程中,将第二自定义函数注入到所述JS引擎的JS执行上下文中;
通过所述第二自定义函数,将所述JS函数的执行结果返回所述第一桥接。
10.根据权利要求6至9任一项所述的装置,其特征在于,所述JS文件是通过Flutter的编程语言重新编写的Flutter的界面的代码编译时产生的抽象语法树转换得到的。
11.一种电子设备,其特征在于,包括:处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至5中任一项所述的应用程序更新方法的步骤。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至5中任一项所述的应用程序更新方法的步骤。
CN202110951051.2A 2021-08-18 2021-08-18 一种应用程序更新方法、装置、电子设备及存储介质 Pending CN113791790A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110951051.2A CN113791790A (zh) 2021-08-18 2021-08-18 一种应用程序更新方法、装置、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110951051.2A CN113791790A (zh) 2021-08-18 2021-08-18 一种应用程序更新方法、装置、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN113791790A true CN113791790A (zh) 2021-12-14

Family

ID=78876098

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110951051.2A Pending CN113791790A (zh) 2021-08-18 2021-08-18 一种应用程序更新方法、装置、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN113791790A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115113962A (zh) * 2022-06-17 2022-09-27 北京城市网邻信息技术有限公司 界面跳转方法、装置、电子设备及可读存储介质
WO2024061036A1 (zh) * 2022-09-19 2024-03-28 华为技术有限公司 一种引擎间的通信方法及相关设备

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115113962A (zh) * 2022-06-17 2022-09-27 北京城市网邻信息技术有限公司 界面跳转方法、装置、电子设备及可读存储介质
WO2024061036A1 (zh) * 2022-09-19 2024-03-28 华为技术有限公司 一种引擎间的通信方法及相关设备

Similar Documents

Publication Publication Date Title
CN113791790A (zh) 一种应用程序更新方法、装置、电子设备及存储介质
CN112685035B (zh) 项目开发方法及装置、计算机可读存储介质、电子设备
CN109558304B (zh) 一种组件关联分析方法、装置及电子设备
CN112114890A (zh) 小程序的处理方法、装置、设备及存储介质
CN111475390A (zh) 日志采集系统部署方法、装置、设备及存储介质
EP3447635A1 (en) Application architecture generation
CN107508846B (zh) 应用客户端的更新方法和系统及终端设备
CN104536398B (zh) 一种变频器监控方法和系统
CN113407255A (zh) 组件调用方法、装置及计算机可读存储介质
US20020174161A1 (en) Java startup wrapper
CN108153533B (zh) 制作安装程序的方法和装置、程序的安装方法和装置
CN112667287A (zh) 规则文件的创建方法、装置、设备及计算机可读存储介质
US20190212990A1 (en) Framework for generating adapters in an integrated development environment
CN114217789A (zh) 功能组件拓展方法、装置、设备、存储介质及程序产品
CN108287720B (zh) 软件编译方法、装置、设备及存储介质
CN107918587A (zh) 一种应用程序的调试方法及系统
US11023220B2 (en) Firmware update with integrated smart sequence and action engine
CN113127329A (zh) 脚本调试方法、装置及计算机存储介质
CN111338708A (zh) 基于安卓插件的应用程序处理方法、客户端及系统
JP2006276939A (ja) 仮想マシンのプログラム起動方法およびクライアントサーバシステム
CN114217879B (zh) 一种用于程序启动运行突破安卓幽灵进程限制的方法
CN113032004B (zh) 在开发环境中管理开发作业的方法、设备和程序产品
CN107977304B (zh) 一种系统调试方法和装置
US10949183B2 (en) System and method for transforming co-routines to equivalent sub-routines
CN113031964A (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