android的frameworks
Ⅰ framework初了解与必备技能
E:Engine发动机,I:Interface接口,T:tire轮胎。有发动机和轮胎,再提供接口接口就可以让汽车跑起来。没有简单,我们就无法理解复杂;
application framework(应用框架层):无论是android提供的应用程序,还是开发人员自己编写的应用程序,都需要使用framework,核心的作用就是提供一个接口,给app跑起来,并且起到了屏蔽解耦作用。
简而言之,Framework具体的工作也就是为android应用开发的开发人员提供了一系列的服务和API的接口。同时负责应用程序生命周期和资源等进行管理。是android系统层内容。
framework是google厂商定制好了,最多修改一些bug或者添加一些东西,如果大改,很多应用就跑不起来。
Framework又分为java Framework和Native Framewok:示意图如下:
csdn一篇博客通俗易懂的讲了framework: 我眼中的Android Framework
Framework是由多个系统服务共同组成。所有服务都寄宿在系统核心进程中,在运行时每个服务都占据一个独立的线程。
为了实现Java程序在运行阶段的二次编译,Android为他们提供了运行时(Runtime)的支撑。
运行时由Java核心类库和Java虚拟机Dalvik共同构成 。
Java核心类库涵盖了Android框架层和应用层所要用到的基础java库。dalvik负责动态解析执行应用、分配空间、管理对象生命周期等工作,是android心脏。
硬件抽象层(HAL):是安卓为厂商定义的一套接口标准,为框架层提供接口函数。
Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。
Ⅱ 什么是android framework
说简单点,Framework具体的工作也就是为android应用开发的开发人员提供了一系列的服务和API的接口。
能够从源码下载到编译,到移植进开发板都能顺利的完成" 你的这些经验挺符合要求的啊,招聘信息里写的"Android Framework"指的应该就是/frameworks/base,多数是Java代码。看样子他们是在做Android设备,厂商一般是做移植,然后根据自己产品的特点可能会在frameworks及整个平台里加自己的扩展功能。
http://blog.csdn.net/coding_or_coded/article/details/6822029
Ⅲ Android Framework media providers 随笔
遇到一个问题是多媒体扫描失败:
从logcat 中可以看到的时候 这个服务 com.android.providers.media/.MediaScannerService 启动超时了
1、com.android.providers.media 和 com.android.providers.media/.MediaScannerService 到底是在哪里定义声明的?
2、Why com.android.providers.media/.MediaProvider is crashing?
带着问题扩展开来学习,遇到什么记录什么,慢慢搭建系统的体系
平台:Android 7.1
1、com.android.providers.media 与 MediaScannerService
看 frameworks.java 的构造方法和connect 方法, 其注释和接口实现可以回答之前的疑问
如下接口通过
new ComponentName("com.android.providers.media",
"com.android.providers.media.MediaScannerService"));
而 MediaScannerService 我们只需要看如下文件中的注释就对其流程有一个清晰的了解
frameworks.java
2、Why com.android.providers.media/.MediaProvider is crashing?
在
frameworks.java getContentProviderImpl函数中会对 OomAdj 优先级进行调整,如果调整失败和判断进程不可活, 则调用 appDiedLocked kill 其进程
其实最后之所以把文章标题写为随笔,就是还有未完成的事情要做。
虽然把 1 的疑问找到地方了,但是其实是引出来了更多疑问,什么时候调用,其他层逻辑实现
转一篇文章看看 Android开发——MediaProvider源码分析(1)
同样2 也是,OomAdj 为什么会调整失败,调整失败后怎么做 等等...
这些都是会引发新的思考,并且跟自身已有的知识点联系起来,所以系统知识技能需要不断思考,实践学习
Ⅳ android framework具体工作是什么
说简单点,Framework具体的工作也就是为android应用开发的开发人员提供了一系列的服务和API的接口。
同事负责应用程序生命周期和资源等进行管理。
如果说你想了解framework 的内容,那需要关注android系统层内容。了解android系统架构。
Ⅳ AndroidFramework 之启动 ServiceManager
本文源码基于 Android 10 ,涉及相关源码如下。
ServiceManagaer 是 Binder 的守护进程,在 Binder 机制中起着重要的作用。本文将从源码的角度对其进行分析,整体流程如下:
时序图如下。
先来看看 ServiceManager 是如何启动的:
在 Zygote 一文中说过, init 进程启动的第二阶段会解析 init.rc 文件。
在这之后会触发 trigger init 。
结合 init.rc 看看 action init 做了什么。
当触发 trigger init 后,会启动 servicemanager 服务,其声明如下。
对应的执行文件为 /system/bin/servicemanager ,在编译前位于 frameworks/native/cmds/servicemanager 下,来看看 Android.bp 。
其对应的源码为 service_manager.c 和 binder.c ,入口函数 main() 位于 servicemanager.c 。
启动完 ServiceManager 后会打开 Binder 驱动。
在 main() 中首先调用 binder_open() 。
binder_open() 主要做了如下事情:
给结构体 binder_state 分配内存。
系统调用 open() 打开 /dev/binder ,如果打开驱动失败,则执行 fail_open 释放内存。
简单的解释一下什么是系统调用?
由于需要限制不同的程序之间的访问能力,防止程序获取别的程序的内存数据, CPU 划分出两个权限等级, 用户态 和 内核态 。
所有的用户程序都是运行在用户态,但有时需要做一些内核态的事情,而唯一可以做这些事情的就是操作系统,所以程序需要向操作系统发起请求,以程序的名字来执行这些操作。这时就需要一个从用户态切换到内核态但不能控制内核态中执行的机制,这种机制就是 系统调用 。
系统调用 ioctl() 传入 BINDER_VERSION 命令获取 Binder 驱动版本,对比版本是否一致,不一致则执行 fail_open 释放内存。
系统调用 mmap() 映射 128kb 的内存空间,即把 Binder 驱动文件的 128kb 映射到内存空间供 ServiceManager 使用,内存映射失败则执行 fail_map ,关闭 fd 并释放内存。
ServiceManager 进程 mmap 的内存大小可以通过 adb shell 命令查看。
可以看到内存映射地址为 0xf10f8000 ~ 0xf1118000 ,差为 0x20000 即十进制的 128kb 。
打开 Binder 驱动后会将 ServiceManager 设置为上下文管理者。
调用 binder_become_context_manager() 。
android 10 新增 BINDER_SET_CONTEXT_MGR_EXT 命令来设置安全的上下文管理者,如果设置失败,则使用原有的 BINDER_SET_CONTEXT_MGR 命令来设置上下文管理者,两者区别在于是否携带参数。
最后会进入循环,从 Binder 驱动读取和解析数据。
调用 binder_loop() 进入循环,不断地通过系统调用 ioctl() 从 Binder 驱动读取数据,并通过 binder_parse() 进行数据解析。
注意这里调用 binder_loop() 传入的 svcmgr_handler() ,后面会使用到。
binder_write() 会封装 struct binder_write_read ,并通过系统调用 ioctl() 将对应的命令传递给 Binder 驱动。
binder_parse() 用来解析从 Binder 驱动读取到的数据,然后根据不同的命令执行对应的操作。
因为 cmd 命令可能有多个,所以通过 while 循环每次处理一个 cmd 命令,多 cmd 的结构大致如下图所示。
这里重点看下 BR_TRANSACTION 命令。
BR_TRANSACTION 是 Binder 驱动向 Server 端发送请求数据。
binder_transaction_data 的结构如下,其表明了 transcation 传输的具体语义,语义码记录在 code 中,不同语义码携带的数据是不同的,这些数据由 data 指定。
在解析完 binder_transaction_data 的具体语义后,会调用前面传给 binder_loop() 的 svcmgr_handler() ,其实就是 switch case 语义码做不同的事情。
ServiceManager 的功能其实很简单:
至此 ServiceManager 就分析完了。
Ⅵ Framework应用框架为什么重要呢
对于绝大多数 Android 开发工程师来说,掌握Android Framework 一直是一个不光要熟练而且必须要精通的技能。Framework这个应用框架是Android开发中最基础,但同时也是最重要的。Framework包含了Android IPC Binder机制、Handler消息机制、Dalvik VM进程系统、AMS、WMS和Package Manager Service等等。而这些类别里又包含很多小类,有许多的分支,每一个小类里还有很多小细节,这些都是Android开发工程师必须熟练掌握和精通的技能。
如果做成一个框架图的话,就是下面这样的:这只是一个简单的框架图,其实还有很多分支
很多大厂公司在面试的时候都会有很多的技术面试题,这是考察程序员必不可少的题目。
比方说:
1.Android中多进程通信的方式有哪些?
2.进程通信你用过哪些?原理是什么?(字节跳动、小米)
3.描述下Binder机制原理?(东方头条)
4.Binder线程池的工作过程是什么样?(东方头条)
5.Handler怎么进行线程通信,原理是什么?(东方头条)
6.Handler如果没有消息处理是阻塞的还是非阻塞的?(字节跳动、小米)
7.handler.post(Runnable) runnable是如何执行的?(字节跳动、小米)
8.handler的Callback和handlemessage都存在,但callback返回true handleMessage还会执行么?(字节跳动、小米)
9.Handler的sendMessage和postDelay的区别?(字节跳动)
10.IdleHandler是什么?怎么使用,能解决什么问题?
11.为什么Looper.loop不阻塞主线程?(腾讯)
12.Looper无限循环为啥没有ANR(B站)
13.Looper如何在子线程中创建?(字节跳动、小米)
14.Looper、handler、线程间的关系。例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米)
15.如何更新UI,为什么子线程不能更新UI?(美团)
16.ThreadLocal的原理,以及在Looper是如何应用的?(字节跳动、小米)
17.Android 有哪些存储数据的方式?
18.SharedPreference原理,commit与apply的区别是什么?使用时需要有哪些注意?(腾讯)
19.如何判断一个 APP 在前台还是后台?
20.如何做应用保活?
21.一张图片100x100在内存中的大小?(字节跳动)
22.Intent的原理,作用,可以传递哪些类型的参数?
然后会再扩展到和这些知识点相关的更深层次的知识点细节,直到问的你答不上来为止,以此来探寻你的技术边际,这样就能更深入地了解你的技术能力。
Android Framework重要性
Android Framework 开发虽然比较偏底层,圈子窄,但是能掌握一些原理的东西,可以触类旁通,往应用层发展也可以,接下来我们看看Framework知识有多重要。举几个栗子,你或许就能清楚了。
像掉帧监控,函数插装,慢函数检测,ANR 监控,启动监控,都需要对 Framework 有比较深入的了解,才能知道怎么去做监控,利用什么机制去监控,函数插桩插到哪里,反射调用该反射哪个类哪个方法哪个属性……
目前大公司的app开发都要基于模块化、层次化、组件化、控件化的思路来设计架构,而这一切的基础都建立在Android Framework系统框架底层原理实现之上。
Binder是Android系统中最重要的组成
Binder是什么呢?请看下图,图是最能清楚明了的直观表达的工具
优势描述
性能:只需要一次数据拷贝,性能上仅次于共享内存
稳定性:基于C/S架构,职责明确,架构清晰,因此稳定性好
安全性:为每个App分配UID,进程的UID是鉴别进程身份的重要标志
Android IPC Binder机制包含了 :Linux预备知识、传统的Linux中IPC通信原理、Binder IPC通信原理和Binder Java层实现,这些里面都各有好多小分支,小细节需要仔细的去学习掌握。
腾讯高级工程师Binder面试
1.为什么 Android 要采用 Binder 作为 IPC 机制?
2.Binder到底是什么?
3.Binder机制是如何跨进程的?
4.一次Binder通信的基本流程是什么样?
5.为什么 Activity 间传递对象需要序列化?
6.四大组件底层的通信机制是怎样的?
7.AIDL 内部的实现原理是什么?
这些都是关于Binder机制面试时会问到的点。
Handler主要用于异步消息的处理: 有点类似辅助类,封装了消息投递、消息处理等接口。当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。
2、为什么要用handler?
为什么要用handler?不用这种机制行不行?不行!android在设计的时候,就封装了一套消息的创建、传递、处理机制,如果不遵循这种机制,就没有办法更新UI信息,就会抛出异常信息。
在android开发中,经常会在子线程中进行一些操作,当操作完毕后会通过handler发送一些数据给主线程,通知主线程做相应的操作。探索其背后的原理:子线程handler主线程其实构成了线程模型中的经典问题生产者-消费者模型。生产者-消费者模型:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加数据,消费者从存储空间中取走数据。