- 浏览: 23764 次
- 性别:
- 来自: 北京
最新评论
文章列表
当ActivityManagerService启动一个应用程序的时候,当这个应用程序的进程不存在的时候,就会通过Socket与Zygote进程进行通信,请求它fork一个子进程来作为这个即将要启动的应用程序的进程。
接下来,我们就看一下Zygote是怎么样生成一个新的应用进程的。
在Linux系统中,所有的进程都是init进程子孙进程,所有的进程都是直接或者间接地由进程fork出来的。Zygote进程也不例外。它是在系统启动的过程中,由init进程创建的。在系统启动脚本system/core/rootdir/init.c文件中,我们可以看到启动Zygote进程的脚本命令:
service ...
Service组件在启动时,需要将自己注册到Service Manager中,而Client组件在使用Service组件提供的服务之前,也需要通过Service Manager来获得Service组件的代理对象。由于Service Manager本身也是一个Service组件,因此其他的Service组件和Client组件在使用它提供的服务之前,也需要先获得它的代理对象。
我们就来看一下Service Manager代理对象的获取过程。
我们先来看一下Binder库中最底层的接口IServiceManager的定义:
class IServiceManager : public IInte ...
case BINDER_SET_MAX_THREADS:
[// case BINDER_SET_MAX_THREADS
BINDER_SET_MAX_THREADS是设置Binder线程池的大小。
]// case BINDER_SET_MAX_THREADS
if (copy_from_user(&proc->max_threads, ubuf, sizeof(proc->max_threads))) {
[// if (copy_from_user(&proc->max_threads, ubuf, sizeof(proc-> ...
{
int ret;
struct binder_proc *proc = filp->private_data;
[// struct binder_proc *proc = filp->private_data
这里获得前面Binder驱动程序为Service Manager进程创建的一个binder_proc结构体。
]// struct binder_proc *proc = filp->private_data
struct binder_thread *thread;
unsigned int size = _IOC_SIZE(cmd) ...
分析完Binder驱动程序的打开和内存分配的过程之后,我们看一下与Binder驱动程序的交互过程,这是通过调用ioctl函数来实现的。
当调用ioctl函数时,Binder驱动程序的binder_ioctl就会被调用。binder_ioctl的定义如下所示:
static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
[// static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
...
在Android系统中,进程间通信使用的是Binder机制。Binder通信在Android里占据着很重要的地位,Android系统的方方面面都会涉及到Binder.
因此,接下来我们就分析一下Binder的源码。
我们先来看一下Binder设备的初始化过程,Binder是作为Android的一个设备存活的。
在binder.c文件的最后有下面这么一句代码
device_initcall(binder_init)
[// device_initcall(binder_init)
device_initcall函数到底是怎么工作的呢?这是内核知识,我不知道啊!那怎么办呢?baidu一 ...
ThreadLocal提供了一种线程操作数据的思想。以前我以为ThreadLocal的实现就是有一个以线程的name为关键字的HashMap,每次请求数据的时候在这个HashMap中查找数据。今天读完代码,我才明白原来是用一种更巧妙的方法实现的。
下面我 ...
public Handler(Looper looper, Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
[// mQueue = looper.mQueue
这里可以看出,Handler类的MessageQueue成员变量mQueue其实就是Looper内部的MessageQueue变量。
]// mQueue = looper.mQueue
mCallba ...
上面分析的是Looper的prepare函数,prepare函数的作用是为当前线程设置个Looper对象,保存到线程的ThreadLocal中去。
当调用完Looper的prepare函数之后,还需要调用Looper的loop函数,才能使Handler来收取和处理消息:
loop函数的定义如下:
public static void loop() {
final Looper me = myLooper();
if (me == null) {
...
在Android系统中,Handler是一个很重要的概念.可以说,在Android系统中,Handler的身影无处不在。
Handler提供了若干个构造函数,我们就从Handler的构造函数来开始分析Handler系统的实现. Handler的构造函数的实现如下:
[// Handler的构造函数
public Handler() {
this(null, false);
}
public Handler(Callback callback) {
this(callback, false);
}
public Han ...
No.1 智能指针的设计
智能指针是通过引用技术来控制对象的生成和销毁的。我们知道在才C++中对象的生成和销毁会自动调用对象的构造函数和析构函数,所以智能指针的大部分逻辑都集中在构造函数和析构函数中,这也是我们分析的重点。
因为Android的职能指针是通过引用计数的方法来实现的。所以在设计中会涉及到两个层次。第一层是定义控制引用计数的对象,我们称之为引用计数控制类。第二层才是对真实对象的访问,可以把这个对象看作是对真实对象的包裹。所以我们把这个类称之为包裹类。
这样职能指针会自动帮你控制对象的创建和销毁了。
在Android系统里,主要存在三种职能指针轻量级指针 ...