看了授权管理(superuser)的源码,部分有些不解。superuser apk很好理解,就是弹框给用户确认是否授权,反倒是su程序有一点不解, su的文件owner是root,具有suid属性,这样就导致任何普通app,比如app1,运行su xxx命令时,su进程将以euid=root运行,uid仍然继承至app,所以还是app1。su中启动superuser request activity,由用户确认是否授权,如果是的话,则su程序紧接着调用setuid(0)和setgid(0)将自身进程的uid也设置为root,这是为后续执行shell命令打基础,因为只有这样才能保证su中创建sh进程为app1执行命令时,sh进程的uid是root。从这里看,app每次调用su xxx来运行shell命令都能以root的身份运行,这个很好理解。但是,我发现像root explorer这样的app,他获取root时,只调用了su命令,接下去就再也没有调用过su xx, 但是却可以完成所有的操作了,这个真的奇怪,ps看信息,root explorer app的uid还是appxx,并没有变成root,从su的源码也可以看到,他只是提升了自己进程的uid,euid,并没有提升请求的app(父进程)的uid,euid。 那么为什么root exploree只运行了"su"这样一条命令就ok了哪。