0
点赞
收藏
分享

微信扫一扫

2020上半年百度Android岗(初级到高级)面试真题全收录+解析,备战金九银十!(下篇)

版权声明:本文为博主原创文章,首发简书。未经博主允许不得转载。
https://www.jianshu.com/u/3348b92f77a4

前言

续上2020上半年百度Android岗(初级到高级)面试真题全收录+解析,备战金九银十!(上篇)

2020上半年百度Android岗(初级到高级)面试真题全收录+解析,备战金九银十!(中篇)

本文是百度2020上半年网友分享以及我个人收录的面试真题大全。并且花了大量时间为大家寻找到了最佳的答案解析。希望可以收到帮助到大家。喜欢的朋友可以点个赞支持一下,谢谢。

BATJ大厂面试真题收录大全PDF电子书已上传在石墨文档:【BATJ面试大全】需要的小伙伴自取就好了。别忘了给文章点个赞~

Android中高级

1.性能优化

1.1启动优化是怎么做的?

1.2是怎么异步的,异步遇到问题没有?

1.3启动优化有哪些容易忽略的注意点?

1.4版本迭代导致的启动变慢有好的解决方式吗?

1.5如何避免内存抖动?(代码注意事项)

1.6你在做布局优化的过程中用到了哪些工具?

1.7布局为什么会导致卡顿,你又是如何优化的?

1.8你是怎么做卡顿优化的?

1.9 你是怎么样自动化的获取卡顿信息?

1.10TextView setText耗时的原因,对TextView绘制层源码的理解?

1.11移动端获取网络数据优化的几个点

1.12关于网络优化可参照百度APP网络优化

1.13APP安全优化

1.14为什么WebView加载会慢呢?

1.15如何优化自定义View

1.16TraceView的实现原理,分析数据误差来源。

2.Android Framework相关

2.1View的事件分发机制?滑动冲突怎么解决?

2.2如何解决View的事件冲突?

2.3View的绘制流程?

2.4Android中进程和线程的关系?区别?

2.5为何需要IPC?多进程通信可能会出现的问题?

  • 静态成员和单例模式完全失效:独立的虚拟机造成。
  • 线程同步机制完全失效:独立的虚拟机造成。
  • SharedPreferences的可靠性下降:这是因为Sp不支持两个进程并发进行读写,有一定几率导致数据丢失。
  • Application会多次创建:Android系统在创建新的进程时会分配独立的虚拟机,所以这个过程其实就是启动一个应用的过程,自然也会创建新的Application。

2.6为什么选择Binder?
为什么选用Binder,在讨论这个问题之前,我们知道Android也是基于Linux内核,Linux现有的进程通信手段有以下几种:

  • 管道:在创建时分配一个page大小的内存,缓存区大小比较有限;
  • 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
  • 共享内存:无须复制,共享缓冲区直接附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
  • 套接字:作为更通用的接口,传输效率低,主要用于不同机器或跨网络的通信;
  • 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

既然有现有的IPC方式,为什么重新设计一套Binder机制呢。主要是出于以上三个方面的考量:

  • 1、效率:传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高。从Android进程架构角度分析:对于消息队列、Socket和管道来说,数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再从内核缓存区拷贝到接收方的缓存区,一共两次拷贝,如图:

而对于Binder来说,数据从发送方的缓存区拷贝到内核的缓存区,而接收方的缓存区与内核的缓存区是映射到同一块物理地址的,节省了一次数据拷贝的过程,如图:

共享内存不需要拷贝,Binder的性能仅次于共享内存。

  • 2、稳定性:上面说到共享内存的性能优于Binder,那为什么不采用共享内存呢,因为共享内存需要处理并发同步问题,容易出现死锁和资源竞争,稳定性较差。Socket虽然是基于C/S架构的,但是它主要是用于网络间的通信且传输效率较低。Binder基于C/S架构 ,Server端与Client端相对独立,稳定性较好。
  • 3、安全性:传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而Binder机制为每个进程分配了UID/PID,且在Binder通信时会根据UID/PID进行有效性检测。

Binder机制的作用和原理?

Linux系统将一个进程分为用户空间和内核空间。对于进程之间来说,用户空间的数据不可共享,内核空间的数据可共享,为了保证安全性和独立性,一个进程不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的,这就需要跨进程之间的数据通信方式。普通的跨进程通信方式一般需要2次内存拷贝,如下图所示:

一次完整的 Binder IPC 通信过程通常是这样:

  • 首先 Binder 驱动在内核空间创建一个数据接收缓存区。
  • 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系。
  • 发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

Binder框架中ServiceManager的作用?

Binder框架 是基于 C/S 架构的。由一系列的组件组成,包括 Client、Server、ServiceManager、Binder驱动,其中 Client、Server、Service Manager 运行在用户空间,Binder 驱动运行在内核空间。如下图所示:

  • Server&Client:服务器&客户端。在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。
  • ServiceManager(如同DNS域名服务器)服务的管理者,将Binder名字转换为Client中对该Binder的引用,使得Client可以通过Binder名字获得Server中Binder实体的引用。
  • Binder驱动(如同路由器):负责进程之间binder通信的建立,计数管理以及数据的传递交互等底层支持。

最后,结合Android跨进程通信:图文详解 Binder机制 的总结图来综合理解一下:

2.7AMS家族重要术语解释。

2.8ActivityThread工作原理。

2.9广播发送和接收的原理了解吗?

2.10apk打包流程

2.11说下安卓虚拟机和java虚拟机的原理和不同点?

3.Android优秀三方库源码及架构设计

3.1原理性问题

3.2为什么要在项目中使用OKHTTP这个库?

3.3OKhttp针对网络层有哪些优化?

3.4网络请求缓存处理,okhttp如何处理网络缓存的?

3.5从网络加载一个10M的图片,说下注意事项?

3.6WebSocket与socket的区别?

3.7Retrofit优势

3.8为什么用Glide

3.9Glide源码机制的核心思想:

3.10Glide内存缓存如何控制大小?

3.11加载bitmap过程(怎样保证不产生内存溢出)

3.12Bitmap如何处理大图,如一张30M的大图,如何预防OOM?

3.13MVP与MVC的主要区别:

3.14MVC->MVP->MVVM演进过程

3.15MVC的情况下怎么把Activity的C和V抽离?

3.16MVP 架构中 Presenter 定义为接口有什么好处;

3.17MVP如何管理Presenter的生命周期,何时取消网络请求?

3.18Fragment如果在Adapter中使用应该如何解耦?

3.19项目框架里有没有Base类,BaseActivity和BaseFragment这种封装导致的问题,以及解决方法?

3.20从0设计一款App整体架构,如何去做?

3.21实现一个库,完成日志的实时上报和延迟上报两种功能,该从哪些方面考虑?

3.22你最优秀的工程设计项目,是怎么设计和实现的;扩展,如何做成一个平台级产品?


4.其他高频面试题

4.1Android动画框架实现原理。

4.2Activity-Window-View三者的差别?

4.3低版本SDK如何实现高版本api?

4.4Android的生命周期和启动模式

4.5RecyclerView和ListView有什么区别?局部刷新?前者使用时多重type场景下怎么避免滑动卡顿。懒加载怎么实现,怎么优化滑动体验。
ListView、RecyclerView区别?

4.6说说谷歌新推出的Room架构。

4.7Debug跟Release的APK的区别?

4.8android文件存储,各版本存储位置的权限控制的演进,外部存储,内部存储

4.9Scroller原理。

4.10下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,onResume的时候怎么恢复

4.11Android程序运行时权限与文件系统权限

4.2曲面屏的适配。

4.3TextView调用setText方法的内部执行流程。

4.4怎么控制另外一个进程的View显示(RemoteView)?

4.5如何实现右滑finish activity?

4.6如何在整个系统层面实现界面的圆角效果。(即所有的APP打开界面都会是圆角)

4.7非UI线程可以更新UI吗?

4.8如何解决git冲突?

4.9单元测试有没有做过,说说熟悉的单元测试框架?

4.10对文件描述符怎么理解?

4.11如何实现进程安全写文件?

4.12Kotlin 特性,和 Java 相比有什么不同的地方?

4.13什么是协程?

4.14flutter了解吗?内部是如何实现跨平台的?如何实现多Native页面接入?如何实现对现有工程的flutter迁移?

文末

上篇2020上半年百度Android岗(初级到高级)面试真题全收录+解析,备战金九银十!(上篇)

2020上半年百度Android岗(初级到高级)面试真题全收录+解析,备战金九银十!(中篇)

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

最后这里放上我耗时两个月,将自己8年Android开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2020面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。【点击我】就可以免费领取了。

BATJ大厂面试真题收录大全PDF电子书已上传在石墨文档:【BATJ面试大全】需要的小伙伴自取就好了。别忘了给文章点个赞~

参考

举报

相关推荐

0 条评论