Android7.0 PackageManagerService (5) installd

Android7.0 PackageManagerService (5) installd

ID:39464521

大小:82.00 KB

页数:11页

时间:2019-07-03

Android7.0 PackageManagerService (5) installd_第1页
Android7.0 PackageManagerService (5) installd_第2页
Android7.0 PackageManagerService (5) installd_第3页
Android7.0 PackageManagerService (5) installd_第4页
Android7.0 PackageManagerService (5) installd_第5页
资源描述:

《Android7.0 PackageManagerService (5) installd》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Android7.0PackageManagerService(5)installd一、installd的初始化1、installd启动在init.rc中,有以下代码片段:.......serviceinstalld/system/bin/installdclassmainsocketinstalldstream600systemsystem.......容易看出installd将作为service被init进程启动,同时会创建一个名为installd的socket。在frameworks/native/cmds/in

2、stalld/installd.cpp中:intmain(constintargc,char*argv[]){returnandroid::installd::installd_main(argc,argv);}staticintinstalld_main(constintargcATTRIBUTE_UNUSED,char*argv[]){.........//以下初始化全局变量,包括创建data下的一些目录等if(!initialize_globals()){ALOGE("Couldnotinitializeglob

3、als;exiting.");exit(1);}if(initialize_directories()<0){ALOGE("Couldnotcreatedirectories;exiting.");exit(1);}...........//得到"installd"socketlsocket=android_get_control_socket(SOCKET_PATH);...........//"installd"变成服务端if(listen(lsocket,5)){ALOGE("Listenonsocket

4、failed:%s",strerror(errno));exit(1);}fcntl(lsocket,F_SETFD,FD_CLOEXEC);for(;;){alen=sizeof(addr);//接受Java层的installer服务连接,形成与之连接的socket"s"s=accept(lsocket,&addr,&alen);..........fcntl(s,F_SETFD,FD_CLOEXEC);..........for(;;){unsignedshortcount;//读取收到的消息的长度if(rea

5、dx(s,&count,sizeof(count))){ALOGE("failedtoreadsize");break;}//判断有效性if((count<1)

6、

7、(count>=BUFFER_MAX)){ALOGE("invalidsize%d",count);break;}//读取cmdif(readx(s,buf,count)){ALOGE("failedtoreadcommand");break;}..........buf[count]=0;//执行cmdif(execute(s,buf))bre

8、ak;}.........close(s);}return0;}上面的代码中,我们省去了selinux相关的代码,只保留主干。从主干代码容易看出,installd整体的结构非常简单,其实就是启动后,获取作为服务端的socket“installd”;然后,监听”installd”,等待Java层installer服务的连接及命令的到来。2、命令处理方式一旦installd收到命令后,将调用execute函数进行处理,其代码如下:staticintexecute(ints,charcmd[BUFFER_MAX]){char

9、reply[REPLY_MAX];char*arg[TOKEN_MAX+1];.......arg[0]=cmd;//解析参数的个数while(*cmd){//当发现空格时if(isspace(*cmd)){*cmd++=0;//参数个数+1n++;//保存参数arg[n]=cmd;if(n==TOKEN_MAX){ALOGE("toomanyarguments");gotodone;}}if(*cmd){cmd++;}}//cmds为一个数组,保存了不同命令及对应的处理函数for(i=0;i

10、s)/sizeof(cmds[0]);i++){if(!strcmp(cmds[i].name,arg[0])){if(n!=cmds[i].numargs){//log.......}else{//参数正确时,调用对应的执行函数进行处理ret=cmds[i].func(arg+1,reply);}}}...........}ex

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。