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

Android 如何知道哪个应用程序正在读取或写入文件,android,linux,file,android-ndk,linux-kernel,Android,Linux,File,Android Ndk,Linux Kernel,在Android或Android NDK中是否有任何方法可以知道哪个应用程序正在磁盘或设备内存中读取或写入数据?我不知道是否有SDK方法可以做到这一点,但Linux将允许您列出进程/打开文件/套接字,您可以尝试从中获取内容 首先使用ps命令获取流程的PID,输入: $ ps -aef | grep {process-name} $ ps -aef | grep httpd 接下来将此PID传递给pfiles命令 $ pfiles {PID} $ pfile 3533 这是您列出firefox

在Android或Android NDK中是否有任何方法可以知道哪个应用程序正在磁盘或设备内存中读取或写入数据?

我不知道是否有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得到的

初始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__");
}

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

ls-l/proc/*/fd/

您不需要任何特殊的工具或根

说明

每个正在运行的进程都会在
/proc/
中获得一个以其pid命名的条目。对于每个pid,都是一个目录
fd
,带有符号链接,文件句柄的名称指向文件名

例如,一个条目可能

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

不幸的是,我们没有看到PID,但我们可以看到进程所有者
app_25

因此,我们可以研究
/data/data/
(使用
ls-l/data/data


所以它是application
com.android.mms

不清楚“在磁盘或设备内存中读取或写入数据”是什么意思,但我希望该工具能有所帮助。

谢谢您的回复,但我没有root权限,先生,我想要从磁盘写入或读取的进程的pid或进程名称。如果您有基本的APK权限,您如何想象查看其他进程的数据或四处窥探正在写入的内容?即使在linux上,如果没有sudo,你也无法做到这一点。我不想知道“what's writing where”我只想知道一些东西正在从内存中写入或读取,特别是正在写入或读取的应用程序名或pid,我想你是在做一个“notify on memory access”服务。。。我真的建议首先为Linux开发这个,然后将它移植到Android上,因为我想这些将共享很多低级别的unix代码。但是权限将是你最大的痛苦。我真的不认为没有sudo(或者更确切地说是APK权限)你就可以这么做。此外,AndroidManifest.xml必须有权限让你的应用程序在用户的手机内存中搜索,这可能会让一些人关闭你的应用程序。@user707424先生谢谢你的回复,我想你没有理解我,我想知道哪个应用程序正在内存中读取或写入文件,它可以是任何文件(可以是我的文件,也可以不是)(我将自己重命名为user707424到0x01af)Ok。这有点复杂,因为ls在android中非常基本:进程的PID是文件名的*部分。不幸的是,它没有显示出来。但是,如果您正在寻找用户提供的应用程序,您可以查看其所有者,并与该应用程序的安装基础进行比较answer@sixeightzero长官我写了ls-l命令的输出你能告诉我现在该怎么做吗?长官根据“sixeightzero”的评论,我粘贴了我的ls-l结果,我现在该怎么办?所谓“在磁盘或设备内存上读取或写入数据”,我的意思是我想知道哪个应用程序正在我们的设备内存或sd卡上读取或写入文件,而dumpsys在Android 2.3dumpsys上不工作。我测试的所有2.2和2.3设备上都适用dumpsys。其输出的格式可能略有不同。在2.3中,当我为某些服务运行dumpsys Programminal时,它会说“权限拒绝:无法从pid=356,uid=10035转储MediaPlayerService”,并且它如何解决我的问题,请告诉我,我将非常有助于您重新阅读您的问题。一开始我以为你想用代码来做这件事。。。现在我明白了,您只需要一个内存驻留调试器,比如softICE或一些可以在内存访问上设置断点的调试器。@Shark我想通过自己编写代码来实现这一点,然后我想您需要弄清楚如何授予APK root权限;我不想听起来有冒犯之意,但看起来你在做某种嗅探器——因此,在我看来,弄清楚如何提升你的应用程序将是第一个主要问题。@Shark看看这是python中的代码,你能通过将以下代码转换为C代码吗?因为我根本不知道python看起来是可行的,试试看:)
...
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
...