文章

阅文集团面试记录

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

activity启动流程

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 执行的过程中被中断 可见性:一个线程对共享变量的修改,另外一个线程不能立刻看到 有序性:程序执行的顺序没有按照代码的先后顺序执行

本文由作者按照 CC BY 4.0 进行授权