android软件层次,Android各个层次之间的相互关系

在Android中运行的应用程序都是通过以下三种方式来层层深入的:

-         App -> Runtime Service ->lib

-         App -> Runtime Service ->NativeService -> lib

-         App -> Runtime Service ->NativeDaemon -> lib

下面就分别来分析这三种方式,我们还是采用流程图的方式来为大家展示。

App -> Runtime Service -> lib方式对应的流程图如图1所示。

27592749_1.jpg

图1 App ->Runtime Service -> lib方式的流程图

通过图1我们可以看出,在Android平台上,应用程序首先是在应用程序层通过Binder IPC调用应用程序框架层的Runtime Service,然后再通过JNI与运行库中的原生服务绑定,并动态地加载Hal库,进而调用Linux内核层的Kernel Driver。为了便于大家更好地理解,我们通过一个实例(Location Manager)来分析该流程,如图2所示:

27592749_2.jpg

图2 LocationManager调用流程

以上就是第一种方式的调用过程,接下来我们再了解一下第二种方式App -> Runtime Service ->Native Service -> lib是如何调用的。这种方式通常被Android的原生服务所采用,同样先看一下调用流程图,如图3所示。

27592749_3.jpg

图3 App ->Runtime Service ->Native Service -> lib方式的流程

图3为我们展示了Android原生服务的调用流程,可以看出,与第一种方式相比,只多了一个通过IPC机制调用原生服务并进行动态装载的过程。以下为一个Audio的例子,如图4所示。

27592749_4.jpg

图4 Audio原生服务的调用流程

从图4可以看出,应用程序调用了应用程序框架层的MediaPlayer,然后调用系统运行库底层的MediaPlayer。这里MediaPlayer又分别调用了Media Framework和AudioFlinger,而后通过AudioFlinger调用指定的库(libaudio.so),最后才调用到Kernel Driver。

下面来看一下最后一种方式“App-> Runtime Service ->Native Daemon -> lib”,如图5所示。这种方式通常用于守护进程的连接。

27592749_5.jpg

图5 原生守护进程的调用流程

从图5可以看出,这种方式比原生服务的调用更简单,它直接通过JNI绑定原生服务,再通过sockets调用守护进程进行动态加载。下面来看一个简单的例子,电话管理(Telephony Manager)的调用就是这样一个原生的守护进程调用,其流程如图6所示。

27592749_6.jpg

图6 TelephonyManager的调用流程

这个调用的过程非常简单。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值