一种更高效的组件自动注册方案(android组件化开发)

一种更高效的组件自动注册方案(android组件化开发)

ID:17926544

大小:30.85 KB

页数:25页

时间:2018-09-10

一种更高效的组件自动注册方案(android组件化开发)_第1页
一种更高效的组件自动注册方案(android组件化开发)_第2页
一种更高效的组件自动注册方案(android组件化开发)_第3页
一种更高效的组件自动注册方案(android组件化开发)_第4页
一种更高效的组件自动注册方案(android组件化开发)_第5页
资源描述:

《一种更高效的组件自动注册方案(android组件化开发)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、在编译时,扫描即将打包到apk中的所有类,将所有组件类收集起来,通过修改字节码的方式生成注册代码到组件管理类中,从而实现编译时自动注册的功能,不用再关心项目中有哪些组件类了。特点:不需要注解,不会增加新的类;性能高,不需要反射,运行时直接调用组件的构造方法;能扫描到所有类,不会出现遗漏;支持分级按需加载功能的实现。前言最近在公司做android组件化开发框架的搭建,采用组件总线的方式进行通信:提供一个基础库,各组件(IComponent接口的实现类)都注册到组件管理类(组件总线:ComponentManager)中,组件之间在同一个app内时,通

2、过ComponentManager转发调用请求来实现通信(不同app之间的通信方式不是本文的主题,暂且略去)。但在实现过程中遇到了一个问题:如何将不同module中的组件类自动注册到ComponentManager中?目前市面上比较常用的解决方案是使用annotationProcessor:通过编译时注解动态生成组件映射表代码的方式来实现。但尝试过后发现有问题,因为编译时注解的特性只在源码编译时生效,无法扫描到aar包里的注解(project依赖、maven依赖均无效),也就是说必须每个module编译时生成自己的代码,然后要想办法将这些分散在各

3、aar种的类找出来进行集中注册。ARouter的解决方案是:·每个module都生成自己的java类,这些类的包名都是'com.alibaba.android.arouter.routes'·然后在运行时通过读取每个dex文件中的这个包下的所有类通过反射来完成映射表的注册,详见ClassUtils.java源码运行时通过读取所有dex文件遍历每个entry查找指定包内的所有类名,然后反射获取类对象。这种效率看起来并不高。ActivityRouter的解决方案是(demo中有2个组件名为'app'和'sdk'):·在主appmodule中有一个@M

4、odules({"app","sdk"})注解用来标记当前app内有多少组件,根据这个注解生成一个RouterInit类·在RouterInit类的init方法中生成调用同一个包内的RouterMapping_app.map·每个module生成的类(RouterMapping_app.java和RouterMapping_sdk.java)都放在com.github.mzule.activityrouter.router包内(在不同的aar中,但包名相同)·在RouterMapping_sdk类的map()方法中根据扫描到的当前module内所

5、有路由注解,生成了调用Routers.map(...)方法来注册路由的代码·在Routers的所有api接口中最终都会触发RouterInit.init()方法,从而实现所有路由的映射表注册这种方式用一个RouterInit类组合了所有module中的路由映射表类,运行时效率比扫描所有dex文件的方式要高,但需要额外在主工程代码中维护一个组件名称列表注解:@Modules({"app","sdk"})有没有一种方式可以更高效地管理这个列表呢?联想到之前用ASM框架自动生成代码的方式做了个AndAop插件用于自动插入指定代码到任意类的任意方法中,于

6、是写了一个自动生成注册组件的gradle插件。大致思路是:在编译时,扫描所有类,将符合条件的类收集起来,并通过修改字节码生成注册代码到指定的管理类中,从而实现编译时自动注册的功能,不用再关心项目中有哪些组件类了。不会增加新的class,不需要反射,运行时直接调用组件的构造方法。性能方面:由于使用效率更高的ASM框架来进行字节码分析和修改,并过滤掉android/support包中的所有类(还支持设置自定义的扫描范围),经公司项目实测,未代码混淆前所有dex文件总计12MB左右,扫描及代码插入的**总耗时在2s-3s之间**,相对于整个apk打包所

7、花3分钟左右的时间来说可以忽略不计(运行环境:MacBookPro15吋高配Mid2015)。开发完成后,考虑到这个功能的通用性,于是升级组件扫描注册插件为通用的自动注册插件AutoRegister,支持配置多种类型的扫描注册,使用方式见github中的README文档。此插件现已用到组件化开发框架:CC中升级后,AutoRegister插件的完整功能描述是:在编译期扫描即将打包到apk中的所有类,并将指定接口的实现类(或指定类的子类)通过字节码操作自动注册到对应的管理类中。尤其适用于命令模式或策略模式下的映射表生成。在组件化开发框架中,可有助于

8、实现分级按需加载的功能:·在组件管理类中生成组件自动注册的代码·在组件框架第一次被调用时加载此注册表·若组件中有很多功能提供给外部调用,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。