面试数据存储、IPC及View.pdf

所需积分/C币:5 2019-11-15 1.23MB PDF
评分

android面试数据存储、IPC及View。
IPC 、 Android中进程和线程的关系?区别? 参考回答 c线程是CPU调度的最小单元,同时线程是一种有限的系统 资源 进程一般指一个执行单元,在PC和移动设备上一个程序或 则一个应用 一般来说,一个App程序至少有一个进程,一个进程至少 有一个线程(包含与被包含的关系),通俗来讲就是,在 App这个工厂里面有一个进程,线程就是里面的生产线 但主线程(主生产线)只有条,而了线程(副生产线) 可以有多个 进程有自己独立的地址空问,而进程中的线程共享此地址 空间,都可以并发执行 、如何开启多进程?应用是否可以开启N个进程? 参考回答: 在 Androidmenifest中给四大组件指定属性 android: process开启多进程模式 c在内存允许的条件下可以开启N个进程 3、为何需要IPC?多进程通信可能会出现的问题? 参考回答: c所有运行在不同进程的四大组件( Activity、 Service Receiver、 ContentProvider)共亨数据都会失败,这是由 于 Android为每个应用分配了独立的虚拟机,不同的虚拟 机在内存分配上有不同的地址空间,这会导致在不同的虚 拟机中访问同一个类的对象会产生多份副本。比如常用例 子(通过开启多进程获取更大内存空间、两个或则多个应 用之间共享数据、微信全家桶) 般来说,使用多进程通信会造成如下几方面的问题 静态成员和单例模式完全失效:独立的虚拟机造成 线程同步机制完全实效:独立的虚拟机造成 SharedPreferences的可靠性下降:这是因为Sp不 攴持两个进程并发进行读写,有一定几率导致数据 丢失 Application会多次创建: Android系统在创建新的 进程会分配独立的虚拟机,所以这个过程其实就是 启动一个应用的过程,自然也会创建新的 Application 4、 Android中IPC方式、各种方式优缺点,为什么选择 Binder? 参考回答 进程间通信的方式-对比 名称 优点 缺点 适用场景 Intent 简单易用 只能传输 Bundle所支持的四大组件间的进程间通信 数据类型 文件共享 简单易用 不适合高并发 简单的数据共享。无高并发场景 功能强大,支 AIDL 持一对多并发使用稍微复杂.需要注意复杂的进程间调用, Android中最 实时通信 线程同步 常用 Messenger 比ADL稍微简比ADL功能弱.只支持一简单的进程间通信 单易用些 对多串行实时通信 强大的数据共受约束的ADL主要对外进程间的大量数据共享 Contentprovider享能力,可通 过方法扩展提供数据线的cRUD操作 在跨进程访问 Remoteviews U方面有奇效比较小众的通信方式 某些特殊的场景 跨主机,通信只能传输原始的字节流常用于网络通信中 范围广 与 Linux上传统的IPC机制,比如 System V, Socket相比, Binder好在哪呢? 传输效率高、可操作性强:传输效率主要影响因素是内存 拷贝的次数,拷贝次数越少,传输速率越高。从 Android 进程架构角度分析:对于消息队列、 Socket和管道来说, 数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再 从内核缓存区拷贝到接收方的缓存区,一共两次拷贝,如 Process a Process B Buffer Buffer From A' user spate to kernel space From kernel space to Buser spac Linux ke 而对于 Binder来说,数据从发送方的缓存区拷贝到内核的 缓存区,而接收方的缓存区与内核的缓存区是映射到同 块物理地址的,节省了一次数据拷仄的过程,如图: Process A Process B urer uler From A' user space to B\4M kernel buffer Mapped A 4M kernel buffer Linux Kernel B'4M ke nel buffer 由于共亨内存操作复杂,综合来看, Binder的传输效率是 最好的。 实现C/S架构方便: Linux的众IPC方式除了 Socket以外 都不是基于C/S架构,而 Socket主要用于网络间的通信且 传输效率较低。 Binder基于C/S架构, Server端与 Client端相对独立,稳定性较好。 安全性高:传统 Linux ipc的接收方无法获得对方进程可 靠的 UID/PID,从而无法鉴别对方身份;而 Binder机制为 每个进程分配了UID/PID且在 Binder通信时会根据 UID/PID进行有效性检测 5、 Binder机制的作用和原理? 参考回答 c Linux系统将一个进程分为用户空间和内核空间。对于进 程之间来说,用户空间的数据不可共享,内核空间的数据 可共享,为了保证安全性和独立性,一个进程不能直接操 作或者访问另一个进程,即 Android的进程是相互独立、 隔离的,这就需要跨进程之间的数据通信方式 数据发送进程 数据接收进程 用户空间 用户空间 User space 1.发速据 3避过词用eepy1.n将数从内 2通过系统调用 copy fom uger0将据从用 空闻中到用户空间(事2次ap 户闻oo到内核停区(1次c甲py 4.据 内核存区 内核空间 Kernel Spac 一次完整的 Binder ipc通信过程通常是这样: 首先 Binder驱动在内核空间创建一个数据接收缓存区; 接着在內核空间开辟一块内核缓存区,建立内核缓存区和 内核中数据接收缓存区之间的映射关系,以及内核中数据 接收缓存区和接收进程用户空间地址的映射关系 发送方进程通过系统调用 copyfromuser(将数据copy到 内核中的内核缓存区,由于内核缓存区和接收进程的用户 空间存在内存映射,因此也就相当于把数据发送到了接收 进程的用户空间,这样使完成了一次进程间的通信。 数据发送进程 数据接收进程 用户空间 用户空间 数据 1.发话 2通过系调用中 Py- from_user0 择酸据到内核存区 存在映射关系 数据 数据 内核缓存区 存在映射关系 数据接收缓存区 内核空间 Kernel Space 6、 Binder框架中 Servicemanager的作用? 参考回答: c Binder框架是基于C/S架构的。由一系列的组件组成,包 括 Client、 Server、 ServiceManager、 Binder驱动,其中 Client、 Server、 Service manager运行在用户空间, Binder驱动运行在内核空间 Client进程 Server进程 Binder动 smm1.0x1234 see2:D2345 ServiceManager Seryer& Client:服务器&客户端。在 Binder驱动和 Service manager提供的基础设施上,进行 Client Server之间的通信。 Servicemanager(如同DNS域名服务器)服务的管 理者,将 Binder名字转换为 Client中对该 Binder 的引用,使得 Client可以通过 Binder名字获得 Server中 Binder实体的引用 Binder驱动(如同路由器):负责进程之间 binder 通信的建立,传递,计数管理以及数据的传递交互 等底层攴持 步 过程报速 1o进程B雨发型务汪田索 t.是蜀2Bn为稀给 Brice apace出 些时,SM图还程了三e团醒约信且 3.saM边程添国说Sw通道程已注奥 1a内rd8动配位职程界的语求,传要翻召 2.回持该平写H画 Canv erManii量构别aad的Bm对的垫息 盐时,c浮得a已解肆了得 4遮过包将上息运回墙i进程 Bnd动一缓市区 1:日葡政大讲作相香:实程内存射 实现垃驶刺美耳:相国Sa进样里的机到对的Sau mD11道 实现内国存区们S配电雨空闻毛址风时射到同我螺存区中 盐时组了温限区国共系但开五将 己和进星通盟用 TOm UGEt国内锰中到区;《当程H星 保2:D升特数事暂语品种 38k动请知8进技行包 步3:56程居要求圆用口相法 1.歌到日通矩后,Bm述程以线程中题出缓程,进行调曰标方清 2期量怪围行结写人自已的共享内存中 国酒害写凸弄在脱价:的可中 出于内悟二数进n 地在映笑时映 精取中?, 由:5m程白标方活的结回给口建定 国了区 3思程通再团通用mimu4)从内存区Sm通的热速 发送进程 接枚进程 用户同 用产空间减 发这的密 1发物 示图 口一 Q41 行换关 二二二+二 内极区 应w区 随率福:正渔富少《),湘产空间暴内糕型间习育源过对直实点 均得分配了不器大小的样生这存区 7、 Bundle传递对象为什么需要序列化? Seria1 zable和 Parcelable的区别? 参考回答: 因为 bundle传递数据时只支持基本数据类型,所以在传递 刈象吋需要序列化转换成可存储或可传输的本质状态(字 节流)。序列化后的对象可以在网终、IPC(比如启动另 个进程的 Activity、 Service和 Reciver)之间进行传 输,也可以存储到本地。 序列化实现的两种方式:实现 Serializable/ Parcelable 接凵。不同点如图: Serializable接口 Parcelable接口 平台 Java的序列化接口 Android的序列化接口 序列化原理将一个对象转换成可存储将一个对象进行分解,且 或则可存储的状态 分解后的每一部分都是传 递可支持的数据类型 优缺点 简单但效率较低,开销大高效但使用较麻烦 序列化( biect Stream类)和 反序列化(0 elect stream类) 过程都需要大量的I/0操 作 使用场景适合将对象序列化到存储主要用在内存的序列化 设备或则将对象序列化后 通过网络设备传输 8、讲讲AIDL?原理是什么?如何优化多模块都使用AIDL的情况? 参考回答 AIDL(Android Interface Definition Language, Android 接口定义语言):如果在一个进程中要调用另一个进程中对 象的方法,可使用AIDL生成可序列化的参数,AIDL会生 成一·个服务端对象的代理类,通过它客户端实现间接调用 服务端对象的方法。 AIDL的本质是系统提供了一套可快速实现 Binder的工 具。关键类和方法: AIDL接口:继承 LInterface。 Stub类: Binder的实现类,服务端通过这个类来提 供服务。 Proxy类:服务器的本地代理,客户端通过这个类 调用服务器的方法。 asInterface o:客户端调用,将服务端的返回的 Binder对象,转换成客户端所需要的ADL接凵类 型对象。如果客户端和服务端位于统一进程,则直 接返回Stub对象本身,否则返回系统封装后的 Sub. proxy对象 amBinder(:根据当前调用情况返回代理 Proxy的 Binder刈象。 on Transact(:运行服务端的 Binder线程池中, 客户端发起跨进程请求时,远程请求会通过系统底 层封装后交由此方法来处理。 transact(:运行在客户端,当客户端发起远程请 求的同时将当前线程挂起。之后调用服务端的 trAnsact O直到远程请求返回,当前线程才继续 执行 当有多个业务模块都需要AIDL来进行IPC,此时需要为每 个模块创建特定的aid1文件,那么相应的 Service就会很 多。必然会出现系统资源耗费严重、应用过度重量级的问 题。解决办法是建立 Binder连接池,即将每个业务模块的 Binder请求统一转发到一个远程 Service中去执行,从而 避免重复创建 Service。 工作原理:每个业务模块创建自己的AIDL接口并实 现此接口,然后向服务端提供自己的唯一标识和其 对应的 Binder对象。服务端只需要一个 Seryice, 服务器提供一个 query Binder接口,它会根据业务 模块的特征来返回相应的 Binder对象,不同的业务 模块拿到所需的 Binder对象后就可进行远程方法的 调用了 View 讲下View的绘制流程? 参考回答 c view的工作流程主要是指 measure、 lavout、draw这三大 流程,即测量、布局和绘制,其中 measure确定View的测 量宽/高, layout确定View的最终宽/高和四个顶点的位 置,而draw则将View绘制到屏幕上 c view的绘制过程遵循如下几步: 绘制背景 background.draw( canvas) 绘制自己( ondraw) 绘制 children( dispatchDraw) 绘制装饰( onDrawScollbars)

...展开详情
立即下载 最低0.43元/次 身份认证VIP会员低至7折
举报 举报 收藏 收藏
分享
img
lengyue0925

关注 私信 TA的资源

上传资源赚积分,得勋章
相关内容推荐