前言
一转眼,2023就过去了,金三银四又要拉开序幕,那么我们的Android程序员关于Android开发岗位的面试,大家知不知道要对哪些知识点做准备呢?
本文给大家整了一套涵盖Android所有技术栈的快速学习方法和笔记。目前已经收到了七八个网友的反馈,说是面试问到了很多这里面的知识点。
android面试java基础
【有需要面试题的朋友,可以点击下方卡片领取!!!】
常见面试题:
一、你了解 Android 系统启动流程吗?
当按电源键触发开机,首先会从ROM中预定义的地方加载引导程序BootLoader 到 RAM中,并执行BootLoader程序启动Linux Kernel,然后启动用户级别的第一个进程: init 进程。init 进程会解析init.rc脚本做一些初始化工作,包括挂载文件系统创建工作目录以及启动系统服务进程等,其中系统服务进程包括 Zygote、service manager、media 等。在 Zygote中会进一步去启动 system_ server进程,然后在 system_server 进程中会启动AMS、WMS、PMS等服务,等这些服务启动之后,AMS中就会打开Launcher应用的home Activity,最终就看到了手机的“桌面”。
二、system_server 为什么要在 Zygote 中启动,而不是由 init 直接启动呢?
Zygote 作为一个孵化器,可以提前加载一些资源,这样 fork()时基于 Copy-On-Write 机制创建的其他进程就能直接使用这些资源,而不用重新加载。 比如 system_server 就可以直接使用 Zygote 中的 JNI 函数、共享库、常用的类、以及主题资源。
三、为什么要专门使用 Zygote 进程去孵化应用进程,而不是让system_server去孵化呢?
首先 system_server 相比 Zygote 多运行了 AMS、 WMS 等服务,这些对一个应用程序来说是不需要的。另外进程的fork()对多线程不友好,仅会将发起调用的线程拷贝到子进程,这可能会导致死锁,而system_server 中肯定是有很多线程的。
四、能具体说说是怎么导致的死锁的吗?
在POSIX 标准中,fork的行为是这样的:复制整个用户空间的数据(通常使用 copy-on-write 的策略,所以可以实现的速度快)以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的对于锁来说,从 OS 看,每个锁有一个所有者,即最后一次 lock 它的线程。假设这么一个环境,在 fork 之前,有一个子线程 lock 了某个锁,获得了对锁的所有权。fork 以后,在子进程中,所有的额外线程都人间蒸发了。而锁却被正常复制了,在子进程看来,这个锁没有主人,所以没有任何人可以对它解锁。 当子进程想 lock 这个锁时,不再有任何手段可以解开了。
五、Zygote 为什么不采用 Binder 机制进行 IPC 通信?
Binder机制中存在Binder线程池,是多线程的,如果Zygote采用Binder的话就存在上面说的fork()与多线程的问题了。其实严格来说,Binder机制不一定要多线程,所谓的Binder线程只不过是在循环读取Binder驱动的消息而已,只注册一个Binder线程也是可以工作的,比如service manager 就是这样的。实际上Zygote尽管没有采取Binder机制,它也不是单线程的,但它在fork()前主动停止了其他线程,fork()后重新启动了。
六、Binder有什么优势
- 性能方面
共享内存 0次数据拷贝 Binder 1次数据拷贝 Socket/管道/消息队列 2次数据拷贝
- 稳定性方面
Binder:基于C/S架构,客户端 (Client) 有什么需求就丢给服务端 (Server) 去完成,架构清晰、职责明确又相互独立,自然稳定性更好 共享内存:虽然无需拷贝,但是控制复杂,难以使用 从稳定性的角度讲,Binder机制是优于内存共享的。
- 安全性方面
传统的IPC没有任何安全措施,安全依赖上层协议来确保。 传统的IPC方法无法获得对方可靠的进程用户ID/进程UI (UID/PID) ,从而无法鉴别对方身份。 传统的IPC只能由用户在数据包中填入UID/PID,容易被恶意程序利用。 传统的IPC访问接入点是开放的,无法阻止恶意程序通过猜测接收方地址获得连接。 Binder既支持实名Binder,又支持匿名Binder,安全性高。
七、跨进程通信的几种方式
- Intent 比如拨打电话
- ContentProvider 数据库存储数据 (底层同样也是Binder,专门用于不同应用间共享数据。支持一对多进程数据共享)
- Broadcast 广播通信
- 4 ALDL 通信,通过接口共享数据 (支持一对多通信,支持RPC)
八、多进程应用使用场景
1 需要向其他应用获取数据 2 某些应用模块需要单独运行在进程中(WebView优化,后台进程) 3 加大一个应用可使用的内存(获取多份内存空间)
九、Binder 机制 (进程间的通信)
Binder 是 Android 为我们提供的 IPC(Inner Process Commnuication进程间通信)的一种方式,Android 中的Activity 、Service、Broadcast、ContentProvider 都是运行在不同的进程中,Binder 是他们之间进行通信的桥梁。
原理:
首先要定义要传输的对象,并进行序列化,反序列化,然后在相同包名下定义 AIDL 接口、要传输的对象,然后定义 好了以后,再 makeProject ,生成对应的类,然后再创建一个 Service 写服务端的代码,然后再客户端使用 bindService 方法进行连接,再 ServiceConnection 的回调方法中拿到服务端的接口对象,之后就可以往服务端发送消息。
最后
由于面试内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2024年Android中高级最全面试真题答案 完整文档的可点击下方卡片免费领取!!!
目录

第一章 Java方面
- Java基础部分
- Java集合
- Java多线程
- Java虚拟机

第二章 Android方面
- Android四大组件相关
- Android异步任务和消息机制
- Android UI绘制相关
- Android性能调优相关
- Android中的IPC
- Android系统SDK相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面

第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?

第四章 Flutter高频面试题
- Dart部分
- Flutter部分

第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串

第六章 Andrio Framework方面
- 系统启动流程面试题解析
- Binder面试题解析
- Handler面试题解析
- AMS面试题解析

需要完整面试题的朋友,点击下方卡片即可免费获取!!!
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/2989.html