一种Android生命周期多业务分发方法及系统

文档序号:1888755 发布日期:2021-11-26 浏览:30次 >En<

阅读说明:本技术 一种Android生命周期多业务分发方法及系统 (Android life cycle multi-service distribution method and system ) 是由 樊建东 廖正赟 孙晓鹏 周小欠 武宗品 于 2021-07-15 设计创作,主要内容包括:本发明公开一种Android生命周期多业务分发方法及系统,该系统包括:字节码织入gradle插件模块;Android应用模块,包括应用主模块和业务子模块;该插件模块通过Java字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改;并修改子模块类的对应处理函数;应用主模块启动onCreate方法实例化业务子模块;并执行Application生命周期,根据触发事件发布相关业务处理逻辑;业务子模块通过该插件模块获取生命周期事件,并执行业务处理逻辑。本发明基于Java注解、Gradle插件机制、Java字节码增强实现Android应用Application生命周期在多业务子模块间的分发。(The invention discloses an Android lifecycle multi-service distribution method and system, the system comprises: the byte code is woven into the gradle plug-in module; the Android application module comprises an application main module and a service submodule; the plug-in module completes modification of Application life cycle related processing logic in the Application main module through Java byte code enhancement technology; modifying the corresponding processing function of the sub-module class; an application main module starts an onCreate method to instantiate a business sub-module; executing Application life cycle, and issuing related service processing logic according to the trigger event; the service submodule acquires the life cycle event through the plug-in module and executes the service processing logic. The method and the system realize the distribution of the Android Application lifecycle among the multi-service sub-modules based on the Java annotation, the Gradle plug-in mechanism and the Java bytecode enhancement.)

一种Android生命周期多业务分发方法及系统

技术领域

本发明属于Android应用技术领域,尤其涉及一种Android生命周期多业务分发方法及系统。

背景技术

Android应用基于Application单例对象维护整个应用程序的生命周期。Application对象的生命周期通常由onCreate、onLowMemory等阶段组成(以下简称“Application生命周期”)。在Application生命周期的不同阶段可以进行应用程序的相关配置和功能实现,例如初始化资源、初始化配置、优化资源等。通常Application生命周期在Android应用的主模块中进行维护,对于由主模块和多个业务子模块构成的Android应用,需要在主模块中分发Application生命周期到各业务子模块,业务子模块在对应的生命周期阶段内完成模块自身的相关处理。例如在主模块onLowMemory阶段,可以通知业务子模块优化内存,从而支持低内存场景。

通常实现Android应用主模块与业务子模块之间Application生命周期分发的方法有:基于BaseApplication多级继承方式实现、基于接口的实现、基于事件总线的方式实现。以上的几种实现方式都会出现业务子模块与主模块之间在一定程度上的模块依赖和代码耦合的问题。从Android应用程序开发和维护的角度来看,这些方案违背了程序设计高内聚、低耦合的原则,并且会为程序模块化、组件化、插件化的实施制造难题。

发明内容

本发明针对现有实现Android应用主模块与业务子模块之间Application生命周期分发的方法存在的业务子模块与主模块之间在一定程度上的模块依赖和代码耦合的问题,提出一种Android生命周期多业务分发方法及系统,通过基于Java注解、Gradle插件机制、Java字节码增强技术实现Android应用Application的生命周期在多业务子模块之间的分发。

为了实现上述目的,本发明采用以下技术方案:

本发明一方面提出一种Android生命周期多业务分发系统,包括:字节码织入gradle插件模块,Android应用模块;所述Android应用模块包括应用主模块和业务子模块;

所述字节码织入gradle插件模块用于通过Java字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改;还用于修改业务子模块Application生命周期事件处理类的对应处理函数;

所述应用主模块用于启动onCreate方法,在所述onCreate方法中实例化业务子模块,并完成事件的注册;还用于执行Application生命周期,根据触发事件发布相关业务处理逻辑;

所述业务子模块用于通过字节码织入gradle插件模块获取Application生命周期事件,并执行业务处理逻辑。

进一步地,所述字节码织入gradle插件模块具体用于:

在应用主模块中Application类的头部织入引入生命周期事件定义相关字节码;查找应用主模块中Application类的onCreate函数,在所述onCreate函数内完成业务子模块Application生命周期事件处理类的实例化和注册相关逻辑的字节码织入;在应用主模块中Application类中查找应用生命周期处理函数,在Application生命周期处理函数尾部织入事件分发函数;由所述事件分发函数根据触发事件发布相关业务处理逻辑;

查找存在特定注解的业务子模块Application生命周期事件处理类;在特定注解的业务子模块Application生命周期事件处理类头部织入引用生命周期事件定义类的相关代码;在特定注解的业务子模块Application生命周期事件处理类中通过特定注解符号识别业务子模块生命周期事件处理函数,并获取该函数名称;在业务子模块Application生命周期事件处理类尾部织入Application生命周期事件接收函数;所述特定注解为指定为业务子模块Application生命周期事件处理类的注解指示符号。

进一步地,还包括:插件构建模块;

所述插件构建模块用于通过gradle插件进行工程构建,该构建方式允许开发者自定义gradle插件构建脚本,在该构建脚本中进行字节码织入gradle插件的注册。

进一步地,还包括:插件启动模块;

所述插件启动模块用于解析并启动字节码织入gradle插件模块。

本发明另一方面提出一种Android生命周期多业务分发方法,包括:

步骤1:字节码织入gradle插件模块通过Java字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改;并修改业务子模块Application生命周期处理类的对应处理函数;

步骤2:应用主模块启动onCreate方法,在所述onCreate方法中实例化业务子模块,并完成事件的注册;

步骤3:应用主模块执行Application生命周期,根据触发事件发布相关业务处理逻辑;

步骤4:业务子模块通过字节码织入gradle插件模块获取Application生命周期事件,并执行业务处理逻辑。

进一步地,在所述步骤1之前,还包括:

通过gradle插件进行工程构建,该构建方式允许开发者自定义gradle插件构建脚本,在该构建脚本中进行字节码织入gradle插件的注册。

进一步地,在所述步骤1之前,还包括:

解析并启动字节码织入gradle插件模块。

进一步地,所述字节码织入gradle插件模块通过字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改包括:

在应用主模块中Application类的头部织入引入生命周期事件定义相关字节码;

查找应用主模块中Application类的onCreate函数,在所述onCreate函数内完成业务子模块Application生命周期事件处理类的实例化和注册相关逻辑的字节码织入;

在应用主模块中Application类中查找应用生命周期处理函数,在Application生命周期处理函数尾部织入事件分发函数;由所述事件分发函数根据触发事件发布相关业务处理逻辑。

进一步地,所述修改业务子模块Application生命周期处理类的对应处理函数包括:

查找存在特定注解的业务子模块Application生命周期事件处理类;

在特定注解的业务子模块Application生命周期事件处理类头部织入引用生命周期事件定义类的相关代码;

在特定注解的业务子模块Application生命周期事件处理类中通过特定注解符号识别业务子模块生命周期事件处理函数,并获取该函数名称;

在业务子模块Application生命周期事件处理类尾部织入Application生命周期事件接收函数。

与现有技术相比,本发明具有的有益效果:

本发明可以无感知实现应用主模块类对业务子模块处理类的引用、实例化,无感知实现Application生命周期事件的注册、接收和发布。对比通过继承、事件、接口调用等实现方式,本发明实现了业务子模块与应用主模块之间源代码零耦合,模块无依赖,对于实现程序模块化、组件化和插件化非常友好。

附图说明

图1为本发明实施例一种Android生命周期多业务分发系统的架构示意图;

图2为本发明实施例一种Android生命周期多业务分发系统的Android应用模块结构示意图;

图3为本发明实施例一种Android生命周期多业务分发系统的字节码织入gradle插件模块功能流程图;

图4为本发明实施例一种Android生命周期多业务分发方法的基本流程图。

具体实施方式

为了便于理解,对本发明中出现的部分名词作以下解释说明:

Gradle plugin与Transform

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具,通过gradle plugin重构Transform方法实现对android应用代码编译过程代码修改能力。

Javassist与ASM编码修改

Javassist是源代码修改技术,通过gradle plugin插件,查找需要修改的源码文件,将需要修改的源代码修改到源代码文件中。ASM是byte code代码修改技术,通过在gradle plugin插件,查找class类,并实现对byte code的代码修改。

Android event和Eventbus事件

EventBus是一款在Android开发中使用的发布/订阅事件总线框架。通过注册事件、发送事件和处理事件机制实现android应用生命周期事件分发到业务子模块中。

下面结合附图和具体的实施例对本发明做进一步的解释说明:

如图1所示,本发明的一种Android生命周期多业务分发系统,包括:字节码织入gradle插件模块,Android应用模块;所述Android应用模块包括应用主模块和业务子模块,如图2所示;

所述字节码织入gradle插件模块用于通过Java字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改;还用于修改业务子模块Application生命周期事件处理类的对应处理函数;

所述应用主模块用于启动onCreate方法,在所述onCreate方法中实例化业务子模块,并完成事件的注册;进一步地,业务实例化及事件注册方法可以为但不限定为BusEvent.getDefault().register(new***BusModuleClass),其中***BusModuleClass为业务子模块类;进一步地,onCreate方法可以实例化多个业务子模块,并完成注册。所述应用主模块还用于执行Application生命周期,根据触发事件发布相关业务处理逻辑;进一步地,应用主模块在Application生命周期处理事件,例如onLowMemory事件中,执行字节码织入gradle插件模块修改的代码post(***LowMemoryEvent evt),其中***LowMemoryEvent为字节码织入gradle插件模块引入的事件定义,通过post实现事件的发送。

所述业务子模块用于通过字节码织入gradle插件模块获取Application生命周期事件,并执行业务处理逻辑;进一步地,如应用主模块发送***LowMemoryEvent事件,相应的业务子模块中由相应的修改代码***LowMemory(***LowMemoryEvent evt)来接收***LowMemoryEvent事件消息;进一步地,***LowMemory函数调用通过注解修改***LowMemoryHandle的业务子模块处理函数,实现该生命周期事件的业务子模块的处理。

进一步地,本发明通过字节码织入gradle插件模块,在编译时进行Java字节码的修改实现,如图3所示:

(1)通过字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改,包括:

1.1,在应用主模块中Application类的头部织入引入生命周期事件定义相关字节码;

1.2,查找应用主模块中Application类的onCreate函数,在所述onCreate函数内完成业务子模块Application生命周期事件处理类(简称为子模块处理类)的实例化和注册相关逻辑的字节码织入。进一步地,通过gradle插件机制扫描项目所有.class文件,查找继承自android.app.Application的实现类对应的字节码文件,通过字节码分析,通过函数名匹配即可找到onCreate函数;查找存在特定注解的子模块处理类,特定注解可以是但不限定@VirtualApplication等用于指定其为子模块处理类的注解指示符号,并获取该类名称;

1.3,在应用主模块中Application类中查找应用生命周期处理函数,在Application生命周期处理函数尾部织入事件分发函数;由所述事件分发函数根据触发事件发布相关业务处理逻辑。生命周期处理函数形如onCreate、onLowMemory等Android中Application明确定义的生命周期函数;进一步地,事件分发函数形如Post(***Eventevt),其中***Event为生命周期事件类。

(2)修改业务子模块Application生命周期事件处理类的对应处理函数,包括:

2.1,查找存在特定注解的业务子模块Application生命周期事件处理类;特定注解可以是但不限定@VirtualApplication等用于指定其为子模块处理类的注解指示符号;

2.2,在特定注解的业务子模块Application生命周期事件处理类头部织入引用生命周期事件定义类的相关代码;进一步地,事件定义类为外部织入代码,其中主模块与业务子模块的事件定义类代码一致,通过一致的事件定义类实现事件的发布和订阅;

2.3,在特定注解的业务子模块Application生命周期事件处理类中通过特定注解符号识别业务子模块生命周期事件处理函数,并获取该函数名称;特定注解可以是但不限定于@On***EventHandle等用于指定其为生命周期事件处理函数的注解指示符号;

2.4,在业务子模块Application生命周期事件处理类尾部织入(增加)Application生命周期事件接收函数;进一步地,生命周期事件接收函数为基于生命周期事件类定义的通用处理函数,形如***EventExe(***Event evt),其中***Event为生命周期事件,由应用主模块发布,***EvnetExe为增加的事件接收函数;在应用生命周期事件接收函数尾部织入对生命处理函数的调用逻辑,该生命周期处理函数为在2.3中获取的函数;

进一步地,业务子模块生命周期处理函数可以为多个。多个函数处理则重复上述2.3-2.4。

进一步地,还包括:插件构建模块;

所述插件构建模块用于通过gradle插件进行工程构建,该构建方式允许开发者自定义gradle插件构建脚本,在该构建脚本中进行字节码织入gradle插件的注册。

进一步地,还包括:插件启动模块;

所述插件启动模块用于解析并启动字节码织入gradle插件模块。具体地,通过gradle插件执行Transform代码,在Transform代码中启动字节码织入gradle插件模块。

值得说明的是,字节码织入gradle插件模块采用的是基于ASM的byte code修改代码技术,将全部的class文件合成为一个dex文件的过程中,对指定的文件进行动态的修改,插入andriod应用生命周期的分发方法代码。

在上述实施例的基础上,如图4所示,本发明还提出一种Android生命周期多业务分发方法,该方法基于所述一种Android生命周期多业务分发系统实现,具体基于Java注解、Gradle插件机制、Java字节码增强技术实现,包括:

步骤1:字节码织入gradle插件模块通过Java字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改;并修改业务子模块Application生命周期处理类的对应处理函数;

步骤2:应用主模块启动onCreate方法,在所述onCreate方法中实例化业务子模块,并完成事件的注册;

步骤3:应用主模块执行Application生命周期,根据触发事件发布相关业务处理逻辑;

步骤4:业务子模块通过字节码织入gradle插件模块获取Application生命周期事件,并执行业务处理逻辑。

进一步地,在所述步骤1之前,还包括:

通过gradle插件进行工程构建,该构建方式允许开发者自定义gradle插件构建脚本,在该构建脚本中进行字节码织入gradle插件的注册。

进一步地,在所述步骤1之前,还包括:

解析并启动字节码织入gradle插件模块。

进一步地,所述字节码织入gradle插件模块通过字节码增强技术完成对应用主模块中Application类生命周期相关处理逻辑的修改包括:

在应用主模块中Application类的头部织入引入生命周期事件定义相关字节码;

查找应用主模块中Application类的onCreate函数,在所述onCreate函数内完成业务子模块Application生命周期事件处理类的实例化和注册相关逻辑的字节码织入;

在应用主模块中Application类中查找应用生命周期处理函数,在Application生命周期处理函数尾部织入事件分发函数;由所述事件分发函数根据触发事件发布相关业务处理逻辑。

进一步地,所述修改业务子模块Application生命周期处理类的对应处理函数包括:

查找存在特定注解的业务子模块Application生命周期事件处理类;

在特定注解的业务子模块Application生命周期事件处理类头部织入引用生命周期事件定义类的相关代码;

在特定注解的业务子模块Application生命周期事件处理类中通过特定注解符号识别业务子模块生命周期事件处理函数,并获取该函数名称;

在业务子模块Application生命周期事件处理类尾部织入Application生命周期事件接收函数。

综上,本发明可以无感知实现应用主模块类对业务子模块处理类的引用、实例化,无感知实现Application生命周期事件的注册、接收和发布。对比通过继承、事件、接口调用等实现方式,本发明实现了业务子模块与应用主模块之间源代码零耦合,模块无依赖,对于实现程序模块化、组件化和插件化非常友好。

以上所示仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

12页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种代码打包方法及装置、电子设备、存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!