写点什么

Android 基础入门教程,享学课堂 Android 架构师 vip

用户头像
极客开源
关注
发布于: 刚刚

组件化

1.1 组件化初衷

  • APP 版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,维护成本高。

  • 业务耦合度高,代码越来越臃肿,团队内部多人协作开发困难。

  • Android 项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时。

  • 方便单元测试,改动单独一个业务模块,不需要着重于关注其他模块被影响。

1.2 什么是组件化

组件化就是将一个 app 分成多个 Module,如下图,每个 Module 都是一个组件(也可以是一个基础库供组件依赖),开发的过程中我们可以单独调试部分组件,组件间不需要互相依赖,但可以相互调用,最终发布的时候所有组件以 lib 的形式被主 app 工程依赖并打包成一个 apk。

1.3 组件化优势

  • 组件化就是将通用模块独立出来,统一管理,以提高复用,将页面拆分为粒度更小的组件,组件内部除了包含 UI 实现,还包含数据层和逻辑层。

  • 每个工程都可以独立编译、加快编译速度,独立打包。

  • 每个工程内部的修改,不会影响其他工程。

  • 业务库工程可以快速拆分出来,集成到其他 App 中。

  • 迭代频繁的业务模块采用组件方式,业务线研发可以互不干扰、提升协作效率,并控制产品质量,加强稳定性。

  • 并行开发,团队成员只关注自己的开发的小模块,降低耦合性,后期维护方便等。

2 组件化通信

2.1 组件化通信

组件化互相不直接依赖,如果组件 A 想调用组件 B 的方法是不行的。很多开发者因为组件化之间通信比较复杂 则放弃了组件化的使用


组件通信有以下几种方式:


####### 1.本地广播


本地广播,也就是 LoacalBroadcastRecevier。更多是用在同一个应用内的不同系统规定的组件进行通信,好处在于:发送的广播只会在自己的 APP 内传播,不会泄漏给其他的 APP,其他 APP 无法向自己的 APP 发送广播,不用被其他 APP 干扰。本地广播好比对讲通信,成本低,效率高,但有个缺点就是两者通信机制全部委托与系统负责,我们无法干预传输途中的任何步骤,不可控制,一般在组件化通信过程中采用比例不高。


2.进程间的 AIDL


进程间的 AIDL。这个粒度在于进程,而我们组件化通信过程往往是在线程中,况且 AIDL 通信也是属于系统级通信,底层以 Binder 机制,虽说 Android 提供模板供我们实现,但往往使用者不好理解,交互比较复杂,往往也不适用应用于组件化通信过程中。


3.匿名的内存共享


匿名的内存共享。比如用 Sharedpreferences,在处于多线程场景下,往往会线程不安全,这种更多是存储一一些变化很少的信息,比如说组件里的配置信息等等


4.Intent Bundle 传递


Intent Bundle 传递。包括显性和隐性传递,显性传递需要明确包名路径,组件与组件往往是需要互相依赖,这背离组件化中 SOP(关注点分离原则),如果走隐性的话,不仅包名路径不能重复,需要定义一套规则,只有一个包名路径出错,排查起来也稍显麻烦,这个方式往往在组件间内部传递会比较合适,组件外与其他组件打交道则使用场景不多。

2.2 目前主流做法之一就是引入第三者,比如图中的 Base Module。

3 ARouter 组件通信框架

3.1 ARouter 简介

是 ARouter 是阿里巴巴开源的 Android 平台中对页面、服务提供路由功能的中间件,提倡的是简单且够用。主要用作组件化通信


        Intent intent = new Intent(mContext, XxxActivity.class); intent.putExtra("key","value"); startActivity(intent);  Intent intent = new Intent(mContext, XxxActivity.class); intent.putExtra("key","value"); startActivityForResult(intent, 666);
复制代码


上面一段代码,在 Android 开发中,最常见也是最常用的功能就是页面的跳转,我们经常需要面对从浏览器或者其他 App 跳转到自己 App 中页面的需求,不过就算是简简单单的页面跳转,随着时间的推移,也会遇到一些问题:


  1. 集中式的 URL 管理:谈到集中式的管理,总是比较蛋疼,多人协同开发的时候,大家都去 AndroidManifest.xml 中定义各种 IntentFilter,使用隐式 Intent,最终发现 AndroidManifest.xml 中充斥着各种 Schame,各种 Path,需要经常解决 Path 重叠覆盖、过多的 Activity 被导出,引发安全风险等问题

  2. 可配置性较差:Manifest 限制于 xml 格式,书写麻烦,配置复杂,可以自定义的东西也较少

  3. 跳转过程中无法插手:直接通过 Intent 的方式跳转,跳转过程开发者无法干预,一些面向切面的事情难以实施,比方说登录、埋点这种非常通用的逻辑,在每个子页面中判断又很不合理,毕竟 activity 已经实例化了

  4. 跨模块无法显式依赖:在 App 小有规模的时候,我们会对 App 做水平拆分,按照业务拆分成多个子模块,之间完全解耦,通过打包流程控制 App 功能,这样方便应对大团队多人协作,互相逻辑不干扰,这时候只能依赖隐式 Intent 跳转,书写麻烦,成功与否难以控制。


为了解决以上问题,我们需要一款能够解耦、简单、功能多、定制性较强、支持拦截逻辑的路由组件:我们选择了 Alibaba 的 ARouter,偷个懒,直接贴 ARouter 的中文介绍文档:

3.2 ARouter 优势

从 ARouter Github 了解到它的优势:


支持直接解析标准 URL 进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持 InstantRun 支持 MultiDex(Google 方案) 映射关系按组分类、多级管理,按需初始化 支持用户指定全局降级与局部降级策略 页面、拦截器、服务等组件均自动注册到框架 支持多种方式配置转场动画 支持获取 Fragment 完全支持 Kotlin 以及混编 典型的应用:


从外部 URL 映射到内部页面,以及参数传递与解析 跨模块页面跳转,模块间解耦 拦截跳转过程,处理登陆、埋点等逻辑


跨模块 API 调用,通过控制反转来做组件解耦

三、典型应用场景

  1. 从外部 URL 映射到内部页面,以及参数传递与解析

  2. 跨模块页面跳转,模块间解耦

  3. 拦截跳转过程,处理登陆、埋点等逻辑

  4. 跨模块 API 调用,模块间解耦(注册 ARouter 服务的形式,通过接口互相调用)

总结

开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?


作者 13 年 java 转 Android 开发,在小厂待过,也去过华为,OPPO 等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级 Android 工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。


这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和 PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。


相信它会给大家带来很多收获:




资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图


当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

极客开源

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Android基础入门教程,享学课堂Android架构师vip