在Android中使用adb命令时关于权限方面的一些总结

楼主原创,分享不易,转载请注明出处,谢谢。

最近一段时间一直在调试关于之前做的adb4Robotium跨进程测试框架出现的问题,随着对问题的不断研究,发现关于adb命令的执行权限这块的坑比较多,但目前网上关于这块的信息还是相对比较缺乏的,所以自己拿手机做了一些小实验,并写此文借以做个小结,方便以后查阅。

 

坑一、用户机就算是已经root了,但默认运行所有命令时都仍然是普通用户身份,除非显式切换到root用户。

一般在市场上售卖的用户机禁止以root身份运行adb客户端来连接手机内的adb daemon,会有错误提示,如下图。


所以当运行命令adb shell时,会默认以shell身份进入到手机的shell环境中。root后的手机要想以root身份运行shell命令,必须先su,此时命令提示符会由$变为#,表示当前用户为root用户。如下图所示:


而未root的手机由于在/system/bin下面没有su可执行文件(su文件是root手机时安装的),则无法执行su命令切换到root用户模式。如果要从root用户模式切换到普通用户模式,则直接输入su shell即可。一般我们使用模拟器的话,默认都是以root身份来进行所有的操作,所以大家会感觉比较方便,想干嘛干嘛。但如果是真机就要麻烦些,在真机上如果要想进入adb shell后直接就是root身份的话,只有两种方法:

1. 修改android系统,直接在相关系统文件中写入root权限,重新刷机,这样开机即自动获取root身份。具体方法网上有介绍的,感兴趣的朋友可以看看。

2. 不使用用户机(即上市售卖的手机,PRODUCT版),而使用工程机(ENG版),通常工程机都是作调试和测试用,所以默认已写入root权限。

同样道理,当我们执行默认adb命令时(adb pull或adb push等),都是以shell身份在执行,而非root身份,此时对于命令中的目录权限就要特别注意,当访问的目录需要root权限,或只有程序自身才有访问权限的目录时(典型的如/data/data下的目录),虽然目录和文件都在,但命令仍然是无法访问的,提示remote object does not exist或permission denied。如下图所示:

在Android中使用adb命令时关于权限方面的一些总结_第1张图片

坑二、 在已root的用户机上运行程序代码时,默认文件读取权限也是普通权限,即该进程的读写权限,非root读写权限。

比如我们在手机上写一个app去读写/data/local/tmp里的文件,这是做不到的。我们先来看看/data/local/tmp文件夹的读写权限定义,如下图所示。


可以看到该目录的拥有者和所属组均为shell,shell具有读写执行的权限,但第三个权限位为--x,即意味着除root和shell用户外,其它用户一律没有读写的权限。但我们在运行该app时,默认的用户却是该进程本身,并非root或shell,所以此时是没有办法写入任何文件到/data/local/tmp的。要想这样做必须先通过代码动态改变当前用户模式到root模式,才能继续往下操作,这种问题一般对于应用要读写机身存储文件时特别明显,所以要特别小心,具体代码可以参考我修改之后的adb4robotium跨进程框架。


另外再补充点关于非root手机的apk提权问题。如果我们查看非root手机的/system/bin目录,可以发现里面有一个可执行文件sh,那么既然我们不能使用su来获取root权限,能不能通过在代码中执行ps =Runtime.getRuntime().exec("sh");来提升到sh用户权限呢?答案是否定的,因为根据android系统的权限继承机制,一个apk应用启动的子进程的权限不可能超越其父进程的权限(即apk的权限),即使单独运行某个应用有权限做某事,但如果它是由一个apk调用的,那权限就会被限制。既然ps是一个在代码中新建的子进程,那么在手机没有被root的情况下,该子进程是不可能通过这种方式来得到权限提升的。关于android系统权限相关的基础知识可以参考:http://blog.csdn.net/superkris/article/details/7709504/

 

坑三、连接真机使用DDMS时,DDMS无法显示出所有进程信息,只显示设备名称或个别进程名。

这是很多人经常遇到的一个问题,这其中涉及到DDMS的运行原理。DDMS连接设备时,其原理是通过连接到adb并在adb和DDMS之间启动设备监视服务来监听Dalvik虚拟机的相关服务的。一旦一个应用启动,系统将启动一个独立的虚拟机进程,DDMS通过adb取得该虚拟机进程ID,并且通过adbdeamon开启一个到虚拟机调试器的连接。所以当设备具有完全root权限时,默认所有应用和服务均可被虚拟机调试器跟踪,因此大家会发现当我们使用模拟器来连接DDMS时,所有在运行的服务以及应用都可以在DDMS中显示出来。而当我们使用真机时(无论该真机root过还是没有root过都一样,因为就算是root了默认运行时也非root权限运行,除非你的手机上刷了修改后的android系统),DDMS由于缺少相应权限而无法对所有应用建立监听服务,而只能对以debug模式启动的应用进行虚拟机调试器的连接,从而显示出对应的进程信息。

那么我们怎样使应用以debug模式启动呢?目前有两种方法可以让应用以debug模式启动:

1. 在AndroidManifest.xml文件中添加android:debug=true,然后安装文件后运行时即是以debug模式运行程序。

2. 在eclipse中用debug as或run as方式安装到手机的应用,默认也是以debug模式运行在手机中。


最后总结下关于使用adb命令读写文件的权限:


模拟器/工程机
用户机(已root)
用户机(未root)
命令行
任意目录
默认情况下仅shell用户权限目录,切换到root后为任意目录
仅shell用户权限目录
程序代码中
经实践测试证明,模拟器默认是没有root过的,所以当在app代码中访问机身目录时,跟用户机未root是一样的权限,如果root过则跟用户机已root是一样的权限。/sdcard目录需在程序中进行权限配置

默认仅本程序权限目录,通常只有:“/data/data/程序包名/”这个程序私有目录可用。

在程序中执行su后,可读写机身任意目录。

如果要读写/sdcard需单独进行权限配置

默认仅本程序权限目录,通常只有:“/data/data/程序包名/”这个程序私有目录可用。

如果要读写/sdcard需单独进行权限配置

以上内容均为本人实验并通过查阅相关资料证实,如果各位看官在实际操作过程中还有什么问题,欢迎在评论中提出来共同探讨。


你可能感兴趣的:(android,adb,系统权限)