写点什么

字节跳动技术总监自爆:Android 项目开发如何设计整体架构?建议收藏

发布于: 2021 年 03 月 03 日

前言


成为一名优秀的 Android 开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样。


本文思维导图



阿里巴巴


面试问题还记得一些,一部分已经忘记了,为了防止再忘记,所以写出来。1:你是如何理解 Android 操作系统的。2:是否熟悉 framework 层,如果熟悉,那就对 framework 做个简介。3:是否熟悉多线程,如果熟悉,介绍下线程。4:对象锁和类锁是否会互相影响,会举例子让你判断锁的使用是否恰当,并说出原因。5:是否熟悉 Lopper 架构,如果熟悉说下其原理,如果你自己实现,你会怎么实现。这里主要考察阻塞消息队列原理,和其变形。6:自定义控件原理,及消息分发流程。7:binder 工作原理。8:ActivityThread,Ams,Wms 的工作原理。9:如果工作中需要修改 framework,你如何寻找切入点。


电话面试就这么多内容,自我感觉给回答打了 75 分,然后就是等通知;又隔了两天,阿里的 HR 打电话让我去指定地点面试,心里有点紧张,因为想给马云打工的人太多,竞争激烈程度可想而知


小米


一面、二面


1.介绍一下 binder 和原理


2.measure layout draw 流程,滑动冲突


3.常用的多线程工具类。blockingqueue ,concurrenthashmap,信号量,countdownlatch,cyclicbarrier,exchanger 等,stringbuffer


4.stringbuilder 和 stringbuffer 区别


5.lock 和 syncrognized 原理区别,适合什么场景。


6.实现生产者,消费者


7.handler 原理,是如何实现延时的。


8.一个 activity 启动另外一个 activity 的生命周期。


算法题:


1 反转链表


2.归并排序


3.快速排序


4.feiboqiena 数列


5.二分查找


6.两个队列实现栈


7.两个栈实现队列 8.判断链表是否成环,找到成环的交点。


字节跳动面试


一面


1:插件化。启动 activity 的 hook 方式。taskAffity。


2:okhttp 支持 HTTP2?http2 的功能有哪些?tcp 方面拥塞控制?tsl 的握手和具体的非对称加密算法。非对称名称


3:handler 的 post(Runnable)如何实现的。callback,runnable,msg 的执行优先级。


4:阻塞是怎么实现的?为什么不会阻塞主线程?


5:求二叉树中两个节点之间的最大距离。


6:206 含义,未修改资源是哪个,302 含义,301 含义


7:多进程通信问题。binder 优势。aidl 生成的 java 类细节。多进程遇到哪些问题?


8:动态代理传入的参数都有哪些?非接口的类能实现动态代理吗?ASM 的原理


9:Application 和 Activity 在 Context 的继承树上有何区别?二者使用上有何不同?


10:任意一颗二叉树,求最大节点距离


二面


1:设计一个日志系统。


2:内存泄露的分类。怎么查看内存泄露的问题


3:touch 事件源码问题。


4:组件化的问题。module 和 app 之间的区别。moduler 通信是如何实现的。


5:native 奔溃的日志采集,怎么处理?


6:注解实现一个提示功能:如果 int 的值大于了 3 需要提示。


三面


1:介绍下 flutter 的启动流程


2:介绍下 flutter 与 weex 的区别


3:组件化介绍一下


4:webview 中与 js 通信的手段有哪些?


5:介绍下 flutter_boost 的原理


四面


1:适配器和装饰模式各自特点和使用场景


2:视频编解码是怎么做的


3:三色球排序


一面为什么工作一年就想换工作?onTouchEvent/onTouchListenr.onTcouchEvent/onClickListenrhashmap 的原理?java 的 hashcode 和 equals 的区别 java 的 gc 了解多少?kt 的伴生对象是饿汉模式还是懒汉模式?handler.postDelayed 的原理 ANR 怎么产生?怎么捕捉?智力题:桌子上有 101 块饼***拿先手,他拿后手,你需要怎么赢 tcp 三次握手/四次挥手, 为什么要三次握手,四次挥手?内存泄漏是什么?怎么找?算法题:斐波拉契数列,递归的方式怎么优化?


二面手淘这种大型 app 是怎么迭代起来的?你对小程序的原理了解么?v8binding 怎么做?你项目的价值是什么?图片缓存怎么做?你要设计一个图片缓存框架怎么搞?lrucache 怎么实现?为什么是 o(1)的时间复杂度?voliate 关键字解释下?voliate 关键字不能实现什么?https 解释下常见的对称加密算法和非对称加密算法有哪些?让你设计一个打点系统怎么做?如果进程被杀死或者切换后台,数据如何保存丢失?你怎么设计埋点系统一个线程模型?快速排序?快速排序是稳定的么?如何实现一个快速排序的稳定性?minstack 怎么设计?kotlin 和 java 混用有哪些问题?设计一个数据结构,微博里面有人发了文章怎么实现?关注怎么实现?微博里面有人发了文章,关注的人如何获取最新的 10 条?如何获取关注的人的文章的最新 1000 条?设计一个高效的算法


三面你为什么选择换工作?你组里面的人都怎么样?你怎么解决项目中的难点?你有工作中遇到过哪些比较麻烦的地方?你平时怎么学习的啊?你除去学习之外都看什么书?


文末


初级工程师拿到需求会直接开始做,然后做着做着发现有问题了,要么技术实现不了,要么逻辑有问题。


而高级工程师拿到需求会考虑很多,技术的可行性?对现有业务有没有帮助?对现有技术架构的影响?扩展性如何?等等...之后才会再进行设计编码阶段。


而现在随着跨平台开发,混合式开发,前端开发之类的热门,Android 开发者需要学习和掌握的技术也在不断的增加。


通过和一些行业里的朋友交流讨论,以及参考现在大厂面试的要求。我们花了差不多一个月时间整理出了这份 Android 高级工程师需要掌握的所有知识体系。你可以看下掌握了多少。


混合式开发,微信小程序。都是得学会并且熟练的



这些是 Android 相关技术的内核,还有 Java 进阶



高级进阶必备的一些技术。像移动开发架构项目实战等



Android 前沿技术;包括了组件化,热升级和热修复,以及各种架构跟框架的详细技术体系



以上即是我们整理的 Android 高级工程师需要掌握的技术体系了。可能很多朋友觉得很多技术自己都会了,只是一些新的技术不清楚而已。应该没什么太大的问题。


而这恰恰是问题所在!为什么别人高级工程师能年限突破 30 万,而你只有十几万呢?


就因为你只需补充你自己认为需要的,但并不知道企业需要的。这个就特别容易造成差距。因为你的技术体系并不系统,是零碎的,散乱的。那么你凭什么突破 30 万年薪呢?


我这些话比较直接,可能会戳到一些人的玻璃心,但是我知道肯定会对一些人起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。


喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!


以上系统大纲里包含的所有技术资料,我这里都有的。可以免费分享给有需要的朋友!


资料领取方式:点击我的GitHub


用户头像

VX公众号:编程进阶路 2020.11.28 加入

还未添加个人简介

评论

发布
暂无评论
字节跳动技术总监自爆:Android项目开发如何设计整体架构?建议收藏