[Android组件化]组件化与插件化优化

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

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


记得我以前有介绍了一种很是适合于组件化后作插件化的框架,就是Small。服务器

我在第九章节的时候就有介绍了Small的使用,还有深刻分析Small的运行原理架构

近来使用Small研发插件中,遇到一些问题,就在这里和你们讨论一下。app

这里说一下Small的的一些缺陷,框架

(1)其不支持动态Service,Service都只能放在宿主里面了。组件化

(2)Small暂时是只能经过冷更新(就是彻底重启App时才能加载,若是有更新,当你按home键或者返回键退出,其会将整个Process杀死重启),源码中木有在运行途中增学习


这一篇的简书,理解难度将会加大,由于公司代码就不宜张贴啦,若是同窗没有项目木有实现过插件化的,理解起来会有必定的瓶颈。gradle

1.关于插件化选型

能够参考如下文章lua

基础看

Android客户端插件化热修复各类方案对比和最全总结

深刻看这个

Android插件化从入门到放弃-最强合集

估计看完这些你就快能够疯掉了。^_^

选型基本须要考虑的问题

1.对四大组件的支持(hook点支持)

2.so库支持

3.打包时资源冲突

4.更新方式和时机


2.插件间通讯

每一个插件都是基于base的module去开发,那么经过这个base module那么咱们就能够经过ModuleBus或者路由的机制完成传输了。

Small自己定义的OpenUri来启动对应的模块,并未有提供能够传递各类参数的方法。

而咱们是经过自定义一个PluginManager封装,相似以前介绍的分发机制去封装一个方法标志字符串标志,而后传输intent,context,viewgroup等对象,经过PluginManager遍历过滤再传输到对应的插件模块,其余须要传输的信息均可以封装到intent里面。


3.资源冗余问题

你想像一下,若是你每一个工程会依赖baseApi,那么编译生成的base 的module,当生成xxx.so文件的时候,不就会出现一份冗余的base module代码和资源吗?

这个问题其实Small有自定义的编译代码,其本身写了一套编译的groovy代码,因此在编译的时候重复依赖的module移除了。

Small的编译代码,若是没点gradle构建工程基础和groovy编译想法的确不容易找到

我这里简单指明一下吧

以前说了使用DevSample查看Small的源码,这里编译的最终配使用的是AppPlugin


而后能够看到解决依赖的方法经过,过滤掉D.txt里面的所要依赖的


经过app-D.txt compile.exclude掉这些依赖的库


经过afterEvaluate最终加载这个过滤方法。


AppPlugin这里也会有将每一个module里面生成的R.txt重复的资源id过滤掉,还有保留public.txt的id

这里publicEntries是保存的public.txt里面的内容,而bundle.Entries保存的是R.txt的内容的


bundleEntries是过滤掉重复的R id的算法。


若是不熟悉Gradle构建流程,也不打算深刻了解的,就不须要深究了。

这里只要知道,每一个module都编译的时候都共有一份D.txt R.txt和public.txt,而后small的构建会过滤掉相同的资源。而后编译出来的so文件插件运行的时候,仍是经过同样的资源id来索引到公用的base module的内容。

那么为了加强每一个功能模块的独立性,每一个功能module都独立成为一个工程(Small的这个工程模块只是独立成一个module),那么要怎么处理才能使工程都去除资源重复呢?

这里其实也很简单,咱们保证咱们都依赖的自定义扩展的Small库,base的module是被宿主module引用的,那么须要保证其生产的D.txt和R.txt和public.txt,其余的module都须要持有(手动或者配置下载到其余的module里面),而后编译的时候修改加入遍历这些txt的资源文件。

4.重复触发

我在一个插件module里面发送一个信号,而后多个module都须要接受这些信号,那么如何控制其它module接收顺序,或者触发顺序调节呢?给个选择题吧

(1)插件提供判断参数给触发插件,将触发顺序的逻辑都写在触发插件里面。(这里还须要考虑若是插件不存在的判空问题)

(2)将触发的逻辑分发到其余插件,而后经过插件获取其余插件的状态(没启动或者不须要处理)而去判断是否作相应的操做

这里须要考虑到充分解耦的问题,由于代码调整的触发逻辑,控制很差咱们极可能须要更替一个或者多个module,就由于一个修改就更替module,这样的设计是很是很差的。估计有人确定以为这些方案都不适合吧。

那么我就提供第三种方案吧。

(3)PluginManager在发送信号到其余插件时候,在发送前作过滤操做,须要过滤什么信号,就须要读取一个列表过滤列表(经过包名过滤或者信号名过滤),作成服务器可配置,那么随时均可以转换顺序触发逻辑了。

若是你看到这里有更好的解耦方案,也能够提出来,让咱们继续学习。

5.全局弹框

有人是否有想过Android的弹框(自定义Dialog)是怎么弹出来的?

你想要在任意页面里面能够弹出提示的弹框须要如何作?

咱们弹出弹框须要依赖于window,而且咱们建立dialog的时候须要顶层Activity的Content对象

那么咱们须要如何能够获取到顶层的Activity的Content对象呢?

这里面Application能够提供该顶层Activity时候的声明周期,做出回调,而后咱们能够经过作成base

Module保存,其余插件获取context实现或者直接获取弹框对象。(这里面须要api level 14)



6.最重要的提醒

咱们最但愿的是不能让插件的任何调用会嵌入到宿主module或者其余插件的module,任何通讯最好仍是经过底层base module作的通讯来协议来作,由于一旦木有判空,插件移除将会影响到宿主或者其余插件崩溃。



这节就到这里,但愿对你们有必定的帮助。

若是你有更好的建议,请在评论中留言,我会和各位继续相互讨论,谢谢!

下一节将会更精彩!!!



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

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

相关文章
相关标签/搜索