AllenWang的个人博客

小楼一夜听春雨


  • 首页

  • 分类

  • 归档

  • 标签

  • menu.ad

Android Binder机制分析(5) binder_ioctl()分析

发表于 2016-03-01 | 分类于 android_deep_analysis

引言

在博客Android Binder机制(3)本地服务注册过程这篇博客中我们详细讲解了本地服务的注册过程,除了一个地方之外,那就是IPCThreadState::waitForResponse()方法中的talkWithDriver(),而在talkWithDriver()中调用了binder_ioctl(),由于内容太多,所以专门写一篇博客进行分析。

实际上,不只是在服务注册过程中会调用到Binder Driver中的binder_ioctl(),在服务检索、服务使用阶段都会调用到binder_ioctl(),所以这篇博客将分这3个阶段详细讲解binder_ioctl()方法。

并且,这3个阶段均可按Binder数据的传递划分为6个阶段,如下所示

阅读全文 »

Android Binder机制分析(4) Parcel类分析

发表于 2016-02-27 | 分类于 android_deep_analysis

引言

在上一篇Blog中,在分析服务注册过程时,往data(Parcel对象)变量写入数据时,有这样的调用路径:

BpServiceManager::addService()–>Parcel::writeStrongBinder()–>flatten_binder()–>finish_flatten_binder()

由于finish_flatten_binder()方法中涉及到的东西太多,在上一篇博客就没有展开来讲。这篇博客将详细分析数据是如何写入到data中的。

下面是Parcel类的定义:

阅读全文 »

Android Binder机制(3) 本地服务注册过程

发表于 2016-02-27 | 分类于 android_deep_analysis

引言

本博客将讲解本地服务的注册过程,为了方便大家更好地理解,选择了MediaPlayer Service作为例子。

启动并注册MediaPlayer Service的代码在frameworks/base/media/mediaserver/main_mediaserver.cpp中,如下:

main_mediaserver.cpp
1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc, char** argv)
{
sp<ProcessState>proc(ProcessState::self());
sp<IServiceManager>sm=defaultServiceManager();
LOGI("ServiceManager: %p",sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}

表面上看,启动服务的代码异常简单,实际上只是代码封装得好,里面的调用非常复杂。下面我们将逐一

阅读全文 »

Android Binder机制(2) ContextManager注册过程分析

发表于 2016-02-27 | 分类于 android_deep_analysis

引言

Context Manager对应的进程为servicemanager,它先于Service Server与服务客户端运行,首先进入接收IPC数据的状态,处理来自Service Server或服务客户端的请求。在init.rc脚本文件中也可以看到Context Manager在mediaserver与system_server之前运行了。

每当Service Server注册服务时,Context Manager都会把服务的名称与Binder节点编号注册到自身的服务目录中,该服务目录通过根文件系统下的/system/service程序即可查看。
下图即为在华为某型号手机上使用service list命令查看到的服务列表

阅读全文 »

Android Binder机制(1):Binder架构分析

发表于 2016-02-24 | 分类于 android_deep_analysis

引言

从这篇博客开始,将进入Binder机制的分析系列,顺序是先讲解Binder机制的框架,理解了整体思想后,再深入分析各层的细节实现,最后会实现一个自己的本地服务。

1.Binder的历史

BeOS是Be公司在1991年开发的运行在BeBOX硬件上的一款操作系统,与同期的其他操作系统不同,它是一款基于GUI设计的操作系统。

George Hoffman(在LinkedIn上可以找到这哥们,简直是活着的传奇)当时任Be公司的工程师,他启动了一个名为OpenBinder的项目,该项目的宗旨是研究一个高效的信号传递工具,允许软件的各个构成元素相互传递信号,从而使多个软件相互协作,共同形成一个软件系统。在Be公司被ParmSource公司收购后,OpenBinder由Dinnie Hackborn继续开发,后来成为管理ParmOS6 Cobalt OS的进程的基础。在Hackborn加入谷歌后,他在OpenBinder的基础上开发出了Android Binder(以下简称Binder),用来完成Android的进程通信。

Binder原本是IPC(Inter Process Communication)工具,但在Android中它主要用于支持RPC(Remote Procedure Call,远程调用),使得当前进程调用另一个进程的函数时就像调用自身的函数一样轻松、简单

阅读全文 »

Android系统服务概要

发表于 2016-02-24 | 分类于 android_deep_analysis

1.Android系统服务

Android系统服务提供系统最基本、最核心的功能,如设备控制、位置信息、通知设定、消息显示等。这些服务分别存在于Application Framework与Libraries层之中。如下图所示

阅读全文 »

Zygote完全解析(3)

发表于 2016-02-24 | 分类于 android_deep_analysis

引言

本文是Zygote完全解析系统的第3篇也是最后一篇Blog,主要是分析SystemServer运行后是如何处理来自所绑定的socket的请求,从而运行新的应用程序的。

通过Zygote完全解析(1)中的ZygoteInit.main()方法中可知,在运行SystemServer后,如果不是ZYGOTE_FORK_MODE,程序会进入一个循环,处理来自所绑定的socket的请求,对应的代码 runSelectLoopMode()如下

阅读全文 »

Zygote完全解析(2)

发表于 2016-02-24 | 分类于 android_deep_analysis

引言

在Zygote完全解析(1)一文中对于Zygote的产生,Zygote孵化进程的原理以及ZygoteInit完成的工作进行了分析。文章的最后,提到了ZygoteInit的main()方法完成的功能如下:

zygote_main

本文将详细分析ZygoteInit.main()方法中的主要4项工作是如何完成的。

阅读全文 »

Zygote完全解析(1)

发表于 2016-02-23 | 分类于 android_deep_analysis

1.什么是Zygote

Zygote的字面意思是”受精卵”,我们都知道,有丝分裂的个体最初都是从受精卵发育而来,意思非常明显,在Android系统中也一样,运行新的应用,需要跟Zygote进程结合后才能执行。

我们知道,Android的应用程序是由Java编写的,它们不能直接以本地进程的形态运行在Linux上,只能运行在Dalvik虚拟机中(当然,在5.0之后采用ART了,但是不影响此处的理解)。每个应用程序都运行在各自的虚拟机中,应用程序每次运行都要重新初始化并启动虚拟机,这个过程会耗费相当长时间,是导致应用程序启动慢的原因之一。

为了很好地解决这个问题,在Android中,应用程序运行前,Zygote进程通过共享已运行的虚拟机的代码与内存信息,缩短应用程序运行所耗费的时间。并且,它会预先将应用程序要使用的Android Framework中的类与资源加载到内存中,并组织形成所用资源的链接信息。因此,新运行的Android应用程序在使用所需资源时不必每次重新形成资源的链接信息,从而提高运行速度

阅读全文 »

JNI完全解析

发表于 2016-02-19 | 分类于 android_deep_analysis

1.Android与JNI

从编程语言年地,Android Framework由基于Java语言的Java层与基于C/C++语言的C/C++层组成,每个层中的功能模块都是使用相应的语言编写的,并且两个层中的大部分模块之间保持着千丝成缕的联系。以Android GPS子系统为例,如下图所示,它提供终端的地理位置信息。在Android应用程序获取GPS信息时,需要先调用应用程序框架中Location Manager提供的Java API,而后通过调用框架内的GPS库,连接到GPS设备驱动上,应用程序即可获取当前地理位置信息。在此过程中,C/C++层与Java层相互作用、相互配合,共同

阅读全文 »
1…567…16
Allen Wang

Allen Wang

152 日志
25 分类
8 标签
© 2018 Allen Wang
由 Hexo 强力驱动
主题 - NexT.Muse