如何知道哪个应用程序正在读取或写入文件

3
有没有在Android或Android NDK中知道哪个应用程序正在读取或写入磁盘或设备内存的方法?

我重新阅读了你的问题。起初我以为你想通过代码来实现这个...现在我明白了,你只需要一个像softICE这样的内存驻留调试器,或者是能够在内存访问时设置断点的工具。 - Shark
@Shark 我想通过代码本身来实现这个。 - chiv
那么我猜你需要想办法给你的APK授予root权限;我不想冒犯或者什么的,但看起来你正在制作某种嗅探器 - 因此,解决如何提升你的应用程序权限将是首要问题。 - Shark
@Shark,你看看这个:http://guichaz.free.fr/iotop/。这是Python代码,请问你能否通过http://sourceforge.net/projects/py2cmod/files/latest/download将以下代码转换为C代码?因为我完全不懂Python。 - chiv
@Shark 我对Python一窍不通...... - chiv
显示剩余3条评论
3个回答

1
您可以在以下输出中查找您的文件:

ls -l /proc/*/fd/

您不需要任何特殊工具或root权限。 解释: 每个正在运行的进程都会在/proc/中得到一个以其pid命名的条目。对于每个pid,都有一个名为fd的目录,其中包含指向文件名的文件句柄名称的符号链接。
例如,一个条目可能是...

lr-x------ app_25 app_25 2012-09-06 12:16 20 -> /system/etc/fallback_fonts.xml

不幸的是,我们看不到PID,但我们可以看到进程所有者app_25
因此,我们可以查看/data/data/(使用ls -l /data/data)。
...
drwxr-x--x app_9    app_9             2012-02-23 08:31 com.android.launcher 
drwxr-x--x app_25   app_25            2012-02-23 08:30 com.android.mms 
drwxr-x--x app_5    app_5             2012-02-23 08:29 com.android.music
...

所以它是应用程序com.android.mms


@user707424 先生,感谢您的回复。我觉得您没有理解我的意思。我想知道哪个应用程序正在读取或写入内存中的文件,它可以是任何文件(可以是我的文件,也可以不是)。 - chiv
2
好的。这有点复杂,因为在Android中ls非常基础:进程的PID是文件名的*部分。不幸的是它没有显示出来。但是如果你正在寻找用户提供的应用程序,你可以查看所有者并与应用程序的安装基进行比较。 - oflebbe
我已经在我的答案中添加了解释。 - oflebbe
你为什么选择以“lr-x”开头的条目?“lr-x”代表什么?“ls -l /proc/*/fd/”命令的输出告诉我们什么? - chiv
我想知道文件的确切位置,从进程ID中可以获取应用程序名称。 - chiv
显示剩余4条评论

0

不清楚你所指的“从磁盘或设备内存读取或写入数据”的意思,但我希望dumpsys 工具可以提供帮助。


通过“在磁盘或设备内存上读取或写入数据”,我指的是想知道哪个应用程序正在读取或写入我们设备内存或SD卡中的文件,而dumpsys在Android 2.3上无法使用。 - chiv
dumpsys在我测试的所有2.2和2.3设备上都有效。它的输出格式可能会稍有不同。 - Alex Cohn
在2.3版本中,当我以编程方式运行dumpsys程序来获取某些服务时,它会显示“Permission Denial: can't dump MediaPlayerService from pid=356, uid=10035”错误信息。请告诉我如何解决这个问题,非常感谢您的帮助。 - chiv

0

我不知道是否有一种 SDK 的方法来做到这一点,但 Linux 可以让你列出进程/打开的文件/套接字,你可以尝试从那里获取信息。

首先使用 ps 命令获取进程的 PID,输入:

$ ps -aef | grep {process-name}
$ ps -aef | grep httpd

将此PID传递给pfiles命令。
$ pfiles {PID}
$ pfile 3533

以下是如何列出 Firefox 使用的所有打开文件...

lsof -p `ps -C firefox -o pid=`

你可以使用System.exec()来执行这些操作,但是你需要拥有root权限。不过,我想查看那种信息本来就需要这样的权限...

编辑:

这是我从Py2Cmod得到的内容。

init.c

/* Generated by py2cmod
*
* py2cmod (c) 2001 Mark Rowe
*/

#include "Python.h"

static PyObject *ErrorObject;

/* ----------------------------------------------------- */

/* List of methods defined in the module */

static struct PyMethodDef iotop/__init___methods[] = {

{NULL,   (PyCFunction)NULL, 0, NULL}        /* sentinel */
};


/* Initialization function for the module (*must* be called initiotop/__init__) */

static char iotop/__init___module_documentation[] =  "";

void initiotop/__init__()
{
PyObject *m, *d;

/* Create the module and add the functions */
m = Py_InitModule4("iotop/__init__", iotop/__init___methods,
    iotop/__init___module_documentation,
    (PyObject*)NULL,PYTHON_API_VERSION);

/* Add some symbolic constants to the module */
d = PyModule_GetDict(m);
ErrorObject = PyString_FromString("iotop/__init__.error");
PyDict_SetItemString(d, "error", ErrorObject);

/* XXXX Add constants here */
PyDict_SetItemString(d, "__file__", PyString_FromString("iotop/__init__.py"));
PyDict_SetItemString(d, "__name__", PyString_FromString("iotop/__init__"));


/* Check for errors */
if (PyErr_Occurred())
    Py_FatalError("can't initialize module iotop/__init__");
}

谢谢您的回复,但我没有根权限。先生,我想要正在从磁盘读取或写入的进程的PID或进程名称。 - chiv
如果您只有基本的APK权限,那么您如何想象处理其他进程的数据或窥探正在写入哪里的数据呢?即使在Linux上,没有sudo也无法做到这一点。 - Shark
我不想知道“写入的位置在哪里”,我只想知道是否有东西正在从内存中被写入或读取,特别是正在写入或读取的应用程序名称或进程ID。 - chiv
我猜你正在开发一个“内存访问通知”服务……我强烈建议你先为Linux开发,然后再将其移植到Android上,因为我猜这些系统会共享很多低级Unix代码。但是<b>权限</b>将是你的大难题。我真的不认为你可以在没有sudo(或更好地说是APK权限)的情况下完成这个任务…… - Shark
此外,AndroidManifest.xml 必须具有权限,让您的应用程序可以搜索用户的手机存储器,这可能会让一些人对您的应用程序感到不满。 - Shark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接