Android Service
来源:互联网 发布:软件开发工作计划表 编辑:程序博客网 时间:2024/06/05 18:35
一、Service分类
Android有3大类service, 处于android系统的不同框架层。
1、 init.rc中的service,系统集成工程师负责
service servicemanager/system/bin/servicemanager
class core
user system
group system
critical
onrestart restart zygote
onrestart restart media
onrestart restart surfaceflinger
onrestart restart drm
这类service就是为了定义开启启动的程序,该类service的对象是一个可以执行的binary程序。把它定义为一种service是为了更好的描述该binary运行的属性,比如运行用户、组、启动一次(oneshot)还是不停启动(程序死掉后会再次启动)。更重要的是它还能描述各个程序之间的关系。比如onrestart restart drm,这个描述的意思是当drm程序重启时,该程序也要主动重启。 同时通过如下命令还可以运行时动态启动或者关闭某一service,当然要有root权限。
property_set("ctl.start","servicemanager");property_set("ctl.stop","servicemanager");
adb shell setprop ctl.start servicemanager;adbshell setprop ctl.stop servicemanager
2、 系统层service,framework系统工程师负责
该类service和我们通常理解的service很接近,就是系统中提供服务的,该类service定义出服务接口,其他模块通过该接口即能使用该服务。该类服务的执行体可以是二进制代码,也可以是java代码。比如:
c++类型的service:
SurfaceFlinger,CameraManagerService, MediaPlayerService
java类型的service:
ActivityManagerService,WindowManagerService,NetworkManagerService
实现机制是该类service向上面提到的servicemanager注册它的服务,其他模块通过名字从servicemanager拿到service的接口。在shell通过命令 "service list"能列出系统中所有的该类service。
c++类型service相关接口:
sp<IServiceManager> sm = defaultServiceManager();
sm.addService(name, xx)/sm.getService(name)
java类型service相关接口:
ServiceManager.getService(name)/addService(name,xx)
3、 SDK层service,android应用程序开发者
不像前面两类service,它们是一类对象的总称,而该类service是开发者经常接触的一个很具体的java类android.app.Service.java。它是androidsdk暴露给第三方应用使用的。 它是和Activity对等的,是android四大组件之一(Activity,Service, Provider, BroadcastReceiver)。
二、Service数据结构
struct service该数据结构保存了和service相关的信息。service下可以定义option,这些option被保存在这个结构体中,除此之外还保存了service的运行时管理信息,具体如下:
struct service{ /* list of all services*/
struct listnode slist;
const char *name; // 名称
const char *classname; // 类别:default
unsigned flags; // 选项,参见init.h中SVC_宏定义
pid_t pid; // service所在进程的pid
time_t time_started; /* time of last start */
time_ttime_crashed; /* first crash within inspection window*/
intnr_crashed; /* number of timescrashed within window */
uid_t uid; // effective userID
gid_t gid; // effective groupID
gid_tsupp_gids[NR_SVC_SUPP_GIDS]; // supplementary group IDs
size_t nr_supp_gids; //supp_gids的大小
struct socketinfo *sockets;// 为service创建的sockets
struct svcenvinfo *envvars;// 为service设置的环境变量
struct actiononrestart; /* Actions to execute on restart. */
/* keycodes for triggeringthis service via /dev/keychord */
int *keycodes;
int nkeycodes;
int keychord_id;
int ioprio_class; // io优先级
int ioprio_pri;
int nargs; // 参数个数,参见下面的说明
/* "MUST BE AT THE ENDOF THE STRUCT" */
char *args[1]; // service[service name] [args] NULL # 包含了service的参数的个数+1
};
三、Service定义与解析
- 定义
service <name> <parthname> [<argument> ]*。
pathname代表启动service时用到的命令。
- 解析service节
开始解析service节的函数为parse_service()。该函数的主要功能是:创建service对象,解析定义service的行,然后设置service的默认的class为default。
- 解析service的option
解析service的option位于函数parse_line_service()中,该函数中支持的option如下:
capability //暂时未实现
class <name> //设置名称为name的类别,感觉有点像开机启动service的优先级,默认的class名称为default
console //需要在android屏幕上打开控制台
disabled //设置后,不能自动的通过class名称启动,必须显式的通过service名称启动
ioprio <rt|be|idle> <0-7> //设置io优先级
group <groupname> [ <groupname> ]* //设置服务进程的effective group ID(第一个参数)和supplementarygroup IDs(第二个到最后)
keycodes <keycodes> [ <keycodes> ]* //keycodes相关
oneshot //服务退出时,不再启动,但可以通过名称启动
onrestart //服务重启时,执行的命令,可能是服务的重启的时候,需要作一些额外的工作
critical //是device-criticalservice,在4分钟内退出超过4次,那么设备会重启到recover模式下
setenv <name> <value> //设置服务的环境变量
socket <name> <type> <perm> [<user> [ <group> ] ] //为服务创建socket,可以创建多个
user <effectuserid> //设置服务进程的effectiveuser ID
四、service启动
启动service的函数为service_start(struct service *svc, constchar *dynamic_args)。service的option会记录在struct service中,故启动service时,考虑到这些选项即可。同时,会记录下service的pid、状态等。在init进程中,启动service可以有以下的方式:
1. action下面添加和启动服务相关的command即可。action中和操作服务相关的命令有:
class_start <serviceclass> # 启动所有指定class的服务
class_stop <serviceclass> # 停止所有指定class的服务,后续没法通过class_start启动
class_reset <serviceclass> # 停止服务,后续可以通过class_start启动
restart <servicename> # 重启指定名称的服务,先stop,再start
start<servicename> # 启动指定名称的服务
stop<servicename> # 停止指定名称的服务
2. restart_processes()函数中。该函数位于init的主线程循环中,用来查看有没有需要重新启动的service。具体参考init进程main函数:system/core/init/init.c
int main(){
//挂载文件
//解析配置文件:init.rc……
//初始化action queue
…… for(;;){
execute_one_command();
restart_processes();
for (i = 0; i < fd_count; i++)
{ if (ufds[i].revents == POLLIN)
{ if (ufds[i].fd ==get_property_set_fd())
handle_property_set_fd();
else if (ufds[i].fd ==get_keychord_fd())
handle_keychord();
else if (ufds[i].fd ==get_signal_fd())
handle_signal();
}
}
}
}
3. handle_property_set_fd()函数中。通过向socket名称为property_service的属性服务,发送控制的消息可以进入到该函数中。具体可以参考property_service.c
4. handle_keychord()函数中。该函数和chordedkeyboard有关,可参阅相关信息
五、init.rc中的service分类
按照service的class来分的话,可以分为两大类:class core和class main。
class core的service包括:
ueventd /sbin/ueventd # 处理内核的uevent消息
console /system/bin/sh # 控制台服务
adbd /sbin/adbd # adb调试的服务端
servicemanager /system/bin/servicemanager # 管理服务的服务,被管理的服务通常是供应用程序使用的
vold /system/bin/vold # 管理存储设备
class main的service包括:
netd /system/bin/netd # 网络管理器
debuggerd /system/bin/debuggerd # 可以在logcat中输出调试信息
ril-deamon /system/bin/rild # 打电话的服务
surfaceflinger /system/bin/surfacefliger # 合成framebuffer的服务
zygote /system/bin/app_process # 孵化java应用进程的服务
drm /system/bin/drmserver # DRM服务,frameworks/base/drm
media /system/bin/mediaserver # 多媒体服务
bootanim /system/bin/bootanimation # 开机动画服务
dbus /system/bin/dbus-daemon # 用于进程间通讯的服务
bluetoothd /system/bin/bluetoothd # 蓝牙
installd /system/bin/installd # apk安装的服务
flash_recovery /system/etc/install-recovery.sh #recover recovery分区
racoon /system/bin/racoon # key managementdaemon
mtpd /system/bin/mtpd # MTP(Media TransferProtocol) daemon
keystore /system/bin/keystore # 应用签名
dumpstate /system/bin/dumpstate # 性能测试工具
- [android]service中再启service
- android service
- Android Service
- android service
- Android Service
- Android service
- android service
- Android Service
- Android Service
- Android service
- Android:Service
- Android Service
- [Android] Service
- android service
- android service
- android service
- android service
- Android Service
- Eclipse 调优及使用小细节
- 两个数组元素相同,顺序不同,进行正确匹配
- 多线程的学习2(小应用)
- iOS —— 获取Mac地址
- MAHOUTR 安装详解
- Android Service
- 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现
- 使用csdn-markDown编辑器
- Android继承ActionBarActivity之后,出现闪退情况解决方法
- SOJ 连分数问题解题报告
- Spring security AccessDeniedHandler 不被调用
- 二套房首付只要四成了,你们第一套房买了吗?
- Windows界面编程第三篇 异形窗体
- OC与C的语言联系