Android Application 组件化

如下是我这个系列的相关文章,有兴趣能够参考一下,能够给个喜欢或者关注个人文章。
git

[Android]如何作一个崩溃率少于千分之三噶应用app--章节列表github


这个系列的有关架构的概念,适合有大概三年以上Android经验的同窗理解。若是你大概一年半以上经验,入门进阶了,我近段时间会开展分析MVP的相关架构章节。到时有兴趣的同窗,能够查看一番。数组

在我建立的QQ群中,收到不少热心好学的同窗询问一些问题,而后咱们讨论进一步思考这些问题,也多谢他们给的建议,让我也受益不浅。架构

这节要讨论的Application组件化的相关问题。app

问题来了,每一个module中均可以有Application吗,一个工程中能所有装载这些Application吗?组件化

为了验证这个问题,我就尝试在个人主工程建立一个Application,两个次级的功能module里各自声明一个Application,而后编译,而后你会意外发现出错了。学习


功能编译错误

会提示工程里面存在着多个Application,须要使用“tools:replace="andriod:name”声明去复写AndroidMainifest.xml的文件优化

好吧,改就改吧,修改完功能的Application,而后继续编译。。。ui

发现,继续宿主的Application会出现问题了,仍是以前同样的问题,那只好继续修改了。xml


主module编译error

而后是能够编译成功了,问题来了,那Application最后会成为囧样的呢?

从编译的build的mainfest的文件夹里面AndroidMainfest.xml,看到最终仍是以ModuleApplication做为最终的module的。


那么那么咱们能够猜测到,编译应该是功能module的完成,再继续编译主module生产Application,可是惋惜Android studio的编译并不容许这些Application做为合并,只会将最后的Application放到工程里面编译。

既然编译只能做为替换Application,有些引用的库是须要Application的onCreate里面初始化,或者这个时间触发的。这将会让咱们的工程资源是否能必须引用更多的库,会影响整个工程的体积。

那么咱们能够怎么解决各个module初始化的问题呢???

相信有看过我之间这个系列文章的同窗应该有必定的体会。

这里我提出了接口的思想去解决问题。

(1)我先建立一个ModuleImpl的接口,里面有一个onLoad(Application app)的方法


(2)咱们让须要作某些初始化的Module继承这个ModuleImpl的接口

而后添加覆写方法

(3)咱们在主module的PageConfig里面能够创建一个引用的列表


(4)而后咱们创建一个ModuleApplicaiton到主module,而后使用反射方法的思想来运行。


这样就能够完成直接反射调用了,能够运行每一个的module的onLoad初始化。

Application的onCreate并木有参数,因此个人onLoad里面只传入Application自己进去。

那么这样就已是最好的处理了?

(1)其实这里反射能够再简化运用接口调用


这里对比了一下反射速度,其实并没相差多少。可是直接运行接口方法,确定是要反射调用快的。关于反射方法优化,请自行百度。

(2)这里简单的试了一下,就只是打印一些东西启动的时候反射调用了两个文件打印10个log时间8。

反射的是分两方面的

1.Class.forName建立类

Class.forName是经过类名,找到类再建立,咱们这里每一个module初始化的时候都须要调用一个类建立。

2.invoke调用

这里invoke调用是经过搜索类中方法的列表来调用的,那么对比类中方法也是须要时间的,刚刚初始化的对象是module里方法多了反射将会很是变慢。

这里咱们初始化的时候,由于减小查询的方法表的速度,只封装一个类,加载一个方法来调用,再次编译PageConfig的数组和ModuleApplication里面遍历,再试试调用方法,你会发现调用的时间会变为3。只是小小的优化。


具体的能够查看ModuleBus开源源码github.com/cangwang/Mo…

(想要壁纸,那就下源码吧)


还有更优化的Application初始化方法吗?

1.我的以为只能相似EventBus3.0的编译时注解才能真正提高编译了。

2.也可使用AOP相关思想来作。

不知道是否有同窗想到如何优化,能够留言给更多的建议,谢谢!!!


我创建了一个关于Android架构学习的群,里面能够进一步进行组件化学习和架构思想的的交流。

群号是316556016,也能够扫码进群。我在这里期待大家的加入!!!

相关文章
相关标签/搜索