CN112631600A - 基于Flutter的软件构建方法和系统 - Google Patents

基于Flutter的软件构建方法和系统 Download PDF

Info

Publication number
CN112631600A
CN112631600A CN202011550715.6A CN202011550715A CN112631600A CN 112631600 A CN112631600 A CN 112631600A CN 202011550715 A CN202011550715 A CN 202011550715A CN 112631600 A CN112631600 A CN 112631600A
Authority
CN
China
Prior art keywords
flutter
compiling
target
project
bazel
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
CN202011550715.6A
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.)
Shanghai Bilibili Technology Co Ltd
Original Assignee
Shanghai Bilibili Technology 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 Shanghai Bilibili Technology Co Ltd filed Critical Shanghai Bilibili Technology Co Ltd
Priority to CN202011550715.6A priority Critical patent/CN112631600A/zh
Publication of CN112631600A publication Critical patent/CN112631600A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse

Abstract

本申请实施例公开了一种基于Flutter的软件构建方法,包括:确定主工程,并同步所述主工程依赖的Flutter包;通过Flutter编译工具,编译所述Flutter包以得到目标编译产物;通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件;及链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。在本申请实施例中,通过Flutter编译工具构建一部分产物(如目标编译产物),通过系统构建工具构建另一部分产物(如目标编译文件)实现Flutter构建方式和其他构建方式的混合,使Flutter可以使用多个构建方式构建目标软件,提高代码复用率和减少迁移成本。

Description

基于Flutter的软件构建方法和系统
技术领域
本申请涉及计算机技术领域,尤其涉及一种基于Flutter的软件构建方法、系统、计算机设备和计算机可读存储介质。
背景技术
Flutter,是Google开源的应用软件开发工具包,用于为Android、iOS、Windows、Mac、Linux、Google Fuchsia开发应用。在软件构建过程中,需要一个构建系统,将源代码构建成对应平台上的软件,例如构建成Android平台上的应用。
构建不同平台的软件,通常使用不同的构建系统。构建同一平台的软件,也可能使用不同的构建系统。当前,Flutter在某一个平台上使用的构建系统是固定的,无法与所在平台的其他构建系统进行混合,从而导致软件的复用率低且迁移成本高。
发明内容
本申请实施例的目的是提供一种基于Flutter的软件构建方法、系统、计算机设备和计算机可读存储介质,用于解决基于Flutter构建的软件的复用率低且迁移成本高。
本申请实施例的一个方面提供了一种基于Flutter的软件构建方法,包括:确定主工程,并同步所述主工程依赖的Flutter包;通过Flutter编译工具,编译所述Flutter包以得到目标编译产物;通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件;及链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
可选的,所述系统编译工具为Android编译工具,所述主工程为Flutter runner,Android工程作为所述主工程的外部依赖;通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:通过Android编译工具,编译所述Flutterrunner的Native代码、Flutter插件的Native代码以及所述Android工程的Android宿主应用,以得到所述目标编译文件。
可选的,所述系统编译工具为Android编译工具,所述主工程为Android工程,Flutter包作为所述主工程的外部依赖;通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:通过Android编译工具,编译所述Android工程的Android宿主应用的Native代码以及编译Flutter插件的Native代码,以得到所述目标编译文件。
可选的,所述系统编译工具为Bazel编译工具,所述主工程为Flutter runner,Bazel工程作为所述主工程的外部依赖;所述方法还包括:判断CocoaPods中的Podspec内是否包括Bazel工程的Bazel Target;如果所述Podspec内包括Bazel工程的Bazel Target,则执行Bazel命令行工具,以生成对应的Pod目标产物和相应的其他Podspec;及如果所述Podspec内不包括Bazel工程的Bazel Target,则以递归方式通过Pod获取一个或多个依赖模块,并基于该一个或多个依赖模块构建所述Pod目标产物和所述其他Podspec。
可选的,所述系统编译工具为用于iOS系统的Bazel编译工具,所述主工程为Flutter runner,Bazel工程作为所述主工程的外部依赖;通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:通过所述Bazel编译工具,编译所述Flutter runner的Native代码、Flutter插件的Native代码以及所述Bazel工程的Bazel Target,以得到所述目标编译文件。
可选的,所述系统编译工具为用于iOS系统的Bazel编译工具,所述主工程为Bazel工程,Flutter包作为所述主工程的外部依赖;所述方法还包括:在Bazel工程内配置所述Flutter工程的指定路径,并在该指定路径内配置占位文件;将Flutter插件对应的目录复制到所述Bazel工程的根路径下,并在所述目录下配置相应的BUILD文件;及配置Flutter引擎产物的BUILD文件。
可选的,编译所述Flutter包以得到目标编译产物还包括:将所述目标编译产物替换所述占位文件;通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:通过所述Bazel编译工具,编译所述Bazel工程中的宿主应用的Native代码和Flutter插件的Native代码,以得到所述目标编译文件。
本申请实施例的一个方面又提供了一种基于Flutter的软件构建系统,包括:同步模块,用于确定主工程,并同步所述主工程依赖的Flutter包;第一编译模块,用于通过Flutter编译工具,编译所述Flutter包以得到目标编译产物;第二编译模块,用于通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件;及链接模块,用于链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
本申请实施例的一个方面又提供了一种计算机设备,所述计算机设备包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时用于实现如上所述的基于Flutter的软件构建方法的步骤。
本申请实施例的一个方面又提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序可被至少一个处理器所执行,以使所述至少一个处理器执行如上所述的基于Flutter的软件构建方法的步骤。
本申请实施例提供的基于Flutter的软件构建方法、系统、计算机设备和计算机可读存储介质,通过Flutter编译工具构建一部分产物(如目标编译产物),通过系统构建工具构建另一部分产物(如目标编译文件)实现Flutter构建方式和其他构建方式的混合,使Flutter可以使用多个构建方式构建目标软件,提高代码复用率和减少迁移成本。
附图说明
图1示意性示出了根据本申请的基于Flutter的软件构建方法的环境示意图;
图2示意性示出了根据本申请实施例一的基于Flutter的软件构建方法的流程图;
图3示意性示出了根据本申请实施例二的基于Flutter的软件构建方法的流程图;
图4示意性示出了根据本申请实施例三的基于Flutter的软件构建方法的流程图;
图5示意性示出了在Android平台上的软件构建流程图;
图6示意性示出了根据本申请实施例四的基于Flutter的软件构建方法的流程图;
图7示意性示出了在iOS平台上的软件构建流程图;
图8示意性示出了根据本申请实施例四的基于Flutter的软件构建方法的新增流程图;
图9示意性示出了根据本申请实施例五的基于Flutter的软件构建方法的流程图;
图10示意性示出了根据本申请实施例六的基于Flutter的软件构建系统的框图;及
图11示意性示出了根据本申请实施例七的适于实现基于Flutter的软件构建方法的计算机设备的硬件架构示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,在本申请实施例中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本申请要求的保护范围之内。
在本申请的描述中,需要理解的是,步骤前的数字标号并不标识执行步骤的前后顺序,仅用于方便描述本申请及区别每一步骤,因此不能理解为对本申请的限制。
以下为本申请的术语解释:
构建系统(BUILD system),用于从源代码生成用户可以使用的目标的自动化工具。
跨平台,不依赖于操作系统和硬件环境,一个操作系统下开发的应用,可以运行在另一个操作系统中。
Gradle,基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。
Bazel:Google的一款可再生的代码构建工具。
Cocoapods:针对Swift和Objective-C的Cocoa项目依赖管理工具,用于管理第三方库和私有库的依赖。
Flutter,是一个跨平台UI(用户界面,UserInterface)框架,使用一种语言开发的APP能够同时运行在多种移动端平台上如Android、iOS、Windows、Mac等。
Dart语言,是一种客户端优化的开放源代码编程语言,可以用于Flutter的开发,适用于任何平台上的快速应用。所述Dart语言由Google主导开发,于2011年10月公开。
Native代码,又称本地代码,编译用来运行一个相应的处理器和它的特殊指令集。
Podspec(pod specification,pod库规格说明书),为Pod库的配置文件,用于描述pod库的版本。
Podfile,用来描述xcode项目的依赖的说明书或者规格。
Pod,用于指明一个工程的依赖关系。一个依赖通过一个pod名称和一个可选的版本号规定。
Pod Target(Pod目标产物),为通过Cocoapods管理方式定义的模块,该模块定义中包含模块名称、待编译的源码(或二进制产物,头文件等)及资源文件。其中,Pod Target的描述文件类型为Podspec。
Bazel Target,为使用Bazel规则定义的模块,该模块中定义有模块名称、待编译的源码及资源文件。其中,Bazel Target的描述文件类型为BUILD。
本申请在于Flutter实现双平台同时支持混编的能力,并且不影响FlutterPackage管理模式,从而实现Flutter Package能够在双平台复用,并保持API一致性。
基于两种依赖方式:
1、Flutter Package作为常规工程依赖的输出;
2、常规工程作为Flutter runner工程的依赖输出;
具体的:
1、iOS:提供Flutter和Bazel构建工具的混合协作,使Flutter工程支持嵌入Bazel编译,以使Flutter runner工程能够使用基于Bazel的Bazel Target,达到混编的能力。
同时,基于Bazel工程,可以嵌入Flutter编译过程,使该Bazel工程能够使用基于Flutter的编译产物
2、Android:提供Flutter和Gradle构建工具的混合协作,使Flutter工程支持嵌入Gradle外部依赖,以使Flutter runner工程能够使用基于Gradle的外部组件,达到混编的能力。
同时,基于Gradle的Android工程,可以嵌入Flutter编译过程,使Android工程能够使用基于Flutter的编译产物。
即,本申请在于提供一种基于Flutter的软件构建方案,旨在将Flutter在单一平台上的构建系统打通,实现同时使用多种构建系统构建应用。Flutter Android工程通过Gradle进行依赖管理和Flutter BUILD相结合完成应用构建。Flutter iOS工程通过Cocoapods和Bazel两种依赖管理工具实现Flutter混合编译,通过Xcode完成应用构建,从而在在不同的主从依赖方式环境下,完成统一的构建模式。
图1示意性示出了根据本申请实施例一的基于Flutter的软件构建方法的环境应用示意图。计算机设备2可以被配置为提供软件构建服务。计算机设备2可以包括任何类型的计算设备,诸如PC(个人电脑),平板设备,膝上型计算机、基于服务器的虚拟实例等。计算机设备2可以运行iOS系统、Android系统、Windows系统等。
实施例一
图2示意性示出了根据本申请实施例一的基于Flutter的软件构建方法的流程图。
如图2所示,所述方法可以包括步骤S200~S206,其中:
步骤S200,确定主工程,并同步所述主工程依赖的Flutter包(FlutterPackage)。
在确定所述主工程之后,可以确定所述主工程和其他工程之间的主从依赖关系。
作为示例,所述主工程可以是Flutter工程。作为主工程,其在编译过程中,可能需要一些外部依赖,例如Android工程的宿主应用,或iOS工程的宿主应用。即,将Android工程的宿主应用或iOS工程的宿主应用至少部分地集成到Flutter工程中。
作为示例,所述主工程可以是Android工程。作为主工程,其在编译过程中,可能需要依赖Flutter工程中的一些组件功能。即,将Flutter工程中的一些组件功能集成到Android工程中。
作为示例,所述主工程可以是iOS工程。作为主工程,其在编译过程中,可能需要依赖Flutter工程中的一些组件功能。即,将Flutter工程中的一些组件功能集成到iOS工程中。
步骤S202,通过Flutter编译工具,编译所述Flutter包以得到目标编译产物。
Flutter包的源代码一般基于Dart、Dart2等语言开发,其不同于Android或iOS等Native代码,其需要通过Flutter编译工具进行编译,以得到所述目标编译产物。
Flutter编译工具,可以为gen_snapshot。gen_snapshot是Dart编译器,其基于摇树优化技术生成汇编形式的机器代码,然后通过编译工具链(如,xcrun)生成所述目标编译产物。
在Android系统环境下,所述目标编译产物可以为libapp.so。
在iOS系统环境下,所述目标编译产物可以为App.framework。
步骤S204,通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件。
作为示例,所述主工程为Flutter工程,其外部依赖为Android工程的宿主应用。在该依赖环境之下,所述步骤S204可以包括:编译所述Flutter工程的Native代码、Flutter插件的Native代码以及所述Android工程的Android宿主应用,以得到所述目标编译文件。
步骤S206,链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
通过链接器,将所述目标编译文件与所述目标编译产物建立链接,以及将所述目标编译文件与所述Flutter引擎产物建立链接,从而生成可执行的所述目标软件。
本实施例所述的基于Flutter的软件构建方法,通过Flutter构建系统构建一部分产物(如目标编译产物),通过系统平台中其他的构建系统构建另一部分产物(如目标编译文件)。即,本实施例实现Flutter构建系统和其他构建系统的混合,使Flutter可以使用多个构建系统构建目标软件,从而提高代码复用率和减少迁移成本。
实施例二
本实施例在于提供Android平台的软件构建方法。在本实施例中:
(1)系统编译工具为Android编译工具,例如,Gradle;
(2)用于构建的主工程为Flutter工程,如Flutterrunner(应用);
(3)所述主工程的外部依赖,为Android工程,例如,基于Gradle的Android工程。
图3示意性示出了根据本申请实施例二的基于Flutter的软件构建方法的流程图。如图3所示,所述基于Flutter的软件构建方法可以包括步骤S300~S306,其中:
步骤S300,确定主工程为Flutterrunner,并同步所述主工程依赖的Flutter包。
Flutterrunner为主工程,Android工程为Flutterrunner的外部依赖。
步骤S302,通过Flutter编译工具,编译所述Flutter包以得到目标编译产物。
Flutter包的源代码一般基于Dart、Dart2等语言开发,其不同于Android或iOS等Native代码,其需要通过Flutter编译工具进行编译,以得到所述目标编译产物。
在Android平台环境下,所述目标编译产物为libapp.so。
步骤S304,通过Android编译工具,编译所述Flutter runner的Native代码、Flutter插件的Native代码以及所述Android工程的Android宿主应用,以得到目标编译文件。
步骤S306,链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
通过链接器,将所述目标编译文件与所述目标编译产物libapp.so建立链接,以及将所述目标编译文件与所述Flutter引擎产物libflutter.so建立链接,以得到AndroidAPP产物,即所述目标软件。
本实施例所述的基于Flutter的软件构建方法,让Flutter工程支持嵌入外部依赖,让Flutter Runner工程能够使用基于Android工程的外部组件,来达到混编的能力。即,本实施例实现了Flutter构建系统和其他构建系统的混合,使Flutter可以使用多个构建系统构建目标软件,从而提高代码复用率和减少迁移成本。
实施例三
本实施例在于提供Android平台的软件构建方法。在本实施例中:
(1)系统编译工具为Android编译工具,例如,Gradle;
(2)用于构建的主工程为Android工程,为Android工程,例如,基于Android的Native开发的宿主应用;
(3)所述主工程的外部依赖为Flutter包(FlutterPackage)。
如图4所示,所述基于Flutter的软件构建方法可以包括步骤S400~S406,其中:
步骤S400,确定主工程为Android工程,并同步所述主工程依赖的Flutter包。
Android工程为主工程,Flutter工程为Android工程的外部依赖。即,将Flutter工程中的至少部分组件功能集成到基于Android的Native开发的宿主应用中。
步骤S402,通过Flutter编译工具,编译所述Flutter包以得到目标编译产物。
Flutter包的源代码一般基于Dart、Dart2等语言开发,其不同于Android或iOS等Native代码,其需要通过Flutter编译工具进行编译,以得到所述目标编译产物。
在Android平台环境下,所述目标编译产物为libapp.so。
步骤S404,通过Android编译工具,编译所述Android工程的Android宿主应用的Native代码以及编译Flutter插件的Native代码,以得到目标编译文件。
步骤S406,链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
通过链接器,将所述目标编译文件与所述目标编译产物libapp.so建立链接,以及将所述目标编译文件与所述Flutter引擎产物libflutter.so建立链接,以得到AndroidAPP产物,即所述目标软件。
本实施例所述的基于Flutter的软件构建方法,让Android工程可以嵌入Flutter编译过程,从而使得该Android工程可以使用基于Flutter的目标编译产物。即,本实施例实现了Flutter构建系统和其他构建系统的混合,使得Flutter可以使用多个构建系统构建目标软件,从而有效地提高了代码复用率和减少了迁移成本。
如图5所示,为帮忙理解,以下示例性地提供一个在Android平台上的软件构建流程。
(1)Flutterrunner为主工程:
通过Flutter构建系统,对FlutterPackage进行编译,以构建libapp.so;
通过Android构建系统,对Flutterrunner的Native代码、Flutter插件的Native代码和宿主程序的Native代码等进行编译,并链接libapp.so和Flutter引擎产物libflutter.so,以构建Runner.apk,即目标软件。
(2)Android工程为主工程:
通过Flutter构建系统,对FlutterPackage进行编译,以构建libapp.so;
通过Android构建系统,对Flutter插件的Native代码和宿主程序的Native代码等进行编译,并链接libapp.so和Flutter引擎产物libflutter.so,以构建宿主程序.apk,即目标软件。
实施例四
本实施例在于提供iOS平台的软件构建方法。在本实施例中:
(1)系统编译工具为iOS编译工具,例如,Bazel编译工具;
(2)用于构建的主工程为Flutter工程,如Flutterrunner(应用);
(3)所述主工程的外部依赖,为用于构建iOS应用的Bazel工程。
如图6所示,所述基于Flutter的软件构建方法可以包括步骤S600~S606,其中:
步骤S600,确定主工程为Flutterrunner,并同步所述主工程依赖的Flutter包。
Flutterrunner为所述主工程,Bazel工程作为所述Flutterrunner的外部依赖。在本实施例中,在于将Bazel工程的组件(Bazel Target)至少部分地集成到所述Flutterrunner中。
在本实施例中,可以通过Cocoapods和Bazel两种依赖管理工具实现Flutter混合编译,因此,需要通过CocoaPods同步依赖信息,例如通过Cocoapods同步Flutter工程依赖的Bazel工程的Bazel Target。如图7所示,通过Cocoapods同步Flutter工程依赖的Bazel工程的Bazel Target,通过步骤S700-S704实现:步骤S700,判断CocoaPods中的Podspec内是否包括Bazel工程的Bazel Target;步骤S702,如果Podspec内包括Bazel工程的BazelTarget,则执行Bazel命令行工具,以生成对应的Pod目标产物和相应的其他Podspec;步骤S704,如果Podspec内不包括Bazel工程的Bazel Target,则以递归方式通过Pod获取一个或多个依赖模块,并基于该一个或多个依赖模块构建所述Pod目标产物和所述其他Podspec。本实施例可以使得BazelTarget的编译产物可以转换为CocoaPods依赖(具体可以为:目录索引和相应的Podspec文件生成)。
在本实施例中,通过修改Podfile以支持Bazel依赖能力。可以在修改后的Podfile内采用Bazelquery查询目标依赖信息,并通过Bazel编译工具编译对应多个架构的多个Pod目标产物,且该多个Pod目标产物可以通过lipo(合并命令)合并。
步骤S602,通过Flutter编译工具,编译所述Flutter包以得到目标编译产物。
Flutter包的源代码一般基于Dart、Dart2等语言开发,其不同于Android或iOS等Native代码,其需要通过Flutter编译工具进行编译,以得到所述目标编译产物。
在iOS平台环境下,所述目标编译产物为App.framework。
步骤S604,通过所述Bazel编译工具,编译所述Flutter runner的Native代码、Flutter插件的Native代码以及所述Bazel工程的Bazel Target,以得到目标编译文件。
步骤S606,链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
通过链接器,将所述目标编译文件与所述目标编译产物App.framework建立链接,以及将所述目标编译文件与所述Flutter引擎产物engine.framework建立链接,以得到iOSAPP产物,即所述目标软件。
本实施例所述的基于Flutter的软件构建方法,让Flutter工程支持嵌入Bazel编译,让Flutter Runner能够使用基于Bazel的Bazel Target,从而达到混编的能力。即,本实施例实现Flutter构建系统和其他构建系统的混合,使得Flutter可以使用多个构建系统构建目标软件,从而有效地提高了代码复用率和减少了迁移成本。
实施例五
本实施例在于提供iOS平台的软件构建方法。在本实施例中:
(1)系统编译工具为iOS编译工具,例如,Bazel;
(2)用于构建的主工程用于构建iOS应用的Bazel工程;
(3)所述主工程的外部依赖为Flutter包(Flutter Package)。
本实施例旨在,基于Bazel构建软件的编译流程,嵌入Flutter构建(即,BUILDDart语言的源代码,及将Flutter插件内的Native代码转换成Bazel Target(目录索引和BUILD文件的生成)。
请参考图8,所述基于Flutter的软件构建方法可以包括步骤S800~S808,其中:
步骤S800,确定主工程为Bazel工程,并在Bazel工程内配置Flutter工程的指定路径,并在该指定路径内配置相应的占位文件;
Bazel工程为主工程,Flutter工程为Bazel工程的外部依赖。即,将Flutter工程中的至少部分Bazel Target集成到所述Bazel工程中。
步骤S802,同步Bazel工程依赖的Flutter包,并将Flutter插件对应的目录复制到所述Bazel工程的根路径下,并在所述目录下配置相应的BUILD文件;及配置Flutter引擎产物的BUILD文件。
步骤S804,通过Flutter编译工具,编译所述Flutter包以得到目标编译产物,将所述目标编译产物替换所述占位文件。
Flutter包的源代码一般基于Dart、Dart2等语言开发,其不同于Android或iOS等Native代码,其需要通过Flutter编译工具进行编译,以得到所述目标编译产物。
在iOS平台环境下,所述目标编译产物为App.framework。
步骤S806,通过所述Bazel编译工具,编译所述Bazel工程中的宿主应用的Native代码和Flutter插件的Native代码,以得到目标编译文件。
步骤S808,链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
通过链接器,将所述目标编译文件与所述目标编译产物App.framework建立链接,以及将所述目标编译文件与所述Flutter引擎产物engine.framework建立链接,以得到iOSAPP产物,即所述目标软件。
本实施例所述的基于Flutter的软件构建方法,让Bazel工程可以嵌入Flutter编译过程,从而让该Bazel工程可以使用基于Flutter的目标编译产物。即,本实施例实现Flutter构建系统和其他构建系统的混合,使Flutter可以使用多个构建系统构建目标软件,从而有效地提高了代码复用率和减少了迁移成本。
如图9所示,为帮忙理解,以下示例性地提供一个在iOS平台上的软件构建流程。
(1)Flutterrunner为主工程:
通过Flutter构建系统,对FlutterPackage进行编译,以构建App.framework;
通过Bazel构建系统,对Flutterrunner的Native代码、Flutter插件的Native代码和BazelTarget等进行编译,并链接App.framework和Flutter引擎产物engine.framework,以构建RunnerAPP,即目标软件。
在iOS平台上,将基于Flutter构建目标软件的编译流程,嵌入Bazel工程的BazelTarget,需要通过Cocoapods和Bazel两种依赖管理工具实现Flutter混合编译。为实现该混合编译,可以判断Cocapods中的Podspec是否包括Bazel工程的Bazel Target。如果包括,则执行Bazel命令行工具,生成对应的PodTarget,如编译产物和其他Podspec,并分析Bazeltarget依赖内是否存在本地依赖,如果有,会继续调用Bazel命令行工具,生成对应的PodTarget。如果不包括,会使用Pod获取相应的依赖模块,依次递归分析,获取依赖模块至完毕,然后在回到Pod构建过程。在本示例中,可以通过修改Podfile使得Podspec支持Bazel,并通过pod target所关联的源代码(PodSource、CodeTarget)得到PodTarget。通过在Podfile内使用Bazel query查询目标依赖信息,并通过Bazel编译工具编译FlutterPlugin和BarzelTarget以得到适用不同架构(如Armv7、Arm64、x86等)的不可执行产物(Bazelbinary),并基于该不可执行产物转换为Pod Binary Target(基于产物得到的二进制PodTarget),并将PodBinaryTarget转化为相应的PodTarget。适用于不同架构的不可执行产物可以通过lipo合并。
(2)Bazel工程为主工程:
通过Flutter构建系统,对FlutterPackage进行编译,以构建App.framework;
通过Bazel构建系统中的Xcode,对Flutter插件的Native代码和Bazel工程中的宿主程序的Native代码等进行编译,并链接App.framework和Flutter引擎产物engine.framework,以构建在iOS系统中可执行的BazelBinary文件,即目标软件。
实施例六
图9示意性示出了根据本申请实施例六的基于Flutter的软件构建系统的框图,该基于Flutter的软件构建系统可以被分割成一个或多个程序模块,一个或者多个程序模块被存储于存储介质中,并由一个或多个处理器所执行,以完成本申请实施例。本申请实施例所称的程序模块是指能够完成特定功能的一系列计算机程序指令段,以下描述将具体介绍本实施例中各程序模块的功能。
如图9所示,该基于Flutter的软件构建系统1000可以包括同步模块1010、第一编译模块1020、第二编译模块1030和链接模块1040,其中:
同步模块1010,用于确定主工程,并同步所述主工程依赖的Flutter包;
第一编译模块1020,用于通过Flutter编译工具,编译所述Flutter包以得到目标编译产物;
第二编译模块1030,用于通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件;及
链接模块1040,用于链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
在示例性的实施例中,所述系统编译工具为Android编译工具,所述主工程为Flutter runner,Android工程作为所述主工程的外部依赖;第二编译模块1030,还用于通过Android编译工具,编译所述Flutter runner的Native代码、Flutter插件的Native代码以及所述Android工程的Android宿主应用,以得到所述目标编译文件。
在示例性的实施例中,所述系统编译工具为Android编译工具,所述主工程为Android工程,Flutter包作为所述主工程的外部依赖;第二编译模块1030,还用于通过Android编译工具,编译所述Android工程的Android宿主应用的Native代码以及编译Flutter插件的Native代码,以得到所述目标编译文件。
在示例性的实施例中,所述系统编译工具为Bazel编译工具,所述主工程为Flutter runner,Bazel工程作为所述主工程的外部依赖;所述系统还包括依赖管理模块(未图示),用于:判断CocoaPods中的Podspec内是否包括Bazel工程的Bazel Target;如果所述Podspec内包括Bazel工程的Bazel Target,则执行Bazel命令行工具,以生成对应的Pod目标产物和相应的其他Podspec;及如果所述Podspec内不包括Bazel工程的BazelTarget,则以递归方式通过Pod获取一个或多个依赖模块,并基于该一个或多个依赖模块构建所述Pod目标产物和所述其他Podspec。
在示例性的实施例中,所述系统编译工具为用于iOS系统的Bazel编译工具,所述主工程为Flutter runner,Bazel工程作为所述主工程的外部依赖;第二编译模块1030,还用于通过所述Bazel编译工具,编译所述Flutter runner的Native代码、Flutter插件的Native代码以及所述Bazel工程的Bazel Target,以得到所述目标编译文件。
在示例性的实施例中,所述系统编译工具为用于iOS系统的Bazel编译工具,所述主工程为Bazel工程,Flutter包作为所述主工程的外部依赖;所述系统还包括配置模块(未图示),用于在Bazel工程内配置所述Flutter工程的指定路径,并在该指定路径内配置占位文件;将Flutter插件对应的目录复制到所述Bazel工程的根路径下,并在所述目录下配置相应的BUILD文件;及配置Flutter引擎产物的BUILD文件。
在示例性的实施例中,第一编译模块,用于将所述目标编译产物替换所述占位文件;第二编译模块1030,还用于通过所述Bazel编译工具,编译所述Bazel工程中的宿主应用的Native代码和Flutter插件的Native代码,以得到所述目标编译文件。
实施例七
图11示意性示出了根据本申请实施例七的适于实现基于Flutter的软件构建方法的计算机设备2的硬件架构示意图。本实施例中,计算机设备2是一种能够按照事先设定或者存储的指令,自动进行数值计算和/或信息处理的设备。例如,可以是PC(个人电脑)、笔记本电脑、平板电脑等。如图11所示,计算机设备2至少包括但不限于:可通过系统总线相互通信链接存储器1110、处理器1120、网络接口1130。其中:
存储器1110至少包括一种类型的计算机可读存储介质,可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,存储器1110可以是计算机设备2的内部存储模块,例如该计算机设备2的硬盘或内存。在另一些实施例中,存储器1110也可以是计算机设备2的外部存储设备,例如该计算机设备2上配备的插接式硬盘,智能存储卡(Smart Media Card,简称为SMC),安全数字(Secure Digital,简称为SD)卡,闪存卡(FlashCard)等。当然,存储器1110还可以既包括计算机设备2的内部存储模块也包括其外部存储设备。本实施例中,存储器1110通常用于存储安装于计算机设备2的操作系统和各类应用软件,例如基于Flutter的软件构建方法的程序代码等。此外,存储器1110还可以用于暂时地存储已经输出或者将要输出的各类数据。
处理器1120在一些实施例中可以是中央处理器(Central Processing Unit,简称为CPU)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器1120通常用于控制计算机设备2的总体操作,例如执行与计算机设备2进行数据交互或者通信相关的控制和处理等。本实施例中,处理器1120用于运行存储器1110中存储的程序代码或者处理数据。
网络接口1130可包括无线网络接口或有线网络接口,该网络接口1130通常用于在计算机设备2与其他计算机设备之间建立通信链接。例如,网络接口1130用于通过网络将计算机设备2与外部终端相连,在计算机设备2与外部终端之间的建立数据传输通道和通信链接等。网络可以是企业内部网(Intranet)、互联网(Internet)、全球移动通讯系统(GlobalSystem of Mobile communication,简称为GSM)、宽带码分多址(Wideband Code DivisionMultiple Access,简称为WCDMA)、4G网络、5G网络、蓝牙(Bluetooth)、Wi-Fi等无线或有线网络。
需要指出的是,图11仅示出了具有部件1110-1130的计算机设备,但是应该理解的是,并不要求实施所有示出的部件,可以替代的实施更多或者更少的部件。
在本实施例中,存储于存储器1110中的基于Flutter的软件构建方法还可以被分割为一个或者多个程序模块,并由一个或多个处理器(本实施例为处理器1120)所执行,以完成本申请实施例。
实施例八
本申请还提供一种计算机可读存储介质,计算机可读存储介质其上存储有计算机程序,计算机程序被处理器执行时实现实施例中的基于Flutter的软件构建方法的步骤。
本实施例中,计算机可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,计算机可读存储介质可以是计算机设备的内部存储单元,例如该计算机设备的硬盘或内存。在另一些实施例中,计算机可读存储介质也可以是计算机设备的外部存储设备,例如该计算机设备上配备的插接式硬盘,智能存储卡(Smart Media Card,简称为SMC),安全数字(Secure Digital,简称为SD)卡,闪存卡(Flash Card)等。当然,计算机可读存储介质还可以既包括计算机设备的内部存储单元也包括其外部存储设备。本实施例中,计算机可读存储介质通常用于存储安装于计算机设备的操作系统和各类应用软件,例如实施例中基于Flutter的软件构建方法的程序代码等。此外,计算机可读存储介质还可以用于暂时地存储已经输出或者将要输出的各类数据。
显然,本领域的技术人员应该明白,上述的本申请实施例的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请实施例不限制于任何特定的硬件和软件结合。
需要说明的是,以上仅为本申请的优选实施例,并非因此限制本申请的专利保护范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。

Claims (10)

1.一种基于Flutter的软件构建方法,其特征在于,包括:
确定主工程,并同步所述主工程依赖的Flutter包;
通过Flutter编译工具,编译所述Flutter包以得到目标编译产物;
通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件;及
链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
2.根据权利要求1所述的基于Flutter的软件构建方法,其特征在于,所述系统编译工具为Android编译工具,所述主工程为Flutter runner,Android工程作为所述主工程的外部依赖;
通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:
通过Android编译工具,编译所述Flutter runner的Native代码、Flutter插件的Native代码以及所述Android工程的Android宿主应用,以得到所述目标编译文件。
3.根据权利要求1所述的基于Flutter的软件构建方法,其特征在于,所述系统编译工具为Android编译工具,所述主工程为Android工程,Flutter包作为所述主工程的外部依赖;
通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:
通过Android编译工具,编译所述Android工程的Android宿主应用的Native代码以及编译Flutter插件的Native代码,以得到所述目标编译文件。
4.根据权利要求1所述的基于Flutter的软件构建方法,其特征在于,所述系统编译工具为Bazel编译工具,所述主工程为Flutter runner,Bazel工程作为所述主工程的外部依赖;所述方法还包括:
通过CocoaPods同步依赖信息:
判断CocoaPods中的Podspec内是否包括Bazel工程的Bazel Target;
如果所述Podspec内包括Bazel工程的Bazel Target,则执行Bazel命令行工具,以生成对应的Pod目标产物和相应的其他Podspec;及
如果所述Podspec内不包括Bazel工程的Bazel Target,则以递归方式通过Pod获取一个或多个依赖模块,并基于该一个或多个依赖模块构建所述Pod目标产物和所述其他Podspec。
5.根据权利要求1所述的基于Flutter的软件构建方法,其特征在于,所述系统编译工具为用于iOS系统的Bazel编译工具,所述主工程为Flutter runner,Bazel工程作为所述主工程的外部依赖;
通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:
通过所述Bazel编译工具,编译所述Flutter runner的Native代码、Flutter插件的Native代码以及所述Bazel工程的Bazel Target,以得到所述目标编译文件。
6.根据权利要求1所述的基于Flutter的软件构建方法,其特征在于,所述系统编译工具为用于iOS系统的Bazel编译工具,所述主工程为Bazel工程,Flutter包作为所述主工程的外部依赖;所述方法还包括:
在Bazel工程内配置所述Flutter工程的指定路径,并在该指定路径内配置占位文件;
将Flutter插件对应的目录复制到所述Bazel工程的根路径下,并在所述目录下配置相应的BUILD文件;及
配置Flutter引擎产物的BUILD文件。
7.根据权利要求1所述的基于Flutter的软件构建方法,其特征在于,
编译所述Flutter包以得到目标编译产物还包括:将所述目标编译产物替换所述占位文件;
通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件,包括:通过所述Bazel编译工具,编译所述Bazel工程中的宿主应用的Native代码和Flutter插件的Native代码,以得到所述目标编译文件。
8.一种基于Flutter的软件构建系统,其特征在于,包括:
同步模块,用于确定主工程,并同步所述主工程依赖的Flutter包;
第一编译模块,用于通过Flutter编译工具,编译所述Flutter包以得到目标编译产物;
第二编译模块,用于通过系统编译工具,编译所述主工程和所述主工程的外部依赖以得到目标编译文件;及
链接模块,用于链接所述目标编译文件与所述目标编译产物以及Flutter引擎产物,以构建目标软件。
9.一种计算机设备,所述计算机设备包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时用于实现权利要求1至7中任意一项所述的基于Flutter的软件构建方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质内存储有计算机程序,所述计算机程序可被至少一个处理器所执行,以使所述至少一个处理器执行权利要求1至7中任意一项所述的基于Flutter的软件构建方法的步骤。
CN202011550715.6A 2020-12-24 2020-12-24 基于Flutter的软件构建方法和系统 Pending CN112631600A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011550715.6A CN112631600A (zh) 2020-12-24 2020-12-24 基于Flutter的软件构建方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011550715.6A CN112631600A (zh) 2020-12-24 2020-12-24 基于Flutter的软件构建方法和系统

Publications (1)

Publication Number Publication Date
CN112631600A true CN112631600A (zh) 2021-04-09

Family

ID=75324369

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011550715.6A Pending CN112631600A (zh) 2020-12-24 2020-12-24 基于Flutter的软件构建方法和系统

Country Status (1)

Country Link
CN (1) CN112631600A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113094086A (zh) * 2021-04-13 2021-07-09 北京房江湖科技有限公司 组件集成方法、装置、计算机可读存储介质及电子设备
CN113094085A (zh) * 2021-04-13 2021-07-09 北京房江湖科技有限公司 组件集成方法、装置、计算机可读存储介质及电子设备
CN113918239A (zh) * 2021-10-14 2022-01-11 上海幻电信息科技有限公司 代码实现方法及系统

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20190205107A1 (en) * 2017-12-29 2019-07-04 Semmle Limited Compiler caching based on semantic structure
CN110737589A (zh) * 2019-09-10 2020-01-31 北京字节跳动网络技术有限公司 一种自动埋点的方法、装置、介质和电子设备
CN110750288A (zh) * 2019-10-23 2020-02-04 广州华多网络科技有限公司 原生工程配置方法、装置、电子设备及存储介质
CN111008009A (zh) * 2019-11-05 2020-04-14 贝壳技术有限公司 基于Flutter的业务组件化方法及系统
CN111078278A (zh) * 2019-12-21 2020-04-28 众能联合数字技术有限公司 支持Flutter及iOS混编工程的自动化打包方法
US20200293297A1 (en) * 2019-03-12 2020-09-17 International Business Machines Corporation Generating and deploying object code files compiled on build machines
CN111694564A (zh) * 2020-06-05 2020-09-22 百度在线网络技术(北京)有限公司 Flutter混合模式的编译方法、装置、设备和介质
CN111966396A (zh) * 2019-05-20 2020-11-20 北京京东尚科信息技术有限公司 数据处理方法及装置、计算机系统和计算机可读存储介质
WO2020238277A1 (zh) * 2019-05-24 2020-12-03 中国银联股份有限公司 基于h5接入方式的接入方法及其接入组件和移动终端

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20190205107A1 (en) * 2017-12-29 2019-07-04 Semmle Limited Compiler caching based on semantic structure
US20200293297A1 (en) * 2019-03-12 2020-09-17 International Business Machines Corporation Generating and deploying object code files compiled on build machines
CN111966396A (zh) * 2019-05-20 2020-11-20 北京京东尚科信息技术有限公司 数据处理方法及装置、计算机系统和计算机可读存储介质
WO2020238277A1 (zh) * 2019-05-24 2020-12-03 中国银联股份有限公司 基于h5接入方式的接入方法及其接入组件和移动终端
CN110737589A (zh) * 2019-09-10 2020-01-31 北京字节跳动网络技术有限公司 一种自动埋点的方法、装置、介质和电子设备
CN110750288A (zh) * 2019-10-23 2020-02-04 广州华多网络科技有限公司 原生工程配置方法、装置、电子设备及存储介质
CN111008009A (zh) * 2019-11-05 2020-04-14 贝壳技术有限公司 基于Flutter的业务组件化方法及系统
CN111078278A (zh) * 2019-12-21 2020-04-28 众能联合数字技术有限公司 支持Flutter及iOS混编工程的自动化打包方法
CN111694564A (zh) * 2020-06-05 2020-09-22 百度在线网络技术(北京)有限公司 Flutter混合模式的编译方法、装置、设备和介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
XIANGZHIHONG: "Flutter混合开发", pages 1 - 9, Retrieved from the Internet <URL:https://segmentfault.com/a/1190000021634067> *
韩红雷编: "《游戏开发程序设计基础》", 北京:中国传媒大学出版社, pages: 212 - 215 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113094086A (zh) * 2021-04-13 2021-07-09 北京房江湖科技有限公司 组件集成方法、装置、计算机可读存储介质及电子设备
CN113094085A (zh) * 2021-04-13 2021-07-09 北京房江湖科技有限公司 组件集成方法、装置、计算机可读存储介质及电子设备
CN113094085B (zh) * 2021-04-13 2024-01-19 贝壳找房(北京)科技有限公司 组件集成方法、装置、计算机可读存储介质及电子设备
CN113094086B (zh) * 2021-04-13 2024-01-19 贝壳找房(北京)科技有限公司 组件集成方法、装置、计算机可读存储介质及电子设备
CN113918239A (zh) * 2021-10-14 2022-01-11 上海幻电信息科技有限公司 代码实现方法及系统

Similar Documents

Publication Publication Date Title
CN112631600A (zh) 基于Flutter的软件构建方法和系统
CN109032631B (zh) 应用程序补丁包获取方法、装置、计算机设备及存储介质
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
CN112769706B (zh) 组件化路由方法及系统
CN112711403B (zh) 游戏开发同步的方法、装置、计算机设备和存储介质
CN110659031A (zh) 应用程序的编译方法、装置、电子设备及存储介质
CN111158680A (zh) 一种页面构建的方法、装置、设备及存储介质
CN110737437A (zh) 一种基于代码集成的编译方法和装置
CN115629971A (zh) 一种应用的开发系统和开发方法
CN114217787A (zh) 组件化应用程序的开发方法、装置及存储介质
CN112685040A (zh) 安卓系统中界面文件的生成方法、装置、设备及存储介质
CN110806891B (zh) 嵌入式设备软件版本的生成方法及装置
US9396239B2 (en) Compiling method, storage medium and compiling apparatus
CN110737438A (zh) 一种数据处理方法和装置
CN115658140A (zh) 一种sdk的打包方法、装置、终端以及存储介质
CN106547519B (zh) 信息处理方法及系统
CN114860204A (zh) 程序处理、运行方法、装置、终端、智能卡及存储介质
CN112328241B (zh) 一种应用程序开发中创建Android库模块依赖关系的方法及装置
CN115098158A (zh) Sdk打包方法和装置、计算机设备及存储介质
CN114201174A (zh) 混合移动应用的构建方法、装置、电子设备及存储介质
US10958514B2 (en) Generating application-server provisioning configurations
CN113157329A (zh) 启动应用的方法、系统、服务器和存储介质
CN111880803A (zh) 一种应用于多平台的软件构建方法及装置
CN114579135B (zh) 一种安装包生成方法及装置
CN110737429A (zh) 一种利用Makefile自身的依赖关系的模块化编译方法和装置

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