一面
- 最近两个月在字节实习你主要是在负责那些业务
- 你负责的主要是UI还是框架需求
- 你现在kotlin用的多吗
- 你了解协程吗,和线程有什么区别,非阻塞式挂起?
- Android里面有一个消息队列,它怎么去监听有没有新的消息过来?
- nativePollOnce以及nativeWake的原理?cpp层的原理是什么?
- 安卓跨进程有了解吗?用的是什么?通常跨进程通信我们肯定不是直接用Binder,我们用的是那些方式呢?
- 启动service有几种方法?startForegroundService 和startService有什么区别?进程优先级?分为几种?
- 不是 startForegroundService 有没有可能是前台进程?
- activity 的几种 launchMode 说一下?如果让应用跑到单独的task除了设置 launchmode 还需要做什么?
- 你不是计算机专业,计算机相关东西是自学的吗?你一般通过什么样的方式来学习技术?
- 你在 Github 上面那些项目是自发做的吗?
- 你对安卓底层结构有了解吗?dex 的结构有了解吗?你了解字节码插桩吗?
- dagger 了解吗?你为什么不使用 dagger 而要操作字节码呢?
- 通用的跨平台界面绘制(Skia),Android 的绘制流程你了解吗?SurfaceView/TextureView 和普通的 View 有什么区别?
- Okhttp 连接复用讲一下,移动客户端上,针对 DNS 有什么优化呢?
- 你对前端(网页)渲染流程了解吗?
- 进程闪退怎么获取到闪退栈呢?主线程卡 5s 一定会导致 ANR 吗,自己通过代码去找到 ANR 的信息进行上报有没有手段呢?
- 进程直接传数据可以怎么传?如果让你做一个 ContentProvider,应该怎么做,你的应用有一个文件,你需要传递给别的应用,应该怎么传递?
- ThreadPool 的几个属性?corePoolSize,maxPoolsize,alivetime
- 每个线程在虚拟机中有个栈的概念,每个方法都是一个栈帧,那你知道每个线程占多大空间吗?为什么?
- 你一般用到的性能调优的工具是什么?LeakCanary 原理?
自己的一些解答:
- 启动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)
- 发生 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 整体响应较慢.
- 捕获 Java 层异常可以使用 Thread.setDefaultUncaughtExceptionHandler
- 设置 singleTask 也不一定能到单独的 task, 事实上需要设置不同的 taskAffinity, 但是默认情况下 activity 的 taskAffinity 是应用包名, 所以会跑到单独的 task, 但我们如果想在应用内启动多个 task, 我们就需要给 activity 设置其他的 taskAffinity, 这一点类似于各种 app 的小程序, 我们会发现各种 app 的小程序其实是跑在了单独的 task
二面
- 你在字节这实习了两个月 快三个月了 你主要负责了那些需求, 那些需求上线了, 能给我简单介绍一下吗
- 你遇到了哪些问题? 你是怎么解决的?
- linux 系统中线程和进程的区别, 他们之间是怎么通信的?
- Binder 的原理, 共享内存原理?
- ContentProvider 会用在那些场景呢? 怎么用呢? 如何自己写一个 ContentProvider 呢?
- 死锁产生的原因? 如何去解决死锁?
- Android App 通常有几个进程? 为什么要使用多进程? 什么时候去使用?
- Android 的数据库是用的什么东西? 为什么不用 SharedPreference? 为什么数据库性能会更好?
- 怎么去创建一个数据库, 有哪些东西是必要的?
- 数据库框架 Room 的原理是什么? 它用的是哪种注解处理器呢?
- 有哪几种注解处理器的方式呢?
- 网络连接直到打开网页的过程说一下? HTTP 里的内容? 大致结构怎么样的?
- 写网页的话会用到那些代码? 他们各自是用来做什么的?
- 现在在字节的转正进度如何了?