2021年 Android开发的现状
现在Android开发的现状大致是这个样子,人才严重过饱和,加上跨端和小程序盛行,原生客户端(安卓 iOS)岗位进一步萎缩,入行之后就业极为困难。目前行情是移动端严重过剩,服务端供需平衡,前端供不应求。市场上前端工作好找,服务端职业上限整体较高。。客户端上百人抢一个工作岗位,竞争激烈,内卷惨烈。
客户端开发整体水平较低,大量培训出来的开发者,简历包装两三年就能出来找到一份CV的工作,起薪就可以超过大部分人,所以这也是造成人员过剩的一个条件,人员过剩不可避免地就会导致公司的要求变高,福利变少等一系列问题。
那为什么Android开发会面临如此的危机呢?
现在程序员这个行业有手就行,门槛越来越低,无需学历,没有性别限制,只要你想,花点钱学习个半年,直接就能上场,这种批发效率极高。导致Android开发者鱼贯而入,人数爆发式增长对于原先老一辈的Android开发有一个极大的冲击,行业新人带着新的工作模式,新的工作态度,以及更好的精力和更低的工资供老板选择。
这样的条件,你被优化了也无可厚非,相同的事情,别人的性价比更高,产出也比你高,为什么不用性价比跟高的年轻人呢?当然,人都是会老去的,这对于大多数人来说都是一个死循环。
会画个UI就叫客户端研发了?记住了,缺的永远是真正的人才。
如何避免被优化?
对于程序员来说,赚钱最简单有效的办法就是提升自己的技术,学习永远是最廉价最有效地提升自己地方法。避免被优化有两种路可以走:
第一:
转行成为管理人员,在一家公司做的久了,对于公司的运营方式和管理模式都有一个较为全面的了解,对于技术层面和运营层面都有一个较为正确的理解,但是这个管理岗位是竞争力相当大的,不想当将军的士兵不是好士兵。
没人能够教你怎么去做一个 “将军”,没有一个确切的学习方向和路线,只能自己摸索,老板来看,老板说你行,你就是可以的,不行就是永远不行。
第二:
提升自己的技术,建立属于自己的技术壁垒,这是个有明确方向,学无止境的过程,这条路也是一条不断学习的路,只有不断学习才能从这条路上走得更久,把自己打造成一个 “T” 型人才,从涉猎到精通的过程,就是成为技术大牛的过程,成为大牛之后,你就会发现,所有的技术都是有相互关系的,也就是说,所有技术到了一定程度上之后都是互通的。
这也是大牛的恐怖之处,能够快速上手一门语言,搭建一个成熟的架构....等等。
在自己技术牛逼之后,便是不再受公司的内卷影响了,架构师在任何一家公司都是稀缺资源。
接下来就是各公司的面经了,分享出来供大家参考。
10家大厂面试题
尚德公司面试
1.java有什么特性,继承有什么用处,多态有什么用处
2.反射是什么,在哪里用到,怎么利用反射创建一个对象
3.代理模式与装饰模式的区别,手写一个静态代理,一个动态代理
4.对象加载的过程,属性先加载还是方法先加载
5.垃圾回收机制与jvm结构
6.自定义View,事件分发机制讲一讲
7.http与https有什么区别
8.Activity启动模式,以及各启动模式生命周期问题
9.静态方法,静态对象为什么不能继承
10.Activity 怎么启动 Service,Activity 与 Service 交互,Service 与 Thread 的区别
11.介绍一下android动画
12.Launcher启动App的流程,中间有几种跨进程通信(socket)
13.Handler通信,Binder通信
14.你碰到过什么内存泄漏,怎么处理
15.RXJava怎么切换线程
16.Fragment hide show生命周期
17.平常有用到什么锁,synchronized底层原理是什么
Vivo公司
1.简单描述下Handler,Handler是怎么切换线程的,Handler同步屏障
2.Glide的缓存,有用过Glide的什么深入的API,自定义model是在Glide的什么阶段
3.讲讲mvc,mvp模式,presenter内存泄漏的问题
4.ANR了解过吗?有没有实际的ANR定位问题的经历
5.性能优化你做过哪些?
6.有什么实际解决UI卡顿优化的经历
7.有做过什么Bitmap优化的实际经验
8.项目搭建过程中有什么经验,有用到什么gradle脚本,分包有做什么操作
9.组件化有详细了解过吗?ARouter详细原理
10.讲一下事件分发机制,RecyclerView是怎么处理内部ViewClick冲突的
11.mainfest中配置LargeHeap,真的能分配到大内存吗?
B站
1.一个大致有序的数组如何排序,最快时间复杂度
2.如果叫你实现,你会怎样实现一个多主题的效果
3.如何自定义实现一个FlexLayout
4.tinker的原理是什么,还用过什么热修复框架,robust的原理是什么?
5.说说你对注解的了解,是怎么解析的
6.synchronized是公平锁还是非公平锁,ReteranLock是公平锁吗?是怎么实现的
7.泛型是怎么解析的,比如在retrofit中的泛型是怎么解析的
8.mvp与mvvm的区别,mvvm怎么更新UI,databinding用得多吗,databinding的原理?
9.kotlin ?的原理
10.在项目中有直接使用tcp,socket来发送消息吗
11.如何在网络框架里直接避免内存泄漏,不需要在presenter中释放订阅
12.生命周期都是通过什么调用的?有用过AIDL吗?
13.讲一下RecyclerView的缓存机制,滑动10个,再滑回去,会有几个执行onBindView
14.如何实现RecyclerView的局部更新,用过payload吗,notifyItemChange方法中的参数?
15.讲讲LinkedHashMap的数据结构
16.put post有什么区别
17.A Activity打开B Activity的生命周期变化,会有什么方法打断吗?
18.Fragment hide show生命周期变化
19.Fragment replace生命周期变化
B站二面
1.为什么考虑换工作
2.屏幕适配做过什么工作?
3.你们网络框架用的什么?为什么?
4.如果让你来开发B站的一个页面,哪一个页面可以很快入手
5.性能优化你做过什么工作?
6.h5与native通信你做过什么工作?
7.插件化的主要优点和缺点是什么?
8.你觉得B站目前的APP有什么问题?
9.如果产品要求你开发一个音频播放功能,你会怎么着手?预计会有什么坑?
10.ViewPager切换Fragment什么最耗时?
11.线程间同步的方法
12.锁之间的区别
B站三面
1.介绍一下你自已和项目
2.说说为什么考虑离职
3.说说对你们原来公司的印象
4.为什么想来B站?你在B站上常常在看什么?
5.期望薪资是多少?
6.你对搬到上海有什么想法?
腾讯
1.介绍一下你们项目的架构
2.Rxjava是怎么实现线程切换的
3.Rxjava自定义操作符
4.ARouter的原理
5.ARouter怎么实现接口调用
6.ARouter怎么实现页面拦截
7.MVP怎么处理内存泄漏
8.OkHttp怎么实现连接池
9.如果让你来实现一个网络框架,你会考虑什么
10.你做过什么性能优化的工作
11.热修复的原理,资源的热修复的原理,会不会有资源冲突的问题
12.ViewPager中嵌套ViewPager怎么处理滑动冲突
13.android源码中有哪些设计模式
14.说说binder机制的原理
点击此处免费获取,Android 与算法面试题和答案。
腾讯二面
1.为什么考虑换一份工作?
2.在你们公司这几年感觉怎么样?
3.技术选型上,为什么这么考虑?从开发效率,产品性能,产品质量,产品体验等方面考虑
4.你们的产品为什么被砍掉,从哪方面考虑
5.在这几年里,你有做过什么觉得最有价值的工作
6.你还有什么要问我的吗?目前有几个offer,倾向性是怎样的?
网易云音乐
1.ViewPager2原理
2.LifeCycle的原理是怎样的?
3.ViewModel为什么在旋转屏幕后不会丢失状态
4.Drawable与View有什么区别,Drawable有哪些子类
5.属性动画更新时会回调onDraw吗?
6.OkHttp网络拦截器,应用拦截器?OKHttp有哪些拦截器,分别起什么作用
7.自定义实现一个九宫格如何实现
8.PathClassLoader与DexClassLoader有什么区别
9.这些年有做一些什么比较难的工作?
10.编译时注解与运行时注解,为什么retrofit要使用运行时注解?什么时候用运行时注解?
11.kotlin lazy使用,lazy viewmodel
12.有没有看一下Google官方的ViewModel demo
13.ViewModel在Activity初始化与在Fragment中初始化,有什么区别?
14.kotlin与Java互相调用有什么问题?
15.retrofit怎么做post请求
16.界面优化的一些方法,ConstraintLayout实现三等分,ConstraintLayout动画.
17.CoordinatorLayout自定义behavior,可以拦截什么?
网易云音乐二面
1.你们的项目中做过什么比较难的工作?
2.视频播放,一个player怎么实现预加载,避免loading 2.webView加载本地图片,如何从安全方面考虑
3.http1.0,http1.1,http1.2有什么区别
4.https与http有什么区别
5.有用过什么加密算法?AES,RAS什么原理?
6.android跨进程通信了解吗?共享内存用过吗?binder怎么验证pid?binder驱动了解吗?
7.SharedParence可以跨进程通信吗?如何改造成可以跨进程通信的.commit和apply的区别.
8.Seriazable与Parceable的区别
9.Bundle是什么数据结构?利用什么传递数据
10.Jvm的内存结构,Jvm的垃圾回收,方法区有什么东西?
11.h5与native交互,webView.loadUrl与webView.evaluateUrl区别
网易云音乐三面
1.有没有做过什么WebView秒开的一些优化
2.你们的项目中有什么难点?
3.native如何对h5进行鉴权,让某些页面可以调,某些页面不能调
4.有看过哪些框架的源码吗?
5.viewModel是怎么实现双向数据绑定的?
6.viewModel怎么实现自动处理生命周期?
7.图片加载优化有什么经验吗?
8.viewpager切换掉帧有什么处理经验?
9.一个wrap_content的ImageView,加载远程图片,传什么参数裁剪比较好?
10.两个getDrawable取得的对象,有什么区别?
11.补间动画与属性动画的区别,哪个效率更高?
12.jsBridge实现方式
13.平常是怎么了解一些新知识与业界动态的,最近有什么印象深刻的文章
14.平常抓包用什么工具?
15.Mvp与Mvvm有什么区别?
跟谁学
1.项目中的Webview与native通信
2.项目中对WebView的功能进行了怎样的增强
3.synchronized跟ReentranLock有什么区别?
4.synchronized与ReentranLock发生异常的场景.
5.算法,删除数组中的重复元素
6.手写双检查单例模式,各个步骤有什么区别
7.Activity生命周期
快手
1.string,equals,==有什么区别
2.AsyncTask内存泄露
3.dispatchTouchEvent,onInterceptEvent,onTouchEvent顺序,关系
4.onMeasure,onLayout,onDraw关系
5.算法题,反转数组
6.算法题,链表求和
7.说说你对协程的理解
8.协程怎么取消
9.说说MVP与MVVM的区别
快手二面
1.算法题,二叉树的最大深度
2.如果android端和IOS端调一个接口,一个通了一个没通,你会如何解决
3.如果android端和IOS端调一个接口,一个比较慢,一个比较快,有什么思路
4.ARouter的原理是什么?如果不用ARouter,你会怎么去解藕。接口?设计接口有什么需要注意的?
5.h5与native交互做过什么工作?
6.登陆功能,登陆成功然后跳转到一个新Activity,中间涉及什么?从事件传递,网络请求,AMS交互角度分析
7.AMS交互调用生命周期是顺序的吗?
8.binder进程间通信可以调用原进程方法吗?
9.mvp与mvvm有什么区别?
10.token放在本地如何保存?如何加密比较好?
快手三面
1.viewModel的原理,为什么可以在Activity销毁后保存数据
2.mvvm双向数据绑定的原理是怎样的?ViewModel
3.说说你们项目中的难点是怎样的?
4.伪代码实现一个长按事件
5.实现一个下载功能的接口
猿辅导
1.泛型有什么优点?
2.动态代理有什么作用?
3.拉圾回收的GCRoot是什么?
4.Handler机制了解吗?一个线程有几个Looper?为什么?
5.你了解协程吗?协程有什么作用?可以完全取代rxjava吗?
6.你们用的什么消息通信机制
7.你的项目有什么难点?介绍一下?
8.算法题,二叉树最长结点集合
猿辅导2面
1.你们项目中的难点是什么?
2.编译期注解处理的是字节码还是java文件
3.你在项目中有用到什么设计模式吗?
4.ARouter的原理是怎样的?
5.插件化的原理是怎样的?
6.算法题,K个一组反转链表
7.广播与RxBus的区别,全局广播与局部广播区别
猿辅导3面
1.你们项目中有什么难点?
2.@JavaScriptInterface为什么不通过多个方法来实现?
3.为什么不利用同步方法来做jsBridge交互?同步可以做异步,异步不能做同步
4.网络封装怎么实现?
5.算法题,不同面值的几个硬币,怎么求满足条件的最小值
斗鱼
1.说说HashMap的原理
2.说说Java的内存分区
3.讲讲你对垃圾回收机制的了解,老年代有什么算法?
4.说说你对volatile字段有什么用途?
5.说说事件分发机制,怎么写一个不能滑动的ViewPager
6.说说你对类加载机制的了解?DexClassLoader与PathClassLoader的区别
7.说说插件化的原理,资源的插件化id重复如何解决?
8.mvp与mvvm模式的区别是什么?
9.JetPack组件用过哪些?lifeCycle的原理是什么?如果在onStart里面订阅,会回调onCreate吗?
10.单例模式有什么缺点?
11.说说App的启动过程,在ActivityThread的main方法里面做了什么事,什么时候启动第一个Activity?
12.说说你对Handler机制的了解,同步消息,异步消息等
13.说说你对屏幕刷新机制的了解,双重缓冲,三重缓冲,黄油模型
14.onCreate,onResume,onStart里面,什么地方可以获得宽高
15.为什么view.post可以获得宽高,有看过view.post的源码吗?
16.attachToWindow什么时候调用?
17.DataBinding的原理了解吗?
滴滴一面
1.JVM类加载机制了解吗,类什么时候会被加载?类加载的过程具体生命周期是怎样的?
2.Handler内存泄漏的GCRoot是什么?
3.动画里面用到了什么设计模式?
4.OkHttp里面用到了什么设计模式?
5.OkHttp连接池是怎么实现的?里面怎么处理SSL?
6.泛型为什么要擦除?kotlin的泛型了解吗?泛型的pecs原则
7.同步屏障
8.性能优化做过什么工作?
9.RecyclerView的缓存结构是怎样的?缓存的是什么?cachedView会执行onBindView吗?
10.RecyclerView嵌套RecyclerView,NestScrollView嵌套ScrollView滑动冲突
11.ViewGroup在Action_Move时onIntercept返回true,事件怎么传递
12.Launcher启动图标,有几个进程?
13.JMM可见性,原子性,有序性,synchronized可以保证什么?
14.源码中有哪里用到了AtomicInt
15.AQS了解吗?
16.Activity内LinearLayout红色wrap_content,包含View绿色wrap_content,求界面颜色
17.ViewModel的使用中有什么坑?
18.有用DSL,anko写过布局吗?
19.HashMap查找的时间复杂度是多少?
20.阿里编程规范不建议使用线程池,为什么?
21.四种线程池原理?
22.了解哪些算法?
23.IdleHandler用过吗?
滴滴二面
1.如何封装一个字符串转数字的工具类
2.如何求当前Activity View的深度
3.多进程怎么实现?如果启动一个多进程APP,会有几个进程运行?
4.反射可以反射final修饰的字段吗?
5.Activity与AppCompactActivity区别,Activity会打包到包里面去吗?
6.如何让两个线程循环交替打印
7.怎么中止一个线程,Thread.Interupt一定有效吗?
8.动画连续调用的原理是什么?
9.做过一些SDK的操作吗?
10.协程可以在Java项目中使用吗?
11.SharedPreference原理?读取xml是在哪个线程?
12.了解APK打包的过程吗?
13.class文件的组成?常量池里面有什么内容?
14.自动装箱发生在什么时候?编译期还是运行期
15.bugly日志收集的原理是什么?
16.启动优化做过什么工作?如果首页就要用到的初始化?
17.DataBinding原理
滴滴3面
1.插件化的原理是什么?有没有什么非运行时插件化的解决方案?
2.ARouter的原理是怎样的?注解处理器是处理java还是字节码
3.java和字节码有什么区别?
4.kotlin空安全的原理是什么?
5.性能优化做过什么工作?有用过什么工具?有没有精确测量的工具?
6.kotlinc与javac编译字节码有什么区别?
7.你在团队中是怎样一个角色?
8.你有没有做什么推进项目的工作
9.说说热修复的原理?
字节跳动
1.你们的项目中有什么难点?
2.你们项目的稳定性如何?有做过什么稳定性优化的工作?
3.WebView性能优化做过什么工作?
4.AIDL in out oneWay代表什么意思?
5.线程池了解多少?拒绝策略有几种,为什么有newSingleThread
6.跨进程通信了解多少?管道了解吗?
7.协程介绍一下,讲一个协程的scope与context,协程的+号代表什么
8.Handler休眠是怎样的?epoll的原理是什么?如何实现延时消息,如果移除一个延时消息会解除休眠吗?
9.算法斐波那契台阶
10.手写生产者消息者模型
11.IdleHandler应用场景
字节跳动2面
1.自定义圆角图片 2.自定义LinearLayout,怎么测量子View宽高 3.setFactory和setFactory2有什么区别? 4.插件化换肤方案 5.插件化的原理,startActivity hook了哪个方法 6.手势操作ActionCancel后怎么取消 7.怎么优化xml inflate的时间,涉及IO与反射。了解compose吗? 8.算法题:二叉树的每一层最左边节点 9.RecyclerView 缓存结构,RecyclerView预取,RecyclerView局部刷新 10.setOnTouchListener,onClickeListener和onTouchEvent的关系
总结
生命不止,学习不止,程序员这一行,以我的眼光看,就是底层人民翻身的最好职业,它只看你的技术,绝对不会因为其他任何东西去歧视你,只要你技术好,便是超过了极大部分人,有人会说,996,内卷等一系列针对于程序员这个行业的贬义词。
但是我想说的是,在任何行业这种情况都是不可避免的,当我们抱怨着996没有休息的时候,却不曾想到工人全年无休,当我们抱怨内卷严重的时候,不少表演系的大学生还没毕业毕业就就已经开始被各种卷,各种。。。
生活不易,吾辈且奋发图强!
技能提升
最后我想说,没有一蹴而就的事情,很多事情都是水滴石穿,建议大家工作之余还是要保持学习的状态,比如关注一些知名的技术公众号,了解业界最新动态,时刻准备着。
如果你觉得自己学习效率低,缺乏正确的指导,可以参考下下面分享我多年工作以来收集整理的学习路线,给大家做个参考:
确定好方向,梳理成长路线图
不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。
关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
学习一线大厂的各项技术:
1. 大厂面试高频知识点
- 图片
- 网络和安全机制
- 数据库
- 插件化、模块化、组件化、热修复、增量更新、Gradle
- 架构设计和设计模式
- 性能优化
- Android Framework
- Android优秀三方库源码
2.Jetpack架构组件从入门到精通
- Android Jetpack - Navigation
- Android Jetpack - Data Binding
- Android Jetpack - ViewModel & LiveData
- Android Jetpack - Room
- Android Jetpack - Paging
- Android Jetpack - WorkManger
- Android Jetpack架构组件之Lifecycle
- Android Jetpack Compose 最全上手指南
3.Framework精编内核解析
主要内容包含:
- 深入解析Binder
- 深入解析Handler
- Dalvik VM 进程系统
- 深入解析 WMS
- PackagerManagerService
4.Kotlin强化实战(附Demo)
- 第一章 Kotlin入门教程
- 第二章 Kotlin 实战避坑指南
- 第三章 项目实战《Kotlin Jetpack 实战》
- 从一个膜拜大神的 Demo 开始
- Kotlin 写 Gradle 脚本是一种什么体验?
- Kotlin 编程的三重境界
- Kotlin 高阶函数
- Kotlin 泛型
- Kotlin 扩展
- Kotlin 委托
- 协程“不为人知”的调试技巧
- 图解协程:suspend
5.Android设计思想解读开源框架
- 热修复
- 插件化
- 组件化框架设计
- 图片加载框架
- 网络请求框架
- RXJava 响应式编程框架设计
- IOC 架构设计
- Android架构组件Jetpack
6.NDK模块开发
- NDK 模块开发
- JNI 模块
- Native 开发工具
- Linux 编程
- 底层图片处理
- 音视频开发
- 机器学习
看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
简历准备充分
可以去知乎上面搜搜别人写的有关简历的帖子,怎么准备,吸引hr, 突出自己的优点和能力,或者让朋友帮你看看简历有没有问题,比如过于简单或者浮夸,没有重点等。
尽量把你的亮点总结成一句简练的话,再加上数字来说明它的影响和意义。
其次在简历里中加入了可交互、可展示的内容,更能显出你的能力与众不同。
定期面试:
光学习了大厂的技术还不够,如何了解当下Android市场需要哪些技术呢?
定期的面试足以让你了解当下市场需要哪些技术,也更加容易确定自身的短板在哪,同时,也可以督促自己学习提升(小伙子,你了解的技术有点落伍了呀…)
万一拿到了高薪Offer,岂不是更赚?
多看大佬的学习笔记,学习大佬的设计思想:
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。