2017-04-20 94 views
0

我想在我的Android应用程序执行ps命令,因为这样的:运行ps命令外壳程序

try { 
    Process process = Runtime.getRuntime().exec("ps"); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    int read; 
    char[] buffer = new char[4096]; 
    StringBuffer output = new StringBuffer(); 
    while ((read = reader.read(buffer)) > 0) { 
     output.append(buffer, 0, read); 
    } 
    reader.close(); 

    // Waits for the command to finish. 
    process.waitFor(); 
    Log.d(TAG, output.toString()); 
} catch (IOException e) { 

} catch (InterruptedException e) { 

} 

我在三星Galaxy S6棒棒糖测试它。它运行,但我看到的只是根拥有的进程。

虽然在Nexus 5上使用棉花糖,但我没有看到根拥有的进程,但我看到很多其他进程。这还不是一个完整的清单。

Android中是否有某种保护措施阻止我在某些设备/操作系统版本中看到完整进程列表?

回答

1

是的,有多种机制。在Linux上,ps通过/proc文件系统工作。到目前为止,牛轧糖是最严格的,platform/system/core.git#c39ba5a:根本看不到任何/proc/PID属于其他用户。

启用hidepid = 2的/ proc

添加下面的安装选项/ proc文件系统:

hidepid=2,gid=3009 

这种变化块的/ proc访问,除非你在组是3009 (又名AID_READPROC)。

/proc访问也受到platform/system/sepolicy.git中的各种规则的限制,其中一些适用于早期版本。

+0

谢谢。 “top”命令是否也受到同样的限制?我试图实现的是寻找与我自己的包名相同的进程,但使用不同的UID,以及使用与我相同的UID查找进程,但使用不同的包名称。有没有办法做到这一点? – user1118764

+0

@ user1118764是的,'top'也为进程信息使用相同的文件系统接口。我不明白你的目标吗?所有Android软件包都有唯一的软件包名称,每个软件包都有一个唯一的UID(每个用户),除非两个软件包使用相同的密钥*和*声明相同的['sharedUserId'](https://developer.android.com /guide/topics/manifest/manifest-element.html#uid)。 – ephemient

+0

你所描述的是Android的正常行为。但是,有些情况并非如此。我试图检测这些情况。 – user1118764