木蚂蚁手机乐园首页

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 12103|回复: 80

[教程] 解读Android虚拟机工作原理

  [复制链接]

签到天数: 349 天

连续签到: 0 天

[LV.8]有房有车

514

主题

30

帖子

3924

积分

木蚂蚁小学六年级

Rank: 6Rank: 6

积分
3924

社区QQ达人

发表于 2010-11-26 14:55:03 | 显示全部楼层 |阅读模式
    下面说明下什么Android虚拟机?首先需要查看下Android虚拟机的源代码,这样可以避免在以后的工作当中省了不少事情。

    下面讲述下Android虚拟机的组成部分和一些构造原理,在介绍, signal,share memory。Java系统中的进程间通信方式有socket, named pipe等。

    [size=+0]android应用程序理所当然可以应用JAVA的IPC机制实现进程间的通信,
    取而代之的是Binder通信。Google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。 Binder通信是通过linux的binder driver来实现的。Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。

    Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。[size=+0]Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。
    系统中有一个进程管理所有的system service,[size=+0]Android虚拟机不允许用户添加非授权的System service,当然现在源码开发了,我们可以修改一些代码来实现添加底层system Service的目的。
    对用户程序来说,我们也要创建server,或者Service用于进程间通信,这里有一ActivityManagerService管理JAVA应用层所有的service创建与连接(connect)。disconnect,所有的 Activity也是通过这个service来启动,加载的。ActivityManagerService也是加载在Systems Servcie中的。
    [size=+0]
    [size=+0]Android虚拟机启动之前系统会先启动service Manager进程,service Manager打开binder驱动,并通知binder kernel驱动程序这个进程将作为System Service Manager。然后该进程将进入一个循环,等待处理来自其他进程的数据。用户创建一个System service后,通过defaultServiceManager得到一个远程ServiceManager的接口。
    通过这个接口我们可以调用 addService函数将System service添加到Service Manager进程中,然后client可以通过getService获取到需要连接的目的Service的IBinder对象。这个IBinder是 Service的BBinder在binder kernel的一个参考,所以service IBinder 在binder kernel中不会存在相同的两个IBinder对象。

    每一个Client进程同样需要打开Binder驱动程序。对用户程序而言,我们获得这个对象就可以通过binder kernel访问service对象中的方法。Client与Service在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用Service返回的IBinder接口后,访问Service中的方法就如同调用自己的函数。

    实现接口时有几个原则:
    抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的。IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。
    也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理,能在AIDL接口中声明静态属性。IPC的调用步骤:

    1。 声明一个接口类型的变量,该接口类型在.aidl文件中定义。
    2. 实现ServiceConnection。
    3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.
    4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用    YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换YourInterface类型。
    5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。
    6. 断开连接,调用接口实例中的ApplicationContext.unbindService()
开学了............

签到天数: 590 天

连续签到: 1 天

[LV.9]有房车有妞

1172

主题

111

帖子

6759

积分

论坛贵宾

自由联盟盟主

Rank: 20Rank: 20Rank: 20Rank: 20

积分
6759

社区QQ达人蚂蚁MM骨干会员勋章

发表于 2010-11-26 16:29:39 | 显示全部楼层
这个沙发可以坐吗?

签到天数: 349 天

连续签到: 0 天

[LV.8]有房有车

514

主题

30

帖子

3924

积分

木蚂蚁小学六年级

Rank: 6Rank: 6

积分
3924

社区QQ达人

 楼主| 发表于 2010-11-26 20:07:10 | 显示全部楼层
这个沙发可以坐吗?
louis 发表于 2010-11-26 16:29



    当然
开学了............

签到天数: 177 天

连续签到: 1 天

[LV.7]有车蚂蚁

104

主题

16

帖子

1440

积分

论坛贵宾

Rank: 20Rank: 20Rank: 20Rank: 20

积分
1440

社区QQ达人

发表于 2010-11-29 10:22:47 | 显示全部楼层
顶,虚拟机好用

签到天数: 2 天

连续签到: 0 天

[LV.1]初来乍到

3

主题

29

帖子

79

积分

木蚂蚁小学一年级

Rank: 1

积分
79
发表于 2010-12-4 21:26:35 | 显示全部楼层
受益不少........{:4_115:}

签到天数: 34 天

连续签到: 0 天

[LV.5]搬家常住

94

主题

0

帖子

468

积分

乞丐

积分
468
发表于 2011-1-3 05:37:56 | 显示全部楼层
(*^__^*) 嘻嘻…… ,我来看看,我不说话

签到天数: 28 天

连续签到: 0 天

[LV.4]已经心动

74

主题

0

帖子

-746

积分

乞丐

积分
-746
发表于 2011-1-8 01:25:30 | 显示全部楼层
很好很強大     

签到天数: 32 天

连续签到: 0 天

[LV.5]搬家常住

69

主题

0

帖子

-791

积分

乞丐

积分
-791
发表于 2011-1-22 02:26:27 | 显示全部楼层
不错,不错。

签到天数: 7 天

连续签到: 1 天

[LV.3]经常路过

0

主题

20

帖子

58

积分

木蚂蚁小学一年级

Rank: 1

积分
58
发表于 2011-1-22 22:22:09 | 显示全部楼层
说的是在是太好啦,真的很受易

签到天数: 7 天

连续签到: 1 天

[LV.3]经常路过

0

主题

20

帖子

58

积分

木蚂蚁小学一年级

Rank: 1

积分
58
发表于 2011-1-22 22:22:49 | 显示全部楼层
真的是很好,我会照着做的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐版块: 木蚂蚁潮流实验室  |  
安卓市场   安卓软件   安卓软件教程   安卓游戏攻略   手机游戏   手机健康软件   手机订餐软件   手机购物软件   热门TAG
快速回复 返回顶部 返回列表