三年android经验面经

作者: New_X | 来源:发表于2020-02-03 23:36 被阅读0次
    去年算是入了个大坑,急需跳槽止损。年前面了两家,本想年后冲一波,谁料疫情这么严重...
    

    Part1

    1. 项目中的亮点和难点
      --> 印象比较深的是启动优化和埋点
    2. 埋点实现,如何去除多余的业务埋点,有没有了解过无痕埋点和全埋点?无痕埋点如何加入业务数据。
      --> 可以从埋点的演进、之前上报策略的问题和当前埋点现状来切入,无痕埋点加入业务数据可以采用脚本化应对产品到易变需求(提了下lua)
    3. 自定义View的流程,requestLayout和invalidate的区别
      --> ViewRoot的performTraversal切入measure、layout、draw(讲完基础,可提一提Surface的显示原理)
    4. Handler/Looper/MessageQueue关系
      --> 消息循环需要创建一个Looper并利用ThreadLocal绑定到当前线程,内部创建了MessageQueue(是个单链表结构),当前Handler通过Looper取消息,可向不同的Handler发送消息,达到线程间通信的目的(意识流的谈到了消息屏障和Choreographer)
    5. 子线程可以运行looper吗?多次looper. prepare会不会有问题?怎么进入循环的?looper.loop的关键点?消息延迟怎么实现?延时的依据是什么?为什么?
      --> 可参考HandlerThread以及基于HandlerThread实现的IntentService(可以往ThreadLocal切入,也可以往底层运行机制);注意延时是根据开机后的时间,但可能因为消息堆积造成不精确
    6. 事件分发机制
      --> 从Activity的dispatchTouchEvent切入,ViewGroup和View的onInterceptTouchEvent,onTouch优先于onClick
    7. ARouter原理,拦截器怎么实现的?
      --> ARouter核心是apt注解生成路由信息,调用init进行初始化,使用navigation进行跳转。拦截器可以实现未登录功能统跳,也是路由功能的(ARouter第一次接触,之前公司的路由框架是自己写的)
    8. okhttp原理,有没有自定义过拦截器,遇到过什么问题?
      --> okhttp的亮点在于其拦截器,提了下域名收敛优化,自定义拦截器实现了日志打印,拦截器分为响应前和响应后两大部分,注意一下应该不会有问题。最近帮其他人解决了一个双认证的final问题。
    9. glide的缓存策略
      --> 内存缓存(正在使用的用弱引用,不在使用的用LRUCache)+磁盘缓存(可设置缓存类型)
    10. 绘制为什么要二级缓冲?一级二级三级演变的原因?
      --> 和消息循环的消息堆积类似,会滚雪球(双缓冲技术是游戏开发中的一个重要的技术,也是SurfaceView和View的一个主要区别,解决解决反复局部刷屏带来的闪烁)

    Part2

    1. aspectj是运行时织入还是编译时织入?
    2. jvm编译优化是什么意思?
      --> 运行和编译时都有优化,以反射、锁的优化举例
    3. 责任链在framework里的应用?
    4. 事件分发机制
    5. 启动优化?异步了为什么还要优化?
    6. 插件化原理,换肤原理,插件化怎么实现把apk渲染成界面的?
    7. 多线程的实现方式?
    8. sp多进程?--> sp原则上是不支持跨进程的,可以借助ContentProvider实现
    9. mmkv一般不是做缓存的吗?为什么和启动优化有关系?
      --> 启动期间用到了SP,MMKV是可以无缝替代SP的
    10. 项目遇到瓶颈了吗?为什么需要进行优化,有没有特定的优化?
      --> 可从地推需要apk瘦身且三四线城市机型较老、请求质量、app启动角度入手
    11. 说下udp、tcp和socket
    12. 说下http,以及http是基于tcp还是udp?为什么?
    13. tcp的可靠性怎么保证的 --> 三次握手、奇偶校验(Checksum)、超时重传、滑动窗口(是根据tcp头信息的seq实现的,分成多部分数据)
    14. okhttp原理?
    15. sql
    16. 数组和链表的区别
    17. app点击到启动第一个activity的流程
    18. 未来的规划

    Part3

    1. 项目是MVVM还是MVP,怎么实现的?
    2. 有没有引入LiveData?
    3. 讲一下优化相关的(启动优化、内存优化、埋点优化)
    4. 有没有做过Socket和串口通信,有用过蓝牙吗?
    5. 有没有用过kotlin?协程有了解吗?
    6. 用过Flutter?
    7. 插件化、组件化、热修复?
    8. 分层架构怎么理解?
    9. 反射的原理和应用?
    10. 屏幕适配使用哪个方案?有了解过AutoSize吗?

    Part4

    1. onCreate和onPostCreate的区别(onResume和onPostResume的区别)
    2. 怎么启动一个Activity?
    3. 深拷贝和浅拷贝的区别,序列化是深拷贝还是浅拷贝? —> 序列化就是简单实现深拷贝的一种方式
    4. 贝塞尔曲线怎么实现?
    5. Activity、Window、View的联系? ---> 从Activity开始显示View切入辅以一些拓展,感觉很清晰
    6. View的绘制流程,测量模式
    7. 事件分发机制 --> 从activity切入,到View的onClick为止比较清晰
    8. Android的两个特别重要的服务是什么时候启动的? --> 以为是问的android系统启动的概览,其实问的是WMS和AMS启动,回答了为了解决依赖问题是分批分阶段启动
    9. TCP和UDP的区别?滑动窗口 --> 连接、可靠性、量级、速度、有序性;滑动窗口的实现主要是把发送内容分成几部分,然后边确认边发送,发送窗口就逐渐往前滑动了,接收方同理
    10. start和run的区别?
    11. sleep和wait的区别?
    12. Thread的join方法?--> —> 使用wait来等待结果,可以设置超时,和FutureTask比较<使用Unsafe和CAS实现>(和CountDownLatch<等待事件、利用ReetrantLock实现<内部是AQS,再内部是CAS+UnSafe>>、CyclicBarrier<等待线程,底层实现和CountDownLatch相同>比较)
    13. new Integer(123)和123的区别(Integer.valueOf(123)) --> 基本数据类型有缓存池进行优化
    14. 优化工作?
    15. 遇到问题怎么解决?
    16. private static 方法,子类能重写吗? --> private是该类可见,static是类属性,没有重写概念的
    17. Looper.loop为什么不会导致ANR? --> ANR的原理和基于消息的机制实现角度
    18. dialog和activity调用getWindow获取到的对象有什么不同?---> 查看源码,都是PhoneWindow,参数不同,activity的多了ActivityConfigCallback
    19. Int可以作为线程安全的单位吗?AtomicInteger实现原理? —> CAS+版本记录

    Part5

    1. 项目负责的部分,平时工作
    2. 工作中对自己感觉提高最大的
    3. MVC和MVVM的区别?
    4. 优化工作如何开展的?(着重启动、内存、网络、埋点)
    5. 双向认证的流程
    6. 最近解决的问题,印象深刻的?

    Part6

    1. 工作中遇到的难题?
    2. 熟悉的设计模式
    3. Activity、Window、View的关系?
    4. 自定义View的流程和注意点(怎么实现自定义View,需要重写的方法)
    5. 启动模式的应用场景?
    6. 模块化的理解?
    7. 如何排查内存泄露?

    相关文章

      网友评论

        本文标题:三年android经验面经

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