cocos2d棋牌源码,Android组件化框架微信房卡牛牛棋牌源码设计与实践

    在当今移动互联网微信卡,每个应用程序是交通入口。与以往的PC Web浏览器时代不同,App的体验和迭代速度影响了用户的粘性,这与以前的PC Web浏览器时代一样,对移动开发者也提出了更高的要求。
    
    上面的例子显示了传统服务器架构和客户端应用程序架构的比较。它用于建立各个层次之间的链接,使得体系结构具有足够的灵活性和可伸缩性。业务也是一个非常复杂和多样的业务,最终体系结构在中间是一个非常尴尬的三明治层,因为在服务器体系结构中有许多不需要解决的挑战。例如,以下两点:
    容量约束。对于用户来说,容量是一个非常敏感的概念,如果我们在架构上做了很多事情,它通常意味着架构占用了大量代码。在服务器端架构中,我们可以在架构级别上容忍几十兆字节的代码。但是对于客户端架构体系结构,即使您的体系结构只是一个或两兆字节,它也可能占用客户机10%和20%的容量。性能挑战。从性能的角度来看,我们通常关注服务器端体系结构的吞吐量,而不关注启动速度。即使它花费一分钟。对于启动一两台服务器,我们认为它是一个好的架构,只要它运行起来具有高吞吐量、良好的并发支持和快速的响应。如果退出将被回收,当用户下一次打开时,它将再次启动该进程,需要完成初始化过程。如果您对此做了很多事情,它将导致程序启动非常慢,在许多用户眼中,这是一种不可接受的用户体验。在体系结构中,客户端应用程序与服务器之间存在差异。在选择客户端架构时,我们需要谨慎,并有很多权衡。在此前提下,有没有一种统一的方法来划分和克服它,并行开发,将业务分离为单个组件,围绕组件开发的整个体系结构也是组件,一切都是组件。答案是肯定的,那就是创建一个客户端组件框架。
    起源,为什么基于组件的客户端APP本身在快速的发展,APP版本的不断迭代,新功能、业务模块、业务逻辑的数量不断增加,并且每个模块代码越来越多,这就提出了一个问题,成本维护代码变得越来越高。一个小小的改变对开发和维护来说可能是一个巨大的挑战,而较小的特征点需要返回到整个APP测试。同时,原来的APP架构是单一的工程模式,业务规模扩大,杂乱无章。由于团队规模的扩大,涉及到多人协作,每个移动软件开发人员都必须熟悉这么多的代码,如果不按照一定的模块构件机制进行划分,就很难进行多人协作。ct变得更大,Andorid项目变得非常难于编译代码,与单个工程代码严重耦合,需要在每次代码更改之后重新编译和包装测试,从而导致非常耗时的,而且最重要的是,想要进行单元测试的代码根本不可能首先,必须有一个更灵活的结构来代替以前的单一工程模式。
    同样的问题在我们的具体工程中随处可见。以一个负责我们小组的手机应用程序为例,我们有以下问题:
    代码扩展不利于维护,也不利于新功能的开发。项目建设缓慢,在一些计算机上写两句代码,如果编译速度至少为10-20分钟,甚至更长,则重新编译测试。dif之间的代码耦合各个模块比较严重,如消息模块耦合视频模块比较严重,如果视频模块被修改,相应的消息模块也需要修改,否则会出现一系列问题。y版本不一致,在打包APP时导致代码冗余,容易引起版本冲突。一些自定义项目如果仅需要消息模块就不能按需加载和打包,而另一些则不能,因为模块之间存在相互依赖性。现有项目是dev在其他人的基础上私奔。实际操作人员太多,代码风格不同,项目中的代码规范混乱,功能编写相似,导致不一致,项目体系结构模式的变化是大势所趋。那么我们该怎么办呢也就是说:要构建一个基于组件的开发框架来解决当前的问题,在解释如何构建之前,我们需要讨论组件的概念,什么是基于组件的框架。
    组件化的概念是什么什么是组件,什么是组件化
    答:在软件开发中,组件是数据和方法的简单封装,功能单一,内聚力高,并且是业务可以划分的最小粒度。例如,我们生活中常见的例子是计算机主板,每个组件的电容器设备,每个组件t负责单个功能,易于组装、即插即用,但作用有限,需要使用某些依赖条件。
    
    类似地,组件化是基于组件的可重用性,一个大型软件系统按照关注点分离的形式被分成几个独立的组件,使得整个软件系统也能够像电路板一样进行组装。在哪一个部件被破坏的情况下,整个系统可以连续地不崩溃或异常现象,并实现更少的耦合和更高的内聚力。
    问:组件和模块化很容易混淆。它们之间有什么区别
    答:模块化是根据程序的功能将程序划分为独立的模块,使得每个模块只包含与其功能相关的内容。我们熟悉的模块,比如登录功能可以是模块,搜索功能可以是模块等等。如果从集合的角度来看,模块通常包含一个或多个组件,或者模块是由组件组装的容器。简单地说,组件化比模块化具有更小的粒度。他们两人的基本思想是一致的。为了重用和解耦,它们都把大方向和小方向分开,但是模块化更多地关注业务功能的划分,更多地关注重用,更多地关注单个功能的内聚性,以及更多地关注解耦。
    问:基于组件的好处是什么
    答:简单来说,就是提高工作效率,解放生产力。其优点如下:
    代码简单,冗余度小,易于维护,易于扩展新功能。提高编译速度,提高并行开发效率。避免模块间的交叉依赖,实现低耦合、高内聚。集成第三方库代码,避免uni。形成版本并减少冗余库。定制项目可以按需加载,组件之间可以灵活构建,快速生成不同类型的定制产品。制定相应的组件开发规范可以促进代码风格的标准化将系统级控制细化为组件级的控制级,复杂系统结构成为组件结构,每个组件都有自己的版本,可以独立编译、测试、打包和部署。回到我刚开始使用的APP单一项目模式,并查看通用APP单一项目模式架构图:
    
    上面的图片是目前广泛使用的Android应用程序技术架构。它在一个接口中通常有很多业务逻辑,并且业务逻辑中充满了各种网络请求、数据操作和其他行为。整个项目中没有模块概念,只有一个由业务逻辑和业务划分的简单文件夹。它们彼此直接耦合并且高度耦合。单个工程模型下的业务关系一般为:您有我,我有您,相互依赖,不可分割。如下:
    
    组件化的指导思想是:划分和规则,并行开发,所有组件。要实现基于组件的技术,需要考虑七个方面:
    代码解耦,如何将一个庞大的项目划分成一个有机整体组件是独立运行的。因为每个组件是高度内聚的,并且是完整的整体,所以如何单独运行和调试呢
    组件之间的通信。由于每个组件不了解其实现的细节,但是每个组件需要向其他调用者提供服务,因此主项目如何与组件通信,以及组件如何与组件通信变得非常关键ICICUI跳转指的是特殊的数据传输。与组件通信有什么区别组件生命周期。这里的生命周期是指组件在应用程序中存在的时间。组件是否可按需使用和动态使用将涉及到组件的装卸管理、集成调试、开发阶段如何按需编译组件。一个或两个组件可以集成在一个调试中,这大大减少了编译时间,提高了开发效率。代码隔离。如果组件之间的交互仍然是直接引用,那么组件之间就没有解耦。如何从根本上避免元器件之间的直接引用,也就是说,如何从根本上消除耦合
    组件架构的目标是告别庞大的结构,使每个业务相对独立。业务组件可以在组件模式下独立开发,并且可以在集成模式下集成到APP Shell项目中以形成完整的功能APP。
    首先给出了框架设计图,然后逐一回答了七个问题。
    
    从图中可以看出,业务组件是独立的而不是相互关联的。这些业务组件是集成模式下的库,并且依赖于APP Shell项目来形成具有完整业务功能的APP应用程序。但是,在组件开发模式下,业务组件成为一个接一个的应用程序,可以独立开发和调试,并且由于组件开发模式下的业务组件中的代码量是f,因此可以显著减少运行时的编译时间。AR小于整个项目。
    通过路由路由每个业务组件通信。
    
    这是组件工程模型下的业务关系。企业将不再直接提及和依赖对方,而是间接地通过路由这样的公交站点联系起来。
    针对上述七个问题,具体的解决方案如下:
    1、代码解耦问题。
    现有项目分为两类模块,一类是功能组件模块,封装了一些常用的方法服务,它们作为依赖库提供;这些业务组件模块最终负责组装应用程序。
    2,组件单独运行。
    通过Gradle脚本配置,不同的环境切换。例如,只需切换应用插件:COM。安卓。库应用插件:COM。安卓。应用程序,并将其设置在Android清单清单文件上,因为单个调试需要一个活动条目。例如,您可以设置一个变量ISMAMP来标识是否需要单独调试它,使用不同的分级插件和Android清单清单文件,甚至添加Java f。ILE等应用程序,取决于ISCODE的值,所以可以进行一些初始化。
    3,组件之间的通信。
    组件之间的通信通过接口+实现结构实现,每个组件声明自己的服务API。这些服务是接口。组件负责实现这些服务并将它们注册到统一路由路由器中。如果你想使用组件的功能,你只需要请求路由器的服务实现。其实现的所有细节都无所谓,只要我们能够返回到需要的结果。组件化架构设计图中的公共组件包含路由服务组件,包括每个组件的路由条目和跳转。
    4,UI跳转问题。
    可以说,UI跳转也是一种组件通信,但它是一种特殊的数据传输。但是,通常UI跳转是分开的,通常通过短链跳转到特定的活动。每个组件可以注册自己的短链Scheme和Host,定义t的格式要传输的数据,然后注册到一个统一的UIRouter中,该UIRouter通过.-Host匹配关系分发路由。但是主流的方法是向每个活动添加注释,然后通过APT形成特定的逻辑代码。TER框架并跳过注释。
    5,组件生命周期问题
    架构图中的核心管理组件定义了组件生命周期接口。通过为每个组件设置配置文件,在编译时使用注释自动生成配置文件。配置文件指定实现组件生命周期接口的实现类,以完成一些组件的初始需求初始化操作和自动注册。没有办法手动注册。
    6、集成调试问题
    仅仅因为每个组件都是单独调试的,并不意味着可以集成在一起,所以我们需要将几个组件机器集成到一个APP中,以便在以后的开发中验证。n可任意选择参与集成。这种按需加载机制保证了集成调试的灵活性,并加快了编译速度。变形。
    7,代码隔离。
    如果我们仍然是编译项目(XXX:XXX)。aar)为了引入组件,我们可以直接在其中使用实现类,并且不会消除主项目和组件之间的耦合,并且以前对接口的编程是无意义的。简化,并且在开发阶段,所有组件都是不可见的,因此基本上消除了引用实现类的问题。
    目前,主要的项目只依赖于公共的依赖库。业务组件按需搜索路由服务依赖库,通过反射加载组件,然后在主项目中调用组件服务。东南方。只有包含这两个任务的命令才被引入到实现类中,而其他的则没有。
    代码,具体项目实践,创造工程
    1,APP壳牌工程。
    通过AndroidStudio创建一个应用程序外壳项目。
    
    然后根据应用程序项目中的特定业务组件添加该模块。
    
    2、特定的业务组件模块
    我们需要遵循特定的组件命名规范,所以为什么我们需要一个规范,因为必须通过组件命名规范来约束和确保组件的统一性和一致性以避免冲突。-GA(部门缩写)-login(组件名称),这是我们根据用于以后维护和扩展的公共约定命名的。
    
    二、业务组件配置文件
    1、建档配置文件修改如下:
    IF模块。toBooLoe:())应用插件:COM。安卓。应用{} {应用插件:com。安卓。库}和Orth{CuffelsDKVoice ROOT项目。ExtExcDeCysDkVIEW构建工具VistoRoTo项目。ExtExtudioTooDebug版本{MIDSDKVIEW ROOT项目。Ext.MimSDKVIELTS启动项目。MimSDSDKVRONRONROTROST项目。ExtEngestSDKVIEW IF(ISMODEL)。toBooLeNe()){应用ID COM。徒步。商业。登录版本代码1版本名1 }否则{//AuthJava编译器选项{注释处理器选项{参数=模块名:Project。GETNEX()}{}{}源{主{if(ISMODEL)。BooLy{SrcFrase/Mault/Mease/ANDID.MANDS.XML}另一个{Surviv.Srcfile Src/Mmain /ANDROIDMANDS.XML/集成开发模式不包括调试文件夹中的所有Java文件Java {排除调试}/**}}类型{释放{MIDION启用假PROGARED文件DeFultPROGARED文件(P)安卓。TXT,PROGARE规则。Pro}依赖项{实现项目(:B-GA-CAMONSONCE COMPILB):(!)IsModule。toBoOLIN()){注释处理器COM。阿里巴巴:AROTER编译器:${ROOT项目。注释处理器} } }}}这里有几点:
    1。通过ISMoice在组件集成模式和组件模式之间切换。toBoolean()方法,包括模块属于Application还是Library,由于ARouter的集成,需要处理ARouter配置文件。
    2。如果处于组件模式,则需要重置ANDROIDMANSE。XML文件来配置新的应用程序路径。例如,登录组件分别运行ANDROIDMANIFEN清单文件。
    清单xmlns:Android:Android=http:roid=true.roidHeme.AppCompat...NoActionBargt;lt;activity和roid:name=hik.ga.business.applogin.login.login.views.LoginActivity和roid:label=@stringlogin_btn_str和roid:launch.=singleTop和roid:screenOrientation=portrait和roid:[email protected]意图过滤器;动作;Android:名称= Android。意图。行动。主/gt;lt;类别Android:Name=Android。意图。类别。发射器/gt;lt;/tuff-Fieltgt;lt;/Actuvigt;lt;/t;lt;/Expgt;3。为组件实现全局应用程序配置类,该类旨在初始化组件自己的一些资源,如下所示:
    公共类LoginApplication Delegate实现IApplication委托{私有静态最终字符串TAG=LoginApplication委托;在Create()EFLog.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------(TAG, receivemoteRemsg=Nota+messa) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------D(TAG,*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------D (标签.*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1,定义公共组件路由API和条目,并通过路由服务组件找到它们。
    
    2,组件路由实现。
    每个组件向外部世界提供什么功能,您首先需要为路由服务组件创建接口文件,以下是登录组件接口声明和实现。
    登录界面:
    
    具体实施:
    
    路由:例如,我们希望使用Login接口中的方法,从设置页跳到着陆页,使用以下方法:
    ILGIN提供程序LogInService =(ILGONIN提供程序)AROTER。GET实例()。构建(路由器路径)。RouthyPaulthtoLogLogin服务)。导航();如果(登录服务!{NULL){Login Service。会计(会计)。通过应用组件化的框架Lightr,更好的组装,更快的编译和构造,不仅提高了工作效率,而且移动应用程序开发的自我意识也得到了进一步的提高。NANT框架,特别适用于大中型项目,业务模块多次迭代。对于基于构件框架的演进,主要通过构建构件仓库、改进构件开发规范、丰富构件函数库等方式来实现,并且进一步细化一些大粒度的业务构件,实现更加单一的内聚性。框架,为了进一步提升APP的动态能力,如热加载、热修复,这是另一种使用场景和设计架构,实际上,组件化框架和插件框架最大的区别在于它是否具有动态更新的能力。盟友。
    简化项目,GITHUB地址:DeMeCube,如果你感兴趣,可以过去看看。

猜你喜欢

转载自www.cnblogs.com/h5qipaiyuanma/p/9780379.html