2024年Android最新Android 组件化面试必备,Android面试真题解析火爆全网

最后

给大家分享一份移动架构大纲,包含了移动架构师需要掌握的所有的技术体系,大家可以对比一下自己不足或者欠缺的地方有方向的去学习提升;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

二、组件化的思想&优势

下面是我的理解,如有出入,欢迎提出来一起讨论。

1、将一个大型项目分解成多个module,拆解的过程就是一个化繁为简的过程。

尤其在大团队,大项目上,组件化的优势会更加凸显。

大项目分解成一个个小型项目,相当于将一个复杂的问题拆解成一个个相对简单的问题。

每个成员,可以专注在自己相关业务的module上。

2、分层的module结构,同一层的module间存在代码隔离,这种隔离是编译上的隔离。

同层的代码不能相互调用。底层的代码也不能调用上层。

这种编译隔离,带来了,模块间的高度解耦。

让模块的依赖关系清晰。

3、更高的可重用性

如果构建正确)组件化设计的系统,比传统的整体设计具有更高的可重用性。

什么是组件?什么是模块?

组件强调复用,模块强调职责划分。 他们没有非常严格的划分。

达到可复用要求的模块,那么这个模块就是组件。

base层的module必须是可复用的,如果项目设计的好,business层都能被复用,每个module都能成为组件。

可重用性是组件化思想的核心。

如此架构,是否也适合技术中台的架构?

4、每个组件都具有可替代性如果构建正确

如果我们要为某个已经存在的组件,重新开发一个新组件,将变得非常可行。

组件内的重构也将变得非常可行。

新的组件的设计只要保证对外提供的接口,完全符合,旧组件对外提供的接口

5、组件的热插拔,成为可能(如果构建正确

我们想象下,在APP运行时,business中的组件可以动态加载,也可动态卸载。

那么我们可以轻松实现组件的懒加载:用户用到的组件,那么就加载进来。用完之后便可以卸载。

6、组件的独立编译、测试,成为可能(如果构建正确

大的android工程项目,build一次要到5分钟左右,太浪费时间了。

拆成多个组件之后,如果每个组件都能单独build,单独测试,那么将大大提升开发效率。

上面讨论的这些优势,并不是将简单将 单工程 拆分成 分层的多module工程结构 就能获得这些优势。

想要获得这些优势,还任重道远,我们还需要解决很多问题,才能让我们的项目具备上面的说的优势。

二、组件化后,将面临哪些问题?如何解决?

1、module之间如何优雅的通信

通过ARouter通信。

ARouter是阿里开源的一个项目。github.com/alibaba/ARo…

通过ARouter跨module跳转Activity

@Route(path = “/test/activity”)//申明路由

public class YourActivity extend Activity {

}

//通过路由启动Activity

ARouter.getInstance().build(“/test/activity”).withLong(“key1”, 666L).navigation();

通过ARouter在module间共享对象,实现module间通信。

比如:我们有一个账号模块 business:account ,提供了登录、登出、用户信息查询等业务。

同级的其他模块,如何跟账号模块通信?获取用户的登录状态以及用户相关信息?

public class AccountBean {

private String name;

private int age;

//…

}

public interface IAccountService extends IProvider {

void login(Context context);//登录

void logout(Context context);//登出

AccountBean getAccountBean();//获取账号信息

}

对外的数据结构和接口定义。

@Route(path = BusinessRoutePath.ModuleAccount.ACCOUNT)

public class AccountServiceImpl implements IAccountService {

//…

}

bussiness:account模块中的实现。

IAccountService accountService = ARouter.getInstance().navigation(IAccountService.class);

accountService.login(activity);

AccountBean bean = accountService.getAccountBean();

但是问题来了:

同层的其他模块,如何,能拿到ARouter的path?

同层的其他模块编译时,如何,共享AccountBean类、IAccountService接口?

这就是模块之间的编译隔离,带来的问题。

我们很自然的想到了framework模块,或者base层的其他模块。

我们只要将这些path定义、AccountBean类、IAccountService接口,下沉到base层,就可以实现编译上的代码共享。

如此一来,就带来了,另一个问题:代码的中心化问题

2、代码的中心化

简单的path字符串定义,放在framework倒是还好。

如果所有business模块对外提供的接口和数据结构,都定义到framework的话,问题就有点严峻。

将会破坏:组件的 可替代性可重用性组件间耦合度

因为framework是基础模块嘛,所有business模块都依赖的模块,如此,不管你的business1模块是否依赖business2模块的对外接口,都会存在这一层依赖。

模块间的代码边界出现一些劣化。缺少了编译上的隔离。许多模块将会变得不够“独立”了。

可替代性可重用性 越来越弱,想要替换或者复用某个business组件将变得越来越难。

将会导致,我们很难知道,哪些business对哪些business 接口有依赖。

同时,framework模块随着功能迭代,会不断膨胀。

这就是,中心化的问题。

于是我们很自然的想到了一个解决方案:

实现了另一种接口暴露的形式——“.api化”。

将 business模块 对外提供的接口单独抽到 business-api 模块中。其他依赖他的模块只需要依赖他的business-api即可。

这个方案如何实践下去呢?

微信的api化方案

微信团队出了一个很巧妙的方案,这个方案对android的组件化开发,产生了非常深远的影响。

后面很多做组件化开发的团队,在解决中心化问题基本都会用到类似的方案。

mp.weixin.qq.com/s/6Q818XA5F…

以下为,微信官方博客的原文引用:

使用方式和思路都很简单。对于java文件,将工程里想要暴露出去的接口类后缀名从“.java”改成“.api”,就可以了。

而且并不只是java文件,其他文件如果也想暴露,在文件名后增加".api”,也一样可以。

当然,要让工程支持这样的方式,gradle文件肯定会有一点改变。

它的实现原理也相当简单:自动生成一个“SDK”工程,拷贝.api后缀文件到工程中就行了,后面其他工程依赖编译的只是这个生成的工程。简单好用。

api方案有点类似于android的AIDL的思路。

微信API方案的变种

gradle 根据src/api文件来,自动生成{moduleName}-api模块。

如果,src/api文件不存在,将不会自动生成 {moduleName}-api 模块。

通过API模块来解决代码中心化问题带来的好处:

  1. 让各个business的之间的依赖明确

  2. 让business对外提供的接口明确。

从而加强了模块的:可替代性

只要两个business对外提供的API一致,就可以相互替换。

3、单独编译、测试 business的单个模块

模块变多了,项目变大了,整个项目的编译速度变慢了。

业内有两种常用做法。

  • 方案一:动态配置 build.gradle。

只要让单个的组建能编译成APP就能单独测试。

  • 方案二:多壳APP

方案来自,在聚美优品。

这里需要注意:假如,Demo1是business1的壳APP。那么Demo1还需要依赖哪些businessXXX呢?

刚好,前面做的api化,能排上用场。

business1依赖的businessXXX-api模块对应的businessXXX模块,Demo1也需要依赖。

为甚?因为,business1依赖的businessXXX-api模块,意味着,business1需要依赖 businessXXX提供的功能,比如要跳转到businessXXX的activity?或者,要获取businessXXX的对象。

4、模块变多了,gradle代码同比增长,gradle 代码复用
  • 版本号统一管理,依赖的统一管理
  • 方案一:Extra properties

在项目跟目录的build.gradle文件中配置Extra属性

如此可以实现统一管理版本号,和依赖。

但是,但是,但是,这个方案存在明显的缺陷。

  • 不支持,自动补全

  • 不支持Find Usages,查找所有应用的地方

  • 使用时,不支持点击跳转
最后

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

使用时,不支持点击跳转

最后

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-SNYPm35l-1715651875957)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值