其他分享
首页 > 其他分享> > 三年android经验面经,安卓app启动速度优化

三年android经验面经,安卓app启动速度优化

作者:互联网

  1. 滑动窗口如何实现?
    –> 滑动窗口的实现主要是把发送内容分成几部分,然后边确认边发送,发送窗口就逐渐往前滑动了,接收方同理
  2. start和run的区别?sleep和wait的区别?
    –> 这种低级问题,其实我都不想回答…
  3. Thread的join方法?
    –> 使用wait来等待结果,可以设置超时,和FutureTask比较<使用Unsafe和CAS实现>(和CountDownLatch<等待事件、利用ReetrantLock实现<内部是AQS,再内部是CAS+UnSafe>>、CyclicBarrier<等待线程,底层实现和CountDownLatch相同>比较)
  4. new Integer(123)和123的区别(Integer.valueOf(123))
    –> 基本数据类型有缓存池进行优化
  5. private static 方法,子类能重写吗?
    –> private是该类可见,static是类属性,没有重写概念的(这个细讲要从class的加载切入了)
  6. Looper.loop为什么不会导致ANR?
    –> ANR的原理和基于消息的机制实现角度,可升华到底层fd
  7. dialog和activity调用getWindow获取到的对象有什么不同?
    –> 问的应该是层级问题(上家公司的UI框架应该是参考了Window管理模型的)
  8. Int可以作为线程安全的单位吗?AtomicInteger实现原理?
    –> CAS+版本记录
  9. Intent的使用中有遇到什么问题吗?如何解决大图传输问题?
    –> 传输上限、类型解析,Ashmem
  10. 双向认证的流程?
    –> 其实就是https加了个验证client端的步骤
  11. 启动模式的应用场景?
  12. 熟悉的设计模式?
  13. 异常设计?
    –> 这个需要很结合业务了,throw和throws的区别,比如sdk抛异常的时机,可以结合讲讲异常的实现原理和比if…else慢的原因
  14. 如何排查内存泄露?
    –> 逐渐演进+线上监控
  15. 红黑树的实现原理?怎么染色的?
    –> 当时确实记不清了,重点是颜色翻转+临时4节点+二三树+(LL、LR、RL、RR)
  16. 说下常见的排序算法?
    –> 冒泡、插入、归并、快速的实现
  17. 说下常见的集合类?
  18. 说下JVM的特性?
  19. 浏览器输入一个url点击发送后发生了什么?
  20. 如何显示一张大图?
  21. 一些多线程和JVM的问题
    —> 这两个算强项了,不打断能讲很久
  22. 线程池的实现原理?里面的队列有了解过吗?

2. 开源库

  1. ARouter原理,拦截器怎么实现的?
    –> ARouter核心是apt注解生成路由信息,调用init进行初始化,使用navigation进行跳转。拦截器可以实现未登录功能统跳,也是路由功能的(ARouter第一次接触,之前公司的路由框架是自己写的)
  2. okhttp原理,有没有自定义过拦截器,遇到过什么问题?
    –> okhttp的亮点在于其拦截器,提了下域名收敛优化,自定义拦截器实现了日志打印,拦截器分为响应前和响应后两大部分,注意一下应该不会有问题。最近帮其他人解决了一个双认证的final问题。
  3. glide的缓存策略
    –> 内存缓存(正在使用的用弱引用,不在使用的用LRUCache)+磁盘缓存(可设置缓存类型)

3. 项目相关

  1. 项目中的亮点和难点?工作中对自己感觉提高最大的?
    –> 印象比较深的是启动优化和埋点
  2. 埋点实现,如何去除多余的业务埋点,有没有了解过无痕埋点和全埋点?无痕埋点如何加入业务数据。
    –> 可以从埋点的演进(域名收敛、结合页面切换、环境切换脏数据、双周期、统一管理实时、mmap+fd)、之前上报策略的问题和当前埋点现状来切入,无痕埋点加入业务数据可以采用脚本化应对产品到易变需求(提了下lua)

4. 发散性问题

  1. 未来的规划?
  2. 如何像一个不懂技术的说明白什么是多线程?
    –> 考验语言表达能力
  3. 同一项任务再做一次,你会如何执行?
    –> 考验复盘总结能力
  4. 写几个Sql
    —> 这个其实不是我强项,我是发散学习过数据库的实现和一些相关注意点,希望以后能够提供一些优化思路(确实会有,数据库相当于一个非常成熟的框架,也是一步步优化过来的,而且发现优化相关有三条线,一是不断演进,二是不断侵入底层<毕竟最终都是实体,线程调度实际上也是为了IO>,三是需要结合不同场景调度不同策略)
  5. 遇到问题怎么解决?

其实没什么好分享的,虽然本来是抱着不进大厂以后就不走技术路线的想法准备的。刷了好几个framework、算法数据结构相关课程,梳理了多线程相关、JVM相关,也刷了一些leetCode等,而且一直工作认真负责,不断思考找突破点,不断跟进优化和埋点,差一步入C和OS,真的只是差一个看对眼的机会(不是自恋,这点信心还是有的,可以说只要不恶意刁难和我脑子不断路,难倒我的不多)。

原计划(本来是抱着不进个叫的出名字的公司就不打算走技术路线的心准备的):
小公司热身 --> 拿几个可以的备用offer --> 试一试杭州的大厂 --> 不行,试试上海的 --> 再不行,试试北京的 --> 再不行,南下

但是,后面发现其实路子走窄了,应该备用和大厂面试组合着来的,大厂面试流程久,一直不敢投(原谅一个2020年到现在还没拿到一分钱工资的小Android的内心惶恐,怕上半年就稀里糊涂过了,要恰饭的嘛)

现在先找个离家近的,也比较稳的站稳脚跟(一是安全,二是稳,我觉得后面会越来越难了)。接下来抽时间整理整理现在的知识体系,然后继续挖深深度,遗憾的是这次没冲大厂,而且现在很累,想缓一缓,有机会直接去冲高级。运气也是很重要的一项因素,继续努力,为了早日加入大厂写代码,老了以后在大厂搞保洁。

最后

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。

所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。

如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。以上知识笔记全部免费分享,如有需要获取知识笔记的朋友,可以点击我的GitHub免费领取。

标签:拦截器,实现,安卓,面经,--,缓存,大厂,android,埋点
来源: https://blog.csdn.net/wqwq_22/article/details/122771122