【问题标题】:How to know which application is reading or writing file如何知道哪个应用程序正在读取或写入文件
【发布时间】:2012-08-31 06:07:25
【问题描述】:

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

【问题讨论】:

  • 我重新阅读了您的问题。起初我以为你想通过代码来做到这一点......现在我发现你只需要一个像 softICE 这样的内存驻留调试器或可以在内存访问上断点的东西。
  • @Shark 我想通过代码本身来做到这一点
  • 那我猜你需要弄清楚如何给你的APK root权限;我不想听起来冒犯或任何东西,但看起来你正在做某种嗅探器 - 所以弄清楚如何提升你的应用程序将是 imo 的第一个主要问题。
  • @Shark 看看这个guichaz.free.fr/iotop这是python中的代码,你可以通过sourceforge.net/projects/py2cmod/files/latest/download将下面的代码转换成C代码吗,因为我根本不懂python
  • 看起来可行,试一试:)

标签: android linux file android-ndk linux-kernel


【解决方案1】:

我不知道是否有 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__");
}

【讨论】:

  • 感谢您的回复,但我没有 root 权限,先生,我想要正在从磁盘写入或读取的进程的 pid 或进程名称
  • 如果您拥有基本的 APK 权限,您如何想象处理其他进程的数据或窥探正在写入的内容?即使在 linux 上,没有 sudo 也无法做到这一点。
  • 我不想知道“写在哪里”,我只想知道正在写入或从内存中读取的内容,特别是正在写入或读取的应用程序名称或 pid >
  • 我猜你正在制作一个“内存访问通知”服务......我真的建议先为 Linux 开发这个,然后将它移植到 Android,因为我猜这些会分享很多低级的unix代码。但是 PERMISSIONS 将是您的最大痛点。我真的不认为没有 sudo (或者更好地使用 APK 权限)你可以做到这一点......
  • 此外,AndroidManifest.xml 必须有权限让您的应用在用户的手机内存中搜索,这可能会导致某些人关闭您的应用。
【解决方案2】:

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

ls -l /proc/*/fd/

您不需要特殊的工具或根。

解释

每个正在运行的进程都会在/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 先生,谢谢你的回复,我想你没听明白,我想知道哪个应用程序正在读取或写入内存中的文件,它可以是任何文件(可以是我的文件或不是)
  • (我将自己重命名为 user707424 为 0x01af)好的。这有点复杂,因为 ls 在 android 中是非常基本的:进程的 PID 是文件名的 * 部分。不幸的是它没有显示。但是如果你正在寻找用户提供的应用程序,你可以看看所有者并与应用程序的安装基础进行比较。
  • 我在回答中添加了解释
  • @sixeightzero 先生,我写了我的 ls -l 命令的输出,你能告诉我现在应该做什么吗?
  • 先生,根据“sixeightzero”评论,我粘贴了我的 ls -l 结果,我现在该怎么办?
【解决方案3】:

不清楚您所说的“在磁盘或设备内存上读取或写入数据”是什么意思,但我希望dumpsys 工具可以提供帮助。

【讨论】:

  • 通过“在磁盘或设备内存上读取或写入数据”我的意思是我想知道哪个应用程序正在我们的设备内存或 sd 卡上读取或写入文件,而 dumpsys 不起作用安卓 2.3
  • dumpsys 适用于我测试的所有 2.2 和 2.3 设备。其输出的格式可能略有不同。
  • 在 2.3 中,当我为某些服务运行 dumpsys programmatic-ally 时,它显示“Permission Denial: can't dump MediaPlayerService from pid=356, uid=10035”,它如何解决我的问题,请告诉我会对你很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2015-09-01
相关资源
最近更新 更多