zfb面试

一面

  1. 最近两个月在字节实习你主要是在负责那些业务
  2. 你负责的主要是UI还是框架需求
  3. 你现在kotlin用的多吗
  4. 你了解协程吗,和线程有什么区别,非阻塞式挂起?
  5. Android里面有一个消息队列,它怎么去监听有没有新的消息过来?
  6. nativePollOnce以及nativeWake的原理?cpp层的原理是什么?
  7. 安卓跨进程有了解吗?用的是什么?通常跨进程通信我们肯定不是直接用Binder,我们用的是那些方式呢?
  8. 启动service有几种方法?startForegroundService 和startService有什么区别?进程优先级?分为几种?
  9. 不是 startForegroundService 有没有可能是前台进程?
  10. activity 的几种 launchMode 说一下?如果让应用跑到单独的task除了设置 launchmode 还需要做什么?
  11. 你不是计算机专业,计算机相关东西是自学的吗?你一般通过什么样的方式来学习技术?
  12. 你在 Github 上面那些项目是自发做的吗?
  13. 你对安卓底层结构有了解吗?dex 的结构有了解吗?你了解字节码插桩吗?
  14. dagger 了解吗?你为什么不使用 dagger 而要操作字节码呢?
  15. 通用的跨平台界面绘制(Skia),Android 的绘制流程你了解吗?SurfaceView/TextureView 和普通的 View 有什么区别?
  16. Okhttp 连接复用讲一下,移动客户端上,针对 DNS 有什么优化呢?
  17. 你对前端(网页)渲染流程了解吗?
  18. 进程闪退怎么获取到闪退栈呢?主线程卡 5s 一定会导致 ANR 吗,自己通过代码去找到 ANR 的信息进行上报有没有手段呢?
  19. 进程直接传数据可以怎么传?如果让你做一个 ContentProvider,应该怎么做,你的应用有一个文件,你需要传递给别的应用,应该怎么传递?
  20. ThreadPool 的几个属性?corePoolSize,maxPoolsize,alivetime
  21. 每个线程在虚拟机中有个栈的概念,每个方法都是一个栈帧,那你知道每个线程占多大空间吗?为什么?
  22. 你一般用到的性能调优的工具是什么?LeakCanary 原理?

自己的一些解答:

  1. 启动service可以使用 startService/startForegroundService/bindService 1-1: 启动前台进程需要申明一个 FOREGROUND_SERVICE 的权限, 前台进程也可以在 startService 之后通过 Service.startForeground(id,notification)来启动, notification 就是在通知栏显示的一条通知, 在API29之后还会有一个三参构造方法可以指定ForegroundServiceType 1-2: bindService 创建后在 onServiceConnected 中可以拿到一个 IBinder 的对象, 他的实现类是 Binder, 我们可以在 Service 中实现自己的 Binder, 然后就可以调用 Service 中的方法 1-3: Service 优先级: 前台进程, 可见进程, 服务进程, 后台进程, 空进程 1-4: AIDL 需要在 aidl 文件中定义接口, 之后在服务端创建一个服务并在 onBind 中返回接口的 Stub 对象, 之后将 aidl 拷贝的到客户端, 然后 bindService 的 onServiceConnected 中获取 IBinder 对象交给 AIDL 定义的接口解析: .Stub.asInterface(service)
  2. 发生 ANR: 主线程在一定时间内未响应用户操作, Service: 20s/200s, 广播(只针对有序广播 sendOrderedBroadcast): 10s/100s, ContentProvider 10s 2-1: 在一些方法调用时, 比如说发送一条广播的时候, SystemServer(scheduleReceiver) 通过 Binder 通知 ActivityThread 给主线程插入一条 message, 如果主线程执行到了这条 message, 则返回通知 SystemServer 结束计时(finishReceiver), 如果没收到的话 SystemServer 就会在指定时间之后触发 ANR, 发送一条 SIGNAL QUIT 给 SignalCatcher, 然后 dump 所有线程的堆栈信息. 2-2: 发生 ANR 不一定是 Handler 当前的 message, 有可能是之前的消息比较耗时, 只是到当前 message 出问题了, 也有可能是当前外界原因(低电/高温)导致的 message 整体响应较慢.
  3. 捕获 Java 层异常可以使用 Thread.setDefaultUncaughtExceptionHandler
  4. 设置 singleTask 也不一定能到单独的 task, 事实上需要设置不同的 taskAffinity, 但是默认情况下 activity 的 taskAffinity 是应用包名, 所以会跑到单独的 task, 但我们如果想在应用内启动多个 task, 我们就需要给 activity 设置其他的 taskAffinity, 这一点类似于各种 app 的小程序, 我们会发现各种 app 的小程序其实是跑在了单独的 task

二面

  1. 你在字节这实习了两个月 快三个月了 你主要负责了那些需求, 那些需求上线了, 能给我简单介绍一下吗
  2. 你遇到了哪些问题? 你是怎么解决的?
  3. linux 系统中线程和进程的区别, 他们之间是怎么通信的?
  4. Binder 的原理, 共享内存原理?
  5. ContentProvider 会用在那些场景呢? 怎么用呢? 如何自己写一个 ContentProvider 呢?
  6. 死锁产生的原因? 如何去解决死锁?
  7. Android App 通常有几个进程? 为什么要使用多进程? 什么时候去使用?
  8. Android 的数据库是用的什么东西? 为什么不用 SharedPreference? 为什么数据库性能会更好?
  9. 怎么去创建一个数据库, 有哪些东西是必要的?
  10. 数据库框架 Room 的原理是什么? 它用的是哪种注解处理器呢?
  11. 有哪几种注解处理器的方式呢?
  12. 网络连接直到打开网页的过程说一下? HTTP 里的内容? 大致结构怎么样的?
  13. 写网页的话会用到那些代码? 他们各自是用来做什么的?
  14. 现在在字节的转正进度如何了?