>>分享Android开发相关的技术 书籍支持  视频课程  卫琴专栏  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 6780 个阅读者 刷新本主题
 * 贴子主题:  Android安卓面试复盘 回复文章 点赞(0)  收藏  
作者:javathinker    发表时间:2020-12-27 03:46:10     消息  查看  搜索  好友  复制  引用

    

0.写在前面

(全文约4k字)

总共是面了8家,(2小,4中,2大厂)

小的都拿下了,4中里3个一轮游,1个三轮游。2大的都谈薪了。

     小公司会比较偏重于业务,面试上也偏重业务,比如做了什么,大概方案,用了哪些库,库的原理。

这些基本上会集中在 图片处理,网络封装,自定义view这几个部分。

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

或者直接问对xxx源码有没有了解。

     比如一个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.三道算法题

第一题写一个必然死锁的代码。讲一下解决死锁的方式。锁对象的不同的区别。

第一个出现的字符。

数组里的元素,组合起来求最大值。

     7.checkThread里的thread是什么时候被赋值的。

     8.讲下数字证书是什么。

     9.解决内存抖动的实际案例。

     10.降低bug的实际案例。

     11.设计一个如何处理 app接收到服务器脏数据的方案。

     12.设计一个云相册。

     13.classLoader机制的原理。

     14.硬件加速的底层实现。

15.操作系统相关问题。

16.如何处理多语言问题。

17.jvm虚拟机相关问题,具体忘了。

18.职业规划相关。

     最后欢迎大家来鹅厂,有一说一不吹牛逼,这里同事真的很不错。

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


----------------------------
原文链接:https://www.jianshu.com/p/de220733fdfa

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-12-27 22:11:05 重新编辑]
  Java面向对象编程-->图形用户界面(下)
  JavaWeb开发-->Web运作原理(Ⅱ)
  JSP与Hibernate开发-->域对象在持久化层的四种状态
  Java网络编程-->Java网络编程入门
  精通Spring-->基于WebSocket的双向通信
  Vue3开发-->创建综合购物网站应用
  Android自定义组件
  如何提高Android代码的安全性
  Android之TabHost
  用Gradle 构建你的android程序
  Android 安装实战
  Android多线程断点续传
  Roboletric+Retrofit2单元测试
  Html5调用手机摄像头并实现人脸识别
  UI渲染优化
  自定义ViewGroup和FrameLayout实现轮播图(包括底部小圆点)
  一款在Linux下运行Android应用的软件:xDroid
  程序员笔记|JSBridge框架解决通信问题实现移动端跨平台开发
  Android Service学习之AIDL, Parcelable和远程服务-学习Andr...
  Android 之不要滥用 SharedPreferences(上)
  Android中使用Activity管理类
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 kamailong 
威望: 未知
级别: 未知
魅力: 未知
经验: 未知
现金: 未知
发文章数: 未知
注册时间: 未知
 复制  引用


螺杆泵
离心泵
离心水泵
全焊接球阀
焊接球阀
化工泵
磁力泵
螺杆泵
磁力泵

上海螺杆泵
上海离心泵
直埋全焊接球阀
埋地全焊接球阀
离心泵

球阀厂
球阀
Fully Welded Ball Valve138
Welded Ball Valve182
Welded Ball Valve in china55
Fully Welded Ball Valve in china44
发文章时间 2021-01-27 13:14:30
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。