ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 面经总结:5天面5家,已收三家Offer~

2022-03-18 21:01:35  阅读:160  来源: 互联网

标签:已收 Java Offer 面经 面试官 面试 算法 Android 加载


作者:涛哥

前言

一年一度的金三银四跳槽面试季已过半,还好在期间内赶上了这趟车。我原本在一家中型的互联网公司从事Android 开发,回想一下在这家公司已做了三年了,所实话真有点不舍。但自己想蹭着年轻出去多学点东西,于是在今年的三月初就果断了选择离职。

离职后给了自己一个短暂的休息时间。经过完那段休息时间后,就开始了自己的面试复习的日子,在家闭关修炼一个多星期后,就开始投简历了。

简历投了三天,收到面试通知的差不多有十几公司左右,但最终我只选择了5家条件比较好的公司进行面试,这5家公司从面试到收到Offer只用了5天的时间。下面我就跟大家分享下我的面试经验和注意事项。

注意事项:

一、基础

不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。

二、算法

基本上每家公司都会有算法题,我当时是看了《程序员代码面试指南》,重点看了数组跟链表,二叉树没有去刷算法题,对于二叉树的掌握在于三种基本的遍历以及在排序算法中堆排序中用到的二叉堆,然后每道算法题都先自己去实现,先写思路,然后自己去实现一遍,然后再看看答案,记住答案的思路,第二天再重新按照答案的思路实现一遍,这种效果非常好,我没有去刷很多题目,而是想通过这种方式去分析常见的算法题,所以我不大建议去刷算法题,首先作为客户端开发,涉及不到很多的算法,第二,面试的时候考的算法大部分都是很基本的数组组跟链表构成的,最后算法这个东西是个无底洞,个人觉得没必要去刷题,刷题可能对小公司有用,但是大公司更看重你解决问题的能力。

三、虚拟机

JVM
对于Java,加载的是Class文件,一般会问到Java运行时的内存分配,类加载机制以及GC,实际上后面两个问地比较多,尤其是GC相关,往往结合四种引用出题,最后会通过这个来引出内存泄露相关的一些问题。

DVM&ART
Android的虚拟就DVM以及ART是对JVM做了一些优化,加载的是dex文件,对Class字节码做了一些优化,这个里面其实挺复杂的,我只知道一些基本的概念。

ClassLoader
这个其实要是问起来其实是有很多东西的,如果是Java相关其实还好,会问你类加载机制,但是Android里面除了Java的类加载机制之外,还会引出插件化跟热修复。

JNI
基本上稍微大点的公司都会问到,不过我的回答始终如一:我只能看懂C的代码,项目中没有用过JNI,当然这个属于加分项,因为我当时的选择是把我用过熟悉的东西研究地滚瓜烂熟,而不是在自己平时很少接触到的东西上面搞个一知半解。

Binder
Binder系列,各种AMS,WMS,PWS,常问到的有APP的启动流程,然后两个Activity相互跳转的时候的生命周期,Activity的生命周期。

四、自己的心态

不要想着什么都会,那样不现实,比如说我对Binder机制以及热修复,插件化这块儿确实了解地比较浅显,也跟高德,爱奇艺等公司的面试官聊过这个话题,这些属于加分项,不会影响到最终的面试结果,还有就是算法,面试最多考一道或者两道算法,所以没必要在这方面花太多的时间,掌握好常见的数组跟链表,二叉树/堆了解一下,基本就够了,公司看重的是你解决问题的能力,你把原理掌握好,常见地基本上都没什么问题。

当你基础知识OK,自己用过的东西的理解地有深度,解决问题的能力OK,如果面试官想要你,那么他会去找你的优点,反之他会去找你的缺点。所以如果你想进某家公司,那么你就按照他们的要求去面,就算面不上那么也没什么,只能说不合适,然后查漏补缺继续面,不要因为某一次或者几次的不顺就否定自己,有些公司的面试官就是喜欢装,而且还是大公司的。

学历很重要,我的学校只是个普通一本,相对一般,所以投了很多知名互联网公司简历都过不了,就连好大夫在邀请我面试的时候特意问了我是不是统招一本,任何行业都看重学历,不仅仅是IT,那些说学历不重要的基本上都是一些学历比较好的或者是在Android比较火地那个阶段开始搞地Android,他们这批人往往会觉得在03年跟18年加入的阿里的难度是一样的,那些觉得学历不重要的可以去看看张雪峰老在《演说家》中的演讲,不要说什么3年以后公司就不看学历了,学历是一辈子的事情,那些高考能够碾压你的人,出了社会只要他们愿意,照样能碾压你,你努力,你拼命,别人也不会睡大觉等你。

科班很重要,如果你本科学地是非计算机专业,任何一个面试官或者HR都会认为你基础不行,你需要花很多的时间去精力去补基础,然后再花时间跟精力在HR不Pass掉你简历的情况下摘掉基础不行这顶帽子。

工作背景很重要,如果你有大公司背景给你背书,相同的岗位,你进入的门槛比有大公司背景的人要高地多,如果你有大公司背景,不管是面试官还是HR都会在你面试前给你打一个较高的基本分,这个是很有利于你通过面试的。

不过上面都是既定的事实,你没法改变,所以当我意识到这些问题的时候,我只能去不断地提升自己的能力,去花更多地代价去获得一个面试机会,去证明自己的能力进而进入到一个比较好的平台。

面试过程

公司一(Offer)

面试机会来自于拉勾网

一面

  • MVP如何管理Presenter的生命周期,何时取消网络请求
  • 用过的框架及原理
  • 天猫的Tangram布局,vLayout原理

二面

  • APP的启动流程
  • 回形打印二维数组
  • Java为何引入泛型,泛型边界
  • 常见的Java数据结构
  • ArrayMap跟SparseArray在HashMap上面的改进
  • Java的四种引用及使用场景
  • Webview性能优化

公司二:(Over)

面试机会来自于拉勾

一面

1.自我介绍+介绍项目
2.Activity生命周期,每个回调方法的作用是什么?
3.事件的分发机制
4.内存泄漏
5.遇到过滑动冲突吗?滑动冲突的解决方法
6.如何进行单元测试,如何保证App稳定 ?
7.说一说Android中如何查看一个对象的回收情况 ?
8.Apk的大小如何压缩 ?
9.如何通过Gradle配置多渠道包?
10.插件化、组件化、热修复原理分析

二面

1.深挖项目
2.Activity 生命周期,A启动B两个状态分别是什么 ,A的onStop一定会执行吗?
3.surfaceView 和普通view的区别
4.Bitmap高效加载* 线程之间的通信方式handler
5.内存泄漏
6.为什么handler可以线程切换
7.Rxjava map关键字的作用是什么
8.怎么获取view的宽高,如何确定值是准确的,说了view.post()补充viewTreeObserverOnGlobalLayoutListener
9.场景题:头条列表有多个不同的card,使用RecyclerView怎么解耦getViewType,获得不同的card
说了用个管理类映射,面试官说用注解、反射,依赖注入。

三面

1.项目深挖
2.ARouter路由原理
3.如何管理过多的路由表?
4.看视频的时候网络请求很慢怎么优化?
5.说说HTTP3.0有什么改进?
6.App上线后用户使用时卡顿怎么查看是什么原因?

公司三(Offer)

面试机会来自于拉勾网

一面

  • Debug跟Release的APK的区别
  • 软引用跟弱引用的区别
  • ConcurrentHashmap的原理
  • Listview跟Recyclerview的区别(刷新,缓存,各自的使用场景)
  • 对谷歌新推出的Room架构
  • 动画的两种实现:setX跟setTranslationX区别
  • 事件分发:Activity跟window依次到viewgroup
  • Volley源码,优缺点
  • Picasso传入的Activity跟Application的context的区别

二面

  • 数据库的升级,表结构的修改
  • 常见的排序算法,手写二分查找,二分查找的复杂度分析
  • 点击APP图标启动APP的大致流程
  • SplashActivity中进行初始化MainActivity的参数,Splash没有初始化,AMS直接启动了MainActivity怎么办
  • 设计一个多线程,可以同时读,读的时候不能写,写的时候不能读(读写锁)
  • 设计断点续传,如何判断服务端是否支持断点续传
  • Binder机制:Binder内核所在的进程是如何找到到Server跟Client进行通信的
  • 对JNI是否了解
  • 组件化的原理,组件间通信

公司四(Over)

面试机会来自于Android Weekly

技术一面

1. mmap + native 日志优化?

讲了传统日志打印的两个性能问题,一个是反复操作文件描述符表,一个是反复进入内核态,然后讲了 mmap 的原理机制。

2. 讲讲 Android 开机启动的流程

讲了一大堆,其中说到 ServiceManager 进程是用来管理系统服务的,面试官说你确定?不是 SystemServer 进程来管理系统服务的吗?讨论了一番面试官懵逼了,提到了 SystemUI 服务,提到了桌面进程,问到了怎么替换开机启动的动画?

3. 系统是怎么帮我们启动找到桌面应用的

我说通过意图,他说怎么找到是哪个意图? 我说 PMS 会解析所有 apk 的 AndroidManifest.xml ,如果解析过会存到 package.xml 中不会反复解析,PMS 有了它就能找到了。

4. 讲讲动态状态页的加载,为什么要这么弄?

我说为了减少 xml 解析和反射创建对象的时间,避免同时创建多个用不上的对象,我就写了个框架用代码动态添加的。这时面试官误解了我的意思,以为所有的界面都是用代码写的,那得多麻烦呀,后来解释清楚了。

5. 讲讲页面的刷新机制,GPU 调试工具几个颜色值分别代表什么?

讲到了 Surface 底层管理的其实是 IBPQ , 讲了异步信号的由来是 SurfaceFlinger 由硬件和软件机制发出来的,讲了我们 app 界面绘制的内容是怎么提交传递到 SurfaceFlinger 的。GPU 调试工具几种颜色的意思也大概讲了下。

6. 说说 ConcurrentHashMap 的实现原理说下

是线程安全的,实现原理采用的是分段锁。

7. 你知道 okhttp 是怎么复用连接的吗?

这是个网络优化的问题,同一个 ip 同一个端口能复用一个连接,后面问道了 http 2.0 的多路复用,我说一个 tcp 可以多个请求,原理呢?我说不知道。后面让我说了下 https 。

8. 数组和链表的区别说下

9. 快排和递归

技术二面

1. 讲一讲动态注册和静态注册

静态注册是通过包名和函数名去找方法,动态注册是通过注册方法表,其中还被问到了具体是调用哪个函数注册方法表。

2. so 的加载流程是怎样的,生命周期是怎样的

这个要从 java 层去看源码分析,是从 ClassLoader 的 PathList 中去找到目标路径加载的,同时 so 是通过 mmap 加载映射到虚拟空间的。生命周期加载库和卸载库时分别调用 JNI_OnLoad 和 JNI_OnUnload() 方法。

3. native 层怎么检测内存泄漏

我说按道理可以 hook 函数,开辟内存和释放内存的次数应该是一样的,如果不一样可以怀疑内存泄漏。面试官接着问有没有什么第三方工具或者库可以检测?我说我在公司其实也写的不多,不知道引擎组集成的是啥框架,主要擅长应用层开发。

4. leakcanary 的原理,哪些对象可以用来做 gc-root

好,你说你主要擅长应用层开发,那 Java 层的内存泄漏怎么检测,我说我们用的 leakcanary,让我说说原理,说完原理又问我是不是所有对象泄漏 leakcanary 都能检测得到,他的引用链是怎么管理的?后面问到你刚说弱引用对象在 gc 的时候会被释放,那什么时候不会被释放?我这时懵逼了,其实就是有内存泄漏的时候不会被释放,我当时脑子短路了居然没反应过来。

5. ui 怎么优化的?

我主要从底层讲了一下 UI 刷新机制的流程,又把一面的 SurfaceFlinger 底层机制讲了一遍,原理搞清了就可以做很多优化,巴拉巴拉说了一大堆,最后讲了怎么去监听 UI 卡顿。

6. 线程耗时卡顿怎么监听的?

主要用工具去检测,当时只提到了 systrace + 函数插桩的方式。

7. 说说你看的 Tinker 的原理?

8. 你遇到的最难解决的问题?

我说我们公司项目没有采用动态加载框架,但是后面集成 U3D 项目需要动态加载,但只需要用到 so 和资源动态加载,功能上第三库也不支持我们的需求,我就自己硬着头皮看了各大版本的源码,支持动态修复替换加载 so 和 assets 资源动态修复加载,然后把具体的细节说了一遍。

9. 常见数据结构你都熟悉哪些?不是本专业算法你是怎么学的?

数组,链表,堆,二叉树,队列,栈,平衡二叉树,红黑树,霍夫曼树,图。自己看书算法通过刷题,这里没具体问算法细节。

10. 线上有人反馈问题你一般怎么处理的?

开发过程中记录关键日志,线上获取用户日志来分析。

公司五(Offer)

面试机会来自于V2EX

一面

  • 如何开启多进程?应用是否可以开启N个进程?
  • Activity的启动模式、任务栈以及使用场景?
  • Volley能否进行数据量很大的请求,比如说加载100M的图片?
  • 手写快速排序
  • Volley的优缺点
  • final修饰一个对象,能否调用对象修改属性的方法
  • 子线程中如何使用Handler
  • 如何进行单元测试,如何保证APP稳定。

二面

  • TabLayout如何设置指示器的宽度包裹内容?
  • 公差为1的等差数列求和,如何优化
  • 自己的优势在哪里
  • 注解如何获取,反射为何耗性能?
  • Java的GC机制,分代回收策略
  • Binder机制:ServiceManager什么时候注册的?
  • int,long的取值范围以及BigDecimal,数值越界了如何处理?
  • ConcurrentHashMap的原理,分的段数是多少?
  • APP是如何适配的?
  • Android中如何查看一个对象的回收情况?
  • 最大一次线上Bug处理措施

三面

  • APK的大小如何压缩
  • APP的崩溃率,多渠道包
  • 自己做过的APP用户量
  • 能否接受加班

面试之外

上面说地都是一些硬实力,经过这一次的被动面试经历,下面简单说些自己在面试过程中总结的一些面试之外需要注意的东西:

一定不要裸辞

如果是裸辞找工作,HR 一般都会问什么时候离职的。如果手里没有 Offer,就很被动了,很有可能被压薪资。主动权一定要掌握在自己手中。

选择大于努力

即使很努力如果方向错了就是浪费时间,就像我选择了小程序就是个错误(大前端坑太多,入坑需谨慎)。我的建议是多深入研究一些以不变应万变的技能。

学历与履历

虽然说能力很重要,但学历是敲门砖(HR 就看这个)。如果连面试机会都没有,还怎么谈然后?如果学历不突出有很好的大厂履历也很不错,貌似是个蛋生鸡,鸡生蛋的问题。

充分准备

一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,所以努力让自己成为高级工程师才是最重要的。

好了,希望对大家有所帮助。

最后

说了这么多,但是最重要的还是那句话,面试跳槽加薪虽然是我们每个人都所期待的,但是你也要有与之相对的能力,如果你没有,千万别浪费了我们两个人宝贵的时间,望谨记!

通过上述面试中提到的一些问题知识点和网上收集的一些 Android 往年面试题进行了整理,并找出了对应的参考答案,耗时72小时最终将它们整理成了PDF文档。因文章篇幅长度限制,暂且只能用图片形式展现,如有参考学习的可以直接去我 【GitHub】 参考查阅,望这些干货能够帮助到大家!!!

GitHub地址:  
https://github.com/733gh/Android-T3 

标签:已收,Java,Offer,面经,面试官,面试,算法,Android,加载
来源: https://blog.csdn.net/weixin_55362248/article/details/123584167

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有