预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

问题 我遇到的问题是我想在Java应用程序中动态mount一 个NFS的系统,但是执行mount命令必须要要root权限才 可以。一般情况下,在Android的Java层是不能获得root 权限的。 思路 我在博文《Android程序的安全系统》中提到两种思路: 1、实现一个init实现一个Service,来帮助Android应用程 序执行root权限的命令。 2、实现一个虚拟设备,这个设备帮助Android应用程序执 行root权限的命令。 本文将会选择第一种来解决Android应用程序mount NFS文件系统的问题。 Init.rcService 在Android系统init.rc中定义很多Service,具体定义格 式可以参考《AndroidPlatformDeveloper’sGuide》中的 “AndroidInitLanguage”。Init.rc中定义的Service将会被 Init进程创建,这样将可以获得root权限。 现在问题是Android应用程序怎样启动让init进程知道 我们想运行那个进程呢?答案是设置系统属性“ctl.start”, 把“ctl.start”设置为你要运行的Service,假设为“xxx”, Android系统将会帮你运行“ctl.start”系统属性中指定的 Service。那么运行结果init进程将会将会写入命名为 “init.svc.+Service名称”的属性中,也就是“init.svc.xxx”属 性,应用程序可以参考查阅这个值来确定Service执行的情 况。想更深入了解Androidproperty系统可以参考博文《(翻 译)Android属性系统》。 Androidproperty权限 难道Android属性“ctl.start”是所有进程都可以设置的 吗?那世界不就乱套了,谁都可以可以执行init.rc中Service 了,查看property_service.c中的源码,设置Android系统 属性的函数为handle_property_set_fd: 1:voidhandle_property_set_fd(intfd) 2:{ 3:...... 4:switch(msg.cmd){ 5:casePROP_MSG_SETPROP: 6:msg.name[PROP_NAME_MAX-1]=0; 7:msg.value[PROP_VALUE_MAX-1]=0; 8: 9:if(memcmp(msg.name,"ctl.",4)==0){ 10:if(check_control_perms(msg.value,cr.uid,cr.gid)){ 11:handle_control_message((char*)msg.name+4,(char*) msg.value); 12:}else{ 13:ERROR("sys_prop:Unableto%sservicectl[%s]uid: %dpid:%d\n", 14:msg.name+4,msg.value,cr.uid,cr.pid); 15:} 16:} 17:...... 18:} 19:} 从源码中我们发现如果设置“ctl.”开头的Android系统 property,将会调用check_control_perms函数来检查调用 者的权限,其定义如下: 1:staticintcheck_control_perms(constchar*name,intuid,intgid) { 2:inti; 3:if(uid==AID_SYSTEM||uid==AID_ROOT) 4:return1; 5: 6:/*SearchtheACL*/ 7:for(i=0;control_perms[i].service;i++){ 8:if(strcmp(control_perms[i].service,name)==0){ 9:if((uid&&control_perms[i].uid==uid)|| 10:(gid&&control_perms[i].gid==gid)){ 11:return1; 12:} 13:} 14:} 15:return0; 16:} 我们发现root权限和system权限的应用程序将会授权 修改“ctl.”开头的Android系统属性。否则将会检查 control_perms全局变量中的定义权限和Service。 如果想更深入的了解AndroidInit进程和Android Property的权限控制,请参考《AndroidPermission》。 实例