如下是我这个系列的相关文章,有兴趣能够参考一下,能够给个喜欢或者关注个人文章。
算法
[Android]如何作一个崩溃率少于千分之三噶应用app--章节列表api
记得我以前有介绍了一种很是适合于组件化后作插件化的框架,就是Small。服务器
我在第九章节的时候就有介绍了Small的使用,还有深刻分析Small的运行原理。架构
近来使用Small研发插件中,遇到一些问题,就在这里和你们讨论一下。app
这里说一下Small的的一些缺陷,框架
(1)其不支持动态Service,Service都只能放在宿主里面了。组件化
(2)Small暂时是只能经过冷更新(就是彻底重启App时才能加载,若是有更新,当你按home键或者返回键退出,其会将整个Process杀死重启),源码中木有在运行途中增学习
这一篇的简书,理解难度将会加大,由于公司代码就不宜张贴啦,若是同窗没有项目木有实现过插件化的,理解起来会有必定的瓶颈。gradle
能够参考如下文章lua
基础看
深刻看这个
估计看完这些你就快能够疯掉了。^_^
选型基本须要考虑的问题
1.对四大组件的支持(hook点支持)
2.so库支持
3.打包时资源冲突
4.更新方式和时机
每一个插件都是基于base的module去开发,那么经过这个base module那么咱们就能够经过ModuleBus或者路由的机制完成传输了。
Small自己定义的OpenUri来启动对应的模块,并未有提供能够传递各类参数的方法。
而咱们是经过自定义一个PluginManager封装,相似以前介绍的分发机制去封装一个方法标志字符串标志,而后传输intent,context,viewgroup等对象,经过PluginManager遍历过滤再传输到对应的插件模块,其余须要传输的信息均可以封装到intent里面。
你想像一下,若是你每一个工程会依赖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的资源文件。
我在一个插件module里面发送一个信号,而后多个module都须要接受这些信号,那么如何控制其它module接收顺序,或者触发顺序调节呢?给个选择题吧
(1)插件提供判断参数给触发插件,将触发顺序的逻辑都写在触发插件里面。(这里还须要考虑若是插件不存在的判空问题)
(2)将触发的逻辑分发到其余插件,而后经过插件获取其余插件的状态(没启动或者不须要处理)而去判断是否作相应的操做
这里须要考虑到充分解耦的问题,由于代码调整的触发逻辑,控制很差咱们极可能须要更替一个或者多个module,就由于一个修改就更替module,这样的设计是很是很差的。估计有人确定以为这些方案都不适合吧。
那么我就提供第三种方案吧。
(3)PluginManager在发送信号到其余插件时候,在发送前作过滤操做,须要过滤什么信号,就须要读取一个列表过滤列表(经过包名过滤或者信号名过滤),作成服务器可配置,那么随时均可以转换顺序触发逻辑了。
若是你看到这里有更好的解耦方案,也能够提出来,让咱们继续学习。
有人是否有想过Android的弹框(自定义Dialog)是怎么弹出来的?
你想要在任意页面里面能够弹出提示的弹框须要如何作?
咱们弹出弹框须要依赖于window,而且咱们建立dialog的时候须要顶层Activity的Content对象
那么咱们须要如何能够获取到顶层的Activity的Content对象呢?
这里面Application能够提供该顶层Activity时候的声明周期,做出回调,而后咱们能够经过作成base
Module保存,其余插件获取context实现或者直接获取弹框对象。(这里面须要api level 14)
咱们最但愿的是不能让插件的任何调用会嵌入到宿主module或者其余插件的module,任何通讯最好仍是经过底层base module作的通讯来协议来作,由于一旦木有判空,插件移除将会影响到宿主或者其余插件崩溃。
这节就到这里,但愿对你们有必定的帮助。
若是你有更好的建议,请在评论中留言,我会和各位继续相互讨论,谢谢!
下一节将会更精彩!!!
我创建了一个关于Android架构学习的群,里面能够进一步进行组件化学习和架构思想的的交流。
群号是316556016,也能够扫码进群。我在这里期待大家的加入!!!