Android安卓面试复盘

作者: 普通的程序员 | 来源:发表于2020-10-09 01:09 被阅读0次

    0.写在前面

    (全文约4k字)
    总共是面了8家,(2小,4中,2大厂)
    小的都拿下了,4中里3个一轮游,1个三轮游。2大的都谈薪了。

    小公司会比较偏重于业务,面试上也偏重业务,比如做了什么,大概方案,用了哪些库,库的原理。
    这些基本上会集中在 图片处理,网络封装,自定义view这几个部分。

    大厂会从业务入手,递进深入到原理及相关知识点,尤其集中在原理部分,这里对平时源码阅读有一定要求。
    或者直接问对xxx源码有没有了解。

    结合之前的面试失败经验,就是直接起手面试一线大厂,这样的问题在,没有试错的机会,题没答好的话,没办法打磨。建议先面试几家小公司,找一找面试感觉,顺利的话是每一家都拿下offer。(防杠:不是说不尊重任何一家公司,咱们的目的是为了拿offer,每一次面试都需要认真对待)

    比如一个handler机制,因其涉及的地方特别多而且很容易展开,想完美答好,真的不是一次两次就能行的。

    建议每次面试完,都及时对面试内容进行回忆记录,目的是进行复盘,打磨自己的回答。

    目录

    • 简历书写
    • 面试原题
    • 算法刷题
    • 学习总结

    1. 简历书写

    强烈建议,把自己的强项,亮点加粗注明放在简历前面,大家都很忙,也很烦躁,让人一眼就看到优点,对双方都友好。

    因为我对安卓性能优化方面感兴趣,平时工作也花了很多时间在这里,所以我会在简历上突出说明,

    我做了内存优化,熟练掌握使用xxx,内存性能提升xxx

    (因为这里的内容是可控的,如果面试官对你感兴趣,这里的回答你也是能提早准备好的)

    项目经历如何写?建议按照是什么,做了啥,有啥数据指标佐证的方式去写。

    比如,我做了xx项目,负责xx模块,使用了xxx框架,可配合xx做xxx,效率提高xxx%

    2.面试题

    字节一轮
    1.先聊简历。

    2.聊性能优化方面的问题,我这边体系化展开讲卡顿,瘦身,内存,crash等方面的优化经验。

    3.sychronized,volatile区别?
    这里可以体系化的回答,主要从JMM角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。

    4.对于锁的对象的不同,效果会有什么差别。

    5.讲一下handler机制。
    这个问题问得太多了,一定要去看一回源码。
    重点答的是msgQueue这块,包括什么时候空闲,阻塞。
    发散讲了线程相关的threadLocal,还有IdleHanlder

    6.出了一个设计题,当你的服务商出现问题,设计一个网络请求可用性的兜底方案。
    大概从httpDNS,域名容灾等方面回答吧。

    7.设计一个方案,apk已经发出去了,java代码是最新,但是分包下发的so文件是旧版本,如何做一个兼容方案,保证兼容可用。
    这里没答好,我也忘了怎么答的了。

    8.java类加载机制。
    这是个基础概念题,没答好,回答的双亲加载机制。
    然后引出pathClassLoader,dexClassLoader的区别,一个dex的加载到一个java类的加载过程。

    9.一道算法题。

    字节二轮
    1.聊简历。

    2.性能优化,展开讲了卡顿,内存。

    3.数据结构的题,hashCode的扰动算法,涉及到一个数字,31,这个31是怎么来的?

    4.类的static属性字段,比如 public static int a = 1,被赋值几次?
    这个需要对类的加载机制有了解。

    5.多个Activity共同bind一个service,一个Activity destory,问service的情况。
    这里就是问service的生命周期,考察bind跟start的区别。

    6.装饰器模式,跟代理模式的区别。
    考察对常用的设计模式

    7.okhttp的缓存逻辑实现。
    我以为是问的 链接缓存跟io缓存,我回答的是连接池复用跟 okio的io复用。
    后来提醒是cache,就回答cacheInspector,及其源码实现。

    8.sharedPreference的commit ,apply区别。

    9.sharedPreference的其性能问题。
    apply的anr是有一个字段,会block住主线程,需要清理queuedWork队列。

    10.sharedPreference线程安全性,还有进程安全性,sharedPreference锁的对象是谁?
    sharedPreference线程安全,锁的是contentImpl.class

    11.synchornized锁对象,汇编实现。volatile的汇编实现。

    12.volatile 修饰 boolean能保证原子性么?

    13.Android有哪几种动画。

    14.设计题,设计一个埋点数据上报库,需要哪几个模块,提供哪样的接口。

    15.算法题,生产消费者模型。

    16.concurrentHashMap的相关。
    包括实现原理,put方法,树化,扩容,继承了谁,扩容的时候,其余桶怎么感知。

    17.安卓打包签名v1,v2,v3的区别。

    字节三轮
    1.装饰器模式,适配器模式区别。举个Android或java里的应用例子。

    2.单例的优缺点。

    3.架构有做过么。

    4.说一下项目,项目中最能提现你能力的事情。

    5.平时怎么学习的。

    6.以后的职业规划

    7.离职原因

    8.插件化,做过插件化么,了解的主流方案?

    9.算法题。

    因第三轮挂了,捞出来换岗位再战。

    字节一轮(这轮面了175分钟,记忆深刻)
    1.聊聊平时做过的性能优化。

    2.界面卡顿
    从viewStub源码开始谈layoutInflate的整个过程
    包括xml的解析,如何解析tag,细节到里面哪些特殊tag。

    3.xml的解析耗时在哪些方面,反射,读文件,解析。

    4.如何优化这个过程:xml在编译期就生成为class文件,那这是gradle编译的哪个阶段做这个事情。

    5.checkthread的问题,从window到viewrootimpl的创建,几者之间的关系。

    以上这是绘制相关,然后是渲染。

    6.矢量图的原理。

    7.canvas怎么来的。

    8.window跟view的关系。

    9.硬件加速原理。

    10.双缓冲机制。

    11.丢帧的原因。

    12.帧数计算。

    13.设计如何检测过度绘制的工具,要具体到view。

    14.blockcanary原理,目的。

    15.listview的滑动优化,比如一个kmoji可以用textview渲染,也可以用imageview渲染,哪个更优。

    16.toast为什么不需要权限就可以显示。

    17.badwindowtoken的原因。

    18.怎么实现悬浮窗。

    启动加速
    1.怎么做app启动加速
    我的回答说利用intentService,就是异步加载机制。但是还不够。

    2.引导我从app启动流程开始讲一遍,看从启动流程上能不能找到方法。

    3.zygote的内部实现,zygote.fork有没有了解。

    4.zygote跟ams的通信方式用的是什么。

    5.整个启动过程中,mHandler做哪些事。

    6.设计一个工具,监控启动时间,粒度要求在方法级别。

    内存相关
    1.讲下内存泄露。以handler匿名内部类做例子讲。泄露链是怎样的。

    2.looper.prepare干了啥。

    3.threadLocalMap的实现。

    4.leakcanary原理。

    5.为什么要做抖动的检查,有啥用,

    6.为什么会出现抖动。

    7.线上有泄露,怎么收集,排查,设计方案。

    稳定性
    1.解决线上稳定性bug的方法论。

    2.讲个能体现亮点的解决线上bug的案例。

    3.给了一个具体案例,让我现场分析原因。
    主要考察思维方式吧。

    4.怎么收集java的crash。

    5.怎么收集native的crash。

    6.用线程安全的数据结构,concurrentHashMap会出现modifyCountException么?

    ANR相关
    1.常见的anr问题怎么解。

    2.不常见的anr,比如 msgQueue.nativePollOnce都很正常,怎么去定位,如果是线上,怎么去收集。

    3.anr的原因

    4.intentService会anr么,讲内部实现。

    保活相关问题
    1.杀进程机制的源码。

    2.进程优先级。

    3.怎么提升优先级。

    4.常见的保活手段。
    我这里着重讲了Tim的保活原理。还有第三方库Leonic的原理。

    APP瘦身相关
    1.andRes原理。

    2.proguard源码。

    3.Facebook 的redex,字节的bytex原理。

    4.multidex原理。

    5.很多资源包,如何瘦身。

    问了一下我自己维护的github库相关问题
    1.防多开原理

    2.检测模拟器原理

    3.查root权限,如果是自编的rom怎么处理。

    聊了下简历里的经历
    1.contentProvider的初始化时机。
    这里主要是问我LeakCanary1.* 跟2.*有啥不同引出的问题。

    2.LocalBroadCast 和broadCast的区别。

    3.xposed的原理。

    4.beforeMethodHooked,xposed内部做了什么事

    5.免root hook框架 legend的源码实现。
    记不太清,好像我说的是native方法指针的变更。

    6.一道算法。

    7.设计一个埋点库。
    需要哪些模块。

    8.设计一个组件,统计activity的前台时长,fragment的前台时长。

    字节后续的面试我忘了记录复盘了,现在也记不住了。这一轮面试反正是把我榨干了。

    最后进入谈薪阶段。只不过没谈拢,哈哈。


    最后就是我一直想去的南山必胜客了。

    腾讯一轮
    1.聊简历,性能优化。

    2.view的绘制流程,尽可能越详细,越全面越好。
    因为有了字节之前的面试经验,这里聊了很多view相关的。
    大概从ActivityThread讲起,到window,windowManager,viewRootImpl,
    setContentView内部实现干了什么,layoutInflator
    下发到requestLayout,performShechdules,checkThread,绘制屏障消息
    双缓冲,sync信号,最后再performOnMesure,layout,draw。

    3.问网络优化,当网络带宽足够大,信号足够好,下载大文件,怎么快?
    开多个链接,wifi+4G同时,分片下。
    协议层 ,udp去下,本地做完整性校验,我记得qq客户端时这样做的。
    m3u8的思想去下。

    4.apk安全措施,当apk已经被破解了,怎么处理?
    我回答借助v1签名思想,本地做对文件md5的校验。或者借助v3的思想,连续签名。

    5.两个设计模式的区别。具体哪两个我忘了。

    6.三道算法题
    第一题写一个必然死锁的代码。讲一下解决死锁的方式。锁对象的不同的区别。
    第一个出现的字符。
    数组里的元素,组合起来求最大值。

    腾讯二轮
    当时忘记复盘记录了。就记得有两个算法。
    (拿之前面的二轮顶一下。反正二轮也是集中在基础原理的考察)

    1.fresco glide图片框架对比。
    2.lru的实现方式。
    3.内存复用怎么做。
    4.视频音频的处理。
    5.进程通信,binder机制。
    6.线程管理,线程池。
    7.核心数与cpu的关系。
    8.okhttp的内部实现。工作流程,线程池。
    9.java的gc区别。
    10.两种序列化方式的比较。
    11.图片内存占用的计算及优化。
    12.recyclerView缓存机制。
    13.davik/art虚拟机区别。

    腾讯三轮交叉面
    1.子线程操作view怎么实现的。
    2.checkThread里的thread是什么时候被赋值的。
    3.viewStub源码。
    4.handler机制。
    5.https的原理。
    就正常的非对称方式协商对称加密方法。
    6.讲下数字证书是什么。
    7.解决内存抖动的实际案例。
    8.降低bug的实际案例。
    9.设计一个如何处理 app接收到服务器脏数据的方案。
    10.设计一个云相册。
    11.忘了有没有算法题了。

    腾讯四轮
    1.https原理。
    2.classLoader机制的原理。
    3.硬件加速的底层实现。
    4.线程本地变量的核心。
    一开始没听懂问题,但是后来引导是要回答LocalTheadMap,尤其是这个数据结构的实现是怎样的。
    5.操作系统相关问题。
    6.如何处理多语言问题。
    7.jvm虚拟机相关问题,具体忘了。
    8.职业规划相关。

    3.算法题

    多说两句,客户端要学算法,不是说算法没用,你知道什么叫树的遍历你就能理解viewTree解析过程。
    而且在大家层次不齐的情况下,用算法打回同一层次,看看谁的逻辑性强,代码书写风格好,这是对面试筛选有好处的。
    谁都会说,买菜要用高数嘛?但是人家会你不会,那就是在面试上吃亏。

    正题,我的刷题路程
    剑指offer来入门
    https://cyc2018.github.io/CS-Notes/#/README

    里面有很多题,你在力扣评论区可以看到各种解法,建议多看各种解法,体会不同的思路
    https://leetcode-cn.com/problemset/algorithms/?difficulty=%E7%AE%80%E5%8D%95

    然后我推荐的是我头条朋友的刷题笔记(可能近期三到五年内都不会更新了)
    https://juejin.im/post/6844904012987236359

    刷题的方式,一定要自己动手写代码,调试,运行。
    可以自己创个小库,督促自己提交。
    https://github.com/lamster2018/DailyLeetCode

    也顺便把常见的设计模式复习了
    https://www.runoob.com/design-pattern/design-pattern-intro.html

    http://c.biancheng.net/design_pattern/

    差不多刷完了基本的排序,遍历,贪心,局部最优等思想,也就有个一百来道题了。
    此时面对面试,也就有个眼熟了。

    4.学习总结

    我把锁相关,线程相关,handler机制等知识,以题目入手,递进发散的方式做了一个平时我学习的索引。
    Android线程学习索引
    https://www.jianshu.com/p/fb07e8b77eb1

    我把常见的数据结构,分析源码写得比较好的文章,归纳了一个索引
    Java学习索引
    https://www.jianshu.com/p/384ab2f83c60

    接下来就是深入到app启动,绘制渲染,AMS等问题做了一个集中索引
    Android framework学习索引
    https://www.jianshu.com/p/1a333fa8e42d

    然后是网络
    Android 网络学习索引
    https://www.jianshu.com/p/2100897f6670

    我自己的Android源码阅读
    https://www.jianshu.com/nb/35261090

    我写的面向面试的阅读第三方库笔记
    https://www.jianshu.com/p/6fa13048a6cf

    相关文章

      网友评论

        本文标题:Android安卓面试复盘

        本文链接:https://www.haomeiwen.com/subject/fosmwftx.html