阅文集团面试记录
0、自我介绍
1、App启动流程
https://www.jianshu.com/p/c95c208774c2
https://juejin.cn/post/6844904116561379341
https://www.jianshu.com/p/c95c208774c2
启动进程
点击图标发生在Launcher应用的进程,startActivity()函数最终是由Instrumentation通过Android的Binder跨进程通信机制 发送消息给 system_server 进程; 在 system_server 中,启动进程的操作由ActivityManagerService 通过 socket 通信告知 Zygote 进程 fork 子进程(app进程)
开启主线程
app 进程启动后,首先是实例化 ActivityThread,并执行其main()函数:创建 ApplicationThread,Looper,Handler 对象,并开启主线程消息循环Looper.loop()。 创建并初始化 Application和Activity ActivityThread的main()调用 ActivityThread#attach(false)方法进行 Binder 通信,通知system_server进程执行 ActivityManagerService#attachApplication(mAppThread)方法,用于初始化Application和Activity。 在system_server进程中,ActivityManagerService#attachApplication(mAppThread)里依次初始化了Application和Activity,分别有2个关键函数:
- thread#bindApplication()方法通知主线程Handler 创建 Application 对象、绑定 Context 、执行 Application#onCreate() 生命周期
- mStackSupervisor#attachApplicationLocked()方法中调用 ActivityThread#ApplicationThread#scheduleLaunchActivity()方法,进而通过主线程Handler消息通知创建 Activity 对象,然后再调用 mInstrumentation#callActivityOnCreate()执行 Activity#onCreate() 生命周期 布局&绘制 源码流程可以参考Android View 的绘制流程分析及其源码调用追踪
至此,应用启动流程完成。
作者:天才木木木木 链接:https://juejin.cn/post/6844904116561379341 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2、Activity启动流程
https://blog.csdn.net/u013872857/article/details/106923541
3、JVM虚拟机内存区域,怎么判断对象是否可回收,GCRoot包括哪些
4、类的双亲委托机制
5、热修复原理,怎么热修复so,资源文件之类的
6、Arouter原理
7、HashMap原理,扩容原理,有冲突后的get()获取值
https://blog.csdn.net/carson_ho/article/details/79373026
https://blog.csdn.net/qq_36520235/article/details/82417949
https://github.com/zxiaofan/JDK/blob/master/JDK1.7/src/java/util/HashMap.java
8、后续遍历二叉树
9、协程和Java的多线程的区别
10、你最擅长什么
11、retrofit动态代理怎么实现的,怎么通过注解创建的
12、用什么工具检测的内存泄漏,leakcanary检测内存泄漏的原理
13、如何保证线程安全,都有哪些方法,volatile和synchronize的区别
http://www.jasongj.com/java/thread_safe/
Lock锁,synchronized关键字,volatile
导致线程不安全的原因,主要有三点:
原子性:一个或者多个操作在 CPU 执行的过程中被中断 可见性:一个线程对共享变量的修改,另外一个线程不能立刻看到 有序性:程序执行的顺序没有按照代码的先后顺序执行