扣丁学堂之Android开发程序员面试经验(一)

2018-08-16 10:27:43 690浏览

很多同学在参加完Android培训之后都会去找工作,那么必然也就离不开面试了,今天小编就来给大家分享一下Android面试的干货吧!文章是一位同学总结的面试过程,大家可以借鉴一下。文章很长,所以分为多篇发布,希望同学们可以关注后续哦~



基础

不管是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)

面试机会来自于V2EX

一面:

如何开启多进程?应用是否可以开启N个进程?

Activity的启动模式、任务栈以及使用场景?

Volley能否进行数据量很大的请求,比如说加载100M的图片?

手写快速排序

Volley的优缺点

final修饰一个对象,能否调用对象修改属性的方法

子线程中如何使用Handler

如何进行单元测试,如何保证APP稳定。

面试官是Android的负责人,比较有亲和力,看起来比较幽默,,然后先从我的笔试题开始聊,聊地最多的是进程,他问我应用能不能一上来能不能开多个进程保活,对于这个问题我知道肯定是不能的,因为自己平时确实没有在项目中开多个进程,然后面试官态度很好地分析了下说,因为多进程首先会有多个Application,数据会被初始化多次,其次进程间通信比较麻烦,还有一个就是每个进程有单独的虚拟机,多个进程就会比较占内存,确实是这样,这些我有些印象,但是平时确实没有认真思考过这些问题,然后问我有没有用过Binder,我说只是写过几个Demo,然后面试官就说这个就不问了,就开始聊一些我简历上以及我会的东西,比如说Volley的优缺点,然后提出了一个问题说Volley能否下载电影以及加载大图片,我当时根据我看的源码说可以,因为Volley本身是不支持下载的,需要自定义Request才能实现这个功能,然后如果是读流到磁盘是没问题的,他说不行因为Volley是在内存中进行操作的,我当时跟他争了下,我说Volley原生不支持下载功能,只能自定义Request,包括上传也是需要自定义的,然后他感觉我有些不快,说读流确实是可以,但是ImageRequest去加载大图片的时候,也是在内存中读取的,这个时候就会有问题。不过我想了下确实是这样,这样的话确实会出现OOM,接着面试官就问了一个基础的问题,比如说final一般怎么用,final修饰对象的话能够调用修改属性方法等,最后让我写了个快排。

二面:

TabLayout如何设置指示器的宽度包裹内容?

公差为1的等差数列求和,如何优化

自己的优势在哪里

注解如何获取,反射为何耗性能?

Java的GC机制,分代回收策略

Binder机制:ServiceManager什么时候注册的?

int,long的取值范围以及BigDecimal,数值越界了如何处理?

ConcurrentHashMap的原理,分的段数是多少?

APP是如何适配的?

Android中如何查看一个对象的回收情况?

最大一次线上Bug处理措施

面试官问的Java偏多一下,同时也问地很深很细,关于Binder问到了一个问题就是SM是什么时候注册的,这个完问题我完全是懵逼的,然后给我出了一个算法题,就是公差为1的等差数列求和,当时我用了一个很笨的方法,就是用递归实现的,因为当时面试官不是直接说的等差数列,说的是如果输入0,返回0,如果输入1,返回1,如果大于1就依次累加,之前思维定势了,没有想到这是个等差数列,然后面试官问我能不能优化,我当时想到了高斯,然后把首尾相加,做了一步优化,后来实在是感觉没法优化了,面试官给我写出了那个等差数列的前n项和,不过当时面试官给我出了这个题目,返回值是int,我当时注意到int可能会越界,然后说应该返回long,估计是这个细节可能打动了面试官,然后我们就从int,long,到String,double以及BigDecimal,说了很多,因为之前在项目中计算价格的时候确实出现过精度丢失的情况,所以我对这块很熟,所以也聊了很多,聊到屏幕适配,ConcurrentHashMap所分的段数,最后问了我最大的一次线上Bug是如何解决的,还有在Android中如何查看一个对象的回收情况,那个确实不知道,后来想想应该通过ReferenceQueue能观察到,因为平时没有想过这个问题,所以被问到的时候很容易懵逼,不过整体表现还可以。

三面:

APK的大小如何压缩

APP的崩溃率,多渠道包

自己做过的APP用户量

能否接受加班

面试官是火币的大前端负责人,问了我一些项目开发流程上的东西,类似APK的大小如何进行压缩,如何查看APP的崩溃率,以及多渠道包,然后聊了下薪资以及能否加班等,大部分都是一些非技术性的问题,第二天火币网就给我Offer了,虽然后来我没有去这家公司,还是挺感谢这家公司的,给我后续的面试增加了很多信心。

蛋壳公寓(Offer)

面试机会来自于拉勾网

一面:

MVP如何管理Presenter的生命周期,何时取消网络请求

用过的框架及原理

天猫的Tangram布局,vLayout原理

面试官是是Android的负责人,主要是在聊自己做过的东西,然后发现我们很多技术上的观点都是相同的,比如说我们都认为任何一个框架两三句话都可以把原理说清楚,但是真正自己去实现的时候往往比这个复杂的多,我告诉他我在自己写图片加载框架的时候踩过的坑,然后面试官也说了他在使用MVP的过程中遇到的管理Presenter的生命周期过程中的探索,因为之前我的一个项目采用的是MVC,当时是用的RxLifecycle进行管理的生命周期,在MVP中我是在BaseActivity中统一把请求取消掉了,然后他说了他的解决方式,确实很有探索精神,我也学到了很多东西,最后简单说了天猫的七巧板布局,大部分还是在聊项目中的一些细节。

二面:

APP的启动流程

回形打印二维数组

Java为何引入泛型,泛型边界

常见的Java数据结构

ArrayMap跟SparseArray在HashMap上面的改进

Java的四种引用及使用场景

Webview性能优化

面试官是移动端负责人,然后问了我APP的启动流程,这个我说我没怎么深入研究过,面试官也没说啥,然后继续问了一些Java基础,Java引入泛型的原因,泛型边界,集合框架,最后问到了SparseArray以及ArrayMap。最后说到了内存回收,然后带出了GC以及四种引用,由于他们的项目中很多地方用到了WebView,所以他问了一些WebView的跟JS进行交互的问题,最后还聊到了WebView的性能优化,感觉面试官确实对WebView比较了解,不过我也觉得没什么,毕竟这块不是我擅长的地方,面试官也表示理解,然后最后出了一道算法题就是回形打印二维数组,整体来讲他们其实还是侧重于项目,也考察了基础,整体感觉他们的技术还是很好的。

GrowingIO(Over)

面试机会来自于AndroidWeekly

一面:

Binder机制

ClassLoader的理解

Arouter的原理

组件化原理,组件化中路由的实现

热修复跟插件化的原理

线程池的几个参数的理解,四种线程池的使用场景

常用的设计模式,手写DCL单例模式

进程间为什么不能直接进行通信

应用跟系统之间通信什么时候用Socket什么时候用Binder

面试官问地都是Android底层的东西,有些还涉及到了Android的Hook插桩技术,面试完,我觉得自己跟只傻狗一样,什么都不会,问了有10来个问题,唯一的两个应用层的问题由于紧张也没有答好,一个是线程池原理,一个是DCL单例少写了个非空判断,其余的问题真的是答地很水,因为前面的底层知识了回答地很不好,所以对自己应用层的发挥确实是有影响的,所以希望大家在面试的时候心态一定要平和,切记不要紧张。由于他们项目在底层采用了很多关于IPC之间的东西,所以基本上需要对底层很了解的工程师,我自己也感觉确实回答地力不从心,而且我是给他们CTO直接发的简历,突然间觉得不好意思,回答地挺垃圾的。

二面:

面试官是做IOS的,基本上是处于聊天的状态,反正聊地很开心的,然后对我评价很好,他说他不懂Android,但是能感受到我的技术好奇心,听了还是很开心的,反正基本上没怎么聊具体的技术,主要是聊了聊IOS的Hook以及热修复相关的技术,问他们是怎么实现的,因为我知道IOS在这个上面比Android要复杂一些,反正整体就是很放松。

三面:

三面是产品总监,基本上就是谈古论今了,让我说说对Android以及IOS的看法,我说谷歌未来肯定会在人工智能上干掉IOS,然后他说为什么,我说因为谷歌掌握了搜索的大数据,Android产品接入的成本低等等,然后我跟他说我希望产品在设计原型的时候需要考虑一下Android跟IOS两个平台的差异,不能一刀切,他说是应该这样,但是有很多时候需要保持平台一致性就需要做一些妥协之类,最后其实还聊到了锤子,聊了聊对老罗以及锤子的看法,产品总监说锤子的发布会每场他都会看,然后他还给他家人买了一部坚果Pro,反正想着肯定会挂掉,索性就不那么拘束了,就是一种很放松的状态。

四面:

四面是CTO面,当时有点紧张,CTO很有绅士风度,一上来主动跟我握手,当时我有些紧张,手心都出汗了,他说我是不是很热,我说是的。然后说自己从网易出来之后就开始创业了,一直是在做提高企业生产效率相关的产品,现在做的GrowingIO也是的,然后问了我很多问题,主要是我在上一份工作中的成长跟收货,未来的规划等等,以及在项目中遇到问题是如何进行团队协作的,问地很细,可以看地出来公司对这款产品非常重视,像滴滴企业版,陌陌等都是他们的客户,感觉这家公司会发展很不错,最后我也问他为什么会尝试做那么多产品而不是专注于某一款产品等等,然后他也给了详细的解答。

没有给我Offer的原因在于我的薪资可能开地过高,一面基本上是处于被淘汰的局面,但是我跟后面的面试官都聊地很好,晚上还在那儿吃了顿饭,最后CTO还跟我聊了很久,我觉得他们应该是觉得我可以培养,但是薪资要低偏高,所以就最终放弃了我,因为对于创业公司,我的薪资都开地高一些,不管结果怎么样,还是挺感谢这家公司的,希望他们发展地越来越好。

昆仑智启(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是否了解

组件化的原理,组件间通信

面试官看起来经验比较丰富,偏向于Java这一块,应该是从Java转的Android,看上面的问题其实就能够看出来,问到的Android很有深度,一上来就搞了个APP的启动流程以及AMS,那个读写锁确实不会,之前没听过,当时是要我实现这个功能,我用了很多种方法去尝试,但是最终没有达到预期的效果,然后面试官就问我知不知道读写锁,我不知道,然后他就没有再深究了,虽然这是一家小公司,但是我能感受到对一个非科班出身的程序员的尊重,再次表示感谢。

以上这篇就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持扣丁学堂,想要了解更多详情请登录扣丁学堂官网咨询或者关注微信公众号,里面有最新的扣丁学堂Android视频教程等你来看!


【关注微信公众号获取更多学习资料】

 

 

       查看更多关于“Android开发技术”的相关资讯>>


标签: Android面试 Android培训

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号