号外!号外!抢先看“金九银十”全网第一手Android客户端面经 ,阿里面试官被我怼的有点绝望啊...

背景

笔者是双非一本学硕、计算机专业毕业的,17年毕业后一直就被父母安排在了国企,在国企工作了三年,每日朝九晚五、日子过得很平淡,几乎没有什么波动。而工作的这三年,每日浑浑噩噩的上下班,突然有一天意识到这不行,觉得一眼望去看到尽头的人生是我想要的吗?

我虽然没有什么很大的奢望,但是这一眼看到尽头的人生实在是太无趣了,毫无未知感!心中第一次燃起了对互联网大厂的期待,在跟父母的交谈达成一致后,5月份辞职后就在家复习从**阿里技术博主收集来的823页Android核心知识笔记。

没有人打扰的复习往往是最有效率的,三个月复习沉淀通关后,我便从丽水来到了杭州,这一个多月下来,面试的互联网公司就有接近十家,有阿里、网易、蘑菇街、有赞、同花顺、丁香园、趣拍等等,终于皇天不负有心人,给出offer的也有4家。十家互联网公司当中属网易、阿里、蘑菇街的**面试质量是最高的,问的题目深度也非常深...

二、建议:技术储备/面试复习

基础

不管是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,如果面试官想要你,那么他会去找你的优点,反之他会去找你的缺点。

所以如果你想进某家公司,那么你就按照他们的要求去面,就算面不上那么也没什么,只能说不合适,然后查漏补缺继续面,不要因为某一次或者几次的不顺就否定自己。

三、Android客户端面经记录(已拿offer)

网易(已拿offer)

  • 一面:
  1. 项目介绍
  2. 如何开启多进程?应用是否可以开启N个进程?
  3. Activity的启动模式、任务栈以及使用场景?
  4. Volley能否进行数据量很大的请求,比如说加载100M的图片?
  5. 手写快速排序
  6. Volley的优缺点
  7. final修饰一个对象,能否调用对象修改属性的方法
  8. 子线程中如何使用Handler
  9. 如何进行单元测试,如何保证APP稳定。
  • 二面:
  1. TabLayout如何设置指示器的宽度包裹内容?
  2. 公差为1的等差数列求和,如何优化
  3. 自己的优势在哪里
  4. 注解如何获取,反射为何耗性能?
  5. Java的GC机制,分代回收策略
  6. Binder机制:ServiceManager什么时候注册的?
  7. int,long的取值范围以及BigDecimal,数值越界了如何处理?
  8. ConcurrentHashMap的原理,分的段数是多少?
  9. APP是如何适配的?
  10. Android中如何查看一个对象的回收情况?
  11. 最大一次线上Bug处理措施
  • 三面:
  1. APK的大小如何压缩
  2. APP的崩溃率,多渠道包
  3. 自己做过的APP用户量
  4. 能否接受加班

阿里巴巴(已拿offer)

  • 一面
  1. 项目经验
  2. Binder机制
  3. ClassLoader的理解
  4. Arouter的原理
  5. 组件化原理,组件化中路由的实现
  6. 热修复跟插件化的原理
  7. 线程池的几个参数的理解,四种线程池的使用场景
  8. 常用的设计模式,手写DCL单例模式
  9. 进程间为什么不能直接进行通信
  10. 应用跟系统之间通信什么时候用Socket什么时候用Binder
  • 二面
  1. 数据库的升级,表结构的修改
  2. 常见的排序算法,手写二分查找,二分查找的复杂度分析
  3. 点击APP图标启动APP的大致流程
  4. SplashActivity中进行初始化MainActivity的参数,Splash没有初始化,AMS直接启动了MainActivity怎么办
  5. 设计一个多线程,可以同时读,读的时候不能写,写的时候不能读(读写锁)
  6. 设计断点续传,如何判断服务端是否支持断点续传
  7. Binder机制:Binder内核所在的进程是如何找到到Server跟Client进行通信的
  8. 对JNI是否了解
  9. 组件化的原理,组件间通信
  • 三面
  1. 为什么重复造轮子,自己去设计一些框架的原因
  2. 如何保证线上项目的稳定性
  3. 自己之前做的项目的规模
  4. 聊了聊他们目前在做的项目

蘑菇街(已拿offer)

  • 一面
  1. 深拷贝浅拷贝
  2. 输出一个集合{A,B,C,D}的全部子集
  3. 自定义View及注意事项
  4. 如何自动化部署打包发包流程
  5. JNI是否了解过
  6. 内存回收
  7. classloader
  8. 对热修复以及插件化了解多少
  9. 微信支付宝支付调用时上层是如何封装AIDL的
  10. 如何给一个app瘦身
  • 二面
  1. 如何实现一个推送,极光推送原理
  2. 说说Http协议,以及Tcp/Udp
  3. 常见的设计模式,如何实现一个观察者模式,如果需要有序通知观察者,该如何操作
  4. 实现一个图片加载框架应该考虑哪些
  5. 线程池有哪些参数,应该如何设计
  6. 性能优化是如何做的
  7. Java为什么要推出HashMap,它是如何解决hash冲突的
  8. JVM内存分配,编码时如何注意内存泄露
  9. Binder机制原理

趣拍(已拿offer)

  • 一面
  1. 自我介绍
  2. 自我介绍时说过自己看过EventBus源码,然后让我谈谈事件总线的理解。
  3. EventBus会有什么问题吗?
  4. EventBus、接口回调、观察者模式的使用场景说一下。
  5. 项目什么地方用到数据的持久化,说一下。
  6. Activity的生命周期,弹出dialog和一个activity的dialog生命周期有什么区别?
  7. Activity的启动模式,应用场景,然后举了很多微信的场景,让我去选择用那种启动模式,说下理由。
  8. Activity进程的优先级。
  9. 如何防止微信不被系统杀死?
  10. service两种启动模式,区别
  11. 两种启动模式,如果我在退出Activity的时候没有退出service会怎么样。
  12. 设计一个图片浏览框架,(线程池,lru缓存,brabra的说了一堆)。
  13. 有一个很大很大的图片加载到内存上,不能降低清晰度和压缩图片你怎么解决?(提示我局部显示?我没懂)
  14. 如何适配不同厂商的手机,然后设计模式,brara又说了一大堆,最后还说到jetkins自动部署上面去了
  15. AsyncTask源码分析,每个方法在哪个线程执行的
  • 二面
  1. Activity的加载模式?什么时候会用到singleTask?
  2. Handler机制?
  3. 一个线程是否只有一个Looper?
  4. 如何保证一个线程只有一个Looper?
  5. 多线程的方式有哪些?
  6. ANR异常发生条件?如何分析ANR?
  7. 自定义View和ViewGroup
  8. 事件处理
  9. GC算法
  10. 四大引用
  11. 动画
  12. Dalvik和Art区别?(Just In Time和Ahead Of Time)

后话

其实对于程序员来说,要学习的知识内容、核心技术有太多太多,要想在面试中不被淘汰就只能提前做好复习规划、在学习中不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

附上我从阿里技术博主获取到的学习提升的资料、书籍,其中我把面试应学习的Android核心技术整理成了PDF共计823页(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。笔记所包含的全部Android知识点已经上传至————我的【Github】,大家需要阅读、下载的可以去我的【Github】阅读下载,如果对你有帮助的话别忘记来个Star!!!

Android面试学习视频

总结

复习学习的重要性我不想再去强调,现在几乎稍微有点规模的公司,社招面试深问Android基础技术栈那是无需质疑的。其实对于程序员来说,要学习的知识内容、技术有太多太多难点,如果要想不被面试淘汰就只能提前做好复习规划、认真刷题,在学习中不断提升自己。

《Android核心知识笔记》一来可以帮你查漏补缺,提升档次到精通,一来帮你快速上手实战。

相信,你离成功面试大厂又近了一步!

注:文章中所免费分享的①《Android核心知识笔记》+②《Android面试学习视频》,可以去————我的【Github】阅读下载,也可以点击我头像私信我【666】免费获得免费下载地址。

猜你喜欢

转载自blog.csdn.net/qq_39477770/article/details/108752965