`
zzu_007
  • 浏览: 23764 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
当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系统里,主要存在三种职能指针轻量级指针 ...
Global site tag (gtag.js) - Google Analytics