2022面试经-腾讯QQ社群Android开发

319 阅读5分钟

岗位JD:

工作内容:

  1. 负责支撑QQ社群Android日常需求开发;
  2. 参与QQ社群Android基础建设工作。

任职要求:

  1. 本科及以上学历,计算机相关专业;
  2. 2年以上Android开发工作经验,具备扎实的Java/kotlin语言基础;
  3. 熟悉系统控件、内存管理、动画、多线程、网络优化、数据库、XML/JSON解析等,熟悉常见数据结构、算法和设计模式、TCP/UDP协议网络编程;
  4. 有一定性能优化相关经验。

面试方式

腾讯会议,视频面试,需要摄像头,可以共享屏幕,需要Android studio码代码

面试时间构成

2小时=40分钟项目经验 + 25分钟android基础 + 15分钟koltin基础 + 30分钟算法题目 + 10分钟答疑

项目经验

个人情况:

在OPPO,荣耀待过,偏向系统应用

业务方向:框架开发

面试问到的内容:碰到的技术难点,用户反馈分析,内存优化,你做的业务范畴,JNI接口调用,方案如何选型

Android 基础

1. 线程池的基础接口,使用,如果明确核心线程数

线程池的优势
通过降低系统资源消耗和重复使用现有线程,从而降低线程创建和丢弃的消耗,提高系统的响应速度,在任务到达时,通过复用现有线程,无需等待新线程的创建因为如果没有限制地创建线程,则会占用过多的内存,从而导致OOM,从而导致cpu切换过度。 (cpu切换线程需要花费时间和成本)必须维护当前运行线程的现场,并恢复运行线程的现场。)。 提供更强大的功能,延迟时间线程池。

线程池涉及到多个策略:
线程创建规则策略,线程资源回收策略,线程拒绝策略,线程排队策略

《Android开发艺术探索》一书中建议:
a. 核心线程数等于CPU核心数+1;
b. 线程池的最大线程数等于CPU的核心数的2倍+1;
c. 核心线程无超时机制,分核心线程的闲置时间为4秒;
d. 任务队列的容量为128.

CPU密集型任务

尽量使用较小的线程池,一般为CPU核心数+1。 因为CPU密集型任务使得CPU使用率很高,若开过多的线程数,会造成CPU过度切换。

IO密集型任务

可以使用稍大的线程池,一般为2*CPU核心数。 IO密集型任务CPU使用率并不高,因此可以让CPU在等待IO的时候有其他线程去处理别的任务,充分利用CPU时间。

混合型任务

可以将任务分成IO密集型和CPU密集型任务,然后分别用不同的线程池去处理。 只要分完之后两个任务的执行时间相差不大,那么就会比串行执行来的高效。

因为如果划分之后两个任务执行时间有数据级的差距,那么拆分没有意义。

因为先执行完的任务就要等后执行完的任务,最终的时间仍然取决于后执行完的任务,而且还要加上任务拆分与合并的开销,得不偿失。

引用:安卓线程池面试题(java四种线程池)线程池参数值配置依据Java线程池详解

2. 跨进程通信,本质,原理,常用方式

3. Binder通信的优势,内存,线程,通信方式等

4. ANR原理,怎么解决

解答:个人理解,ANR是Android系统为了更好的用户体验,而跑出的一中异常;比如四大组件的ANR,核心原理是消息机制的调度和超时处理,它要求主线程在限定时间内做完任务处理,展示处理结果给用户,增强用户体验。

ANR大致可以分为以下四种类型:

  • Activity

InputDispatching:5秒
KeyDispatching:5秒
Activity生命周期:5秒

  • Service 前台服务20s 后台服务200s

  • Broadcase 前台广播在10s 后台广播在60s

  • ContentProvider ContentProvider超时,这里分为两种情况:
    【1】 publish时超过CONTENT_PROVIDER_PUBLISH_TIMEOUT 10s的时间,触发timeout publishing content providers,会直接kill,这一类的启动超时,有service,process,同样会触发.
    【2】 对给定的provider进行操作时,如果通过setDetectNotResponding方法给定了超时时间,例如query时超过设定的时间会触发ANR

5. 触摸事件的分发,基本接口

6. 如何实现双击

7. 内存优化,功耗优化

kotlin基础

  1. 对比java kotlin优势

  2. kotlin高阶函数,如果扩展函数,内联函数

  3. kotlin 协程

解答:参考:Kotlin Jetpack 实战:图解协程原理

  1. kotlin 协程flow

解答:参考:Kotlin Flow的介绍

算法题目

cda0ce4011611f5eca42e09b34f3e2b.jpg

参考:LeetCode的剑指 Offer 04. 二维数组中的查找

感悟:

  1. 要先和面试官沟通解题思路;
  2. 尝试多种解决方案,找出最优,比如该题目肯定要遍历的,关键怎么遍历,左上角,还是右上角,有啥差异,碰到多种情况,是否有其他解决不会面临该情况;
  3. 大厂基础都会考算法题目,平时多在LeetCode上练习,锻炼算法基本套路。