当前位置: 首页 > 知识库问答 >
问题:

列出我的Android应用程序打开的所有文件

沈冠宇
2023-03-14

当我试图在Xamarin/Android应用程序中写入文本文件时,我会间歇性地遇到太多打开文件异常。我明白这是因为每个Android应用程序都有打开文件的数量限制,很明显,我的应用程序在某些情况下超过了它。因此,我必须留下一些文件打开/没有妥善处理。我想知道我是否可以通过编程列出我的应用程序在任何给定时间打开的文件?显然,操作系统知道这一点,有可能在我的应用程序中做到这一点吗?这将帮助我发现问题。

多亏了fiddler,我才解决了这个问题,以备将来有人需要(在C#/Xamarin中):

private static List<string> m_commandData;

    private static void GetOpenedFiles()
    {
        m_commandData = new List<string>();
        RunCommand("lsof");

        RunCommand("ps | grep TestNoFilesOpen");

    }

    private static void RunCommand(string command)
    {
        string data;
        using (Java.Lang.Process process = Java.Lang.Runtime.GetRuntime().Exec(command))
        {

            Stream stream = process.InputStream;

            StreamReader bodyReader = new StreamReader(stream);

            data = bodyReader.ReadToEnd();
        }
        m_commandData.Add(data);

    }

    private static void WriteCommands()
    {
        for (int i = 0; i < m_commandData.Count; i++)
        {

            using (TextWriter tw = new StreamWriter(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/NoFilesOpen/adb_" + i.ToString() + ".txt"))
            {
                tw.Write(m_commandData[i]);
                tw.Close();
            }
        }

        m_commandData = new List<string>();
    }

共有1个答案

柴丰
2023-03-14

您可以在ADB shell中使用Unix lsof命令。

1)启动shell:

$ adb shell

2) 查找应用程序的进程ID:

shell@android:/ $ ps | grep <packagename>

3)列出您的应用打开的文件:

shell@android:/ $ lsof <pid>
 类似资料:
  • 在通知部分,我有这个通知不打开APP的问题。有什么建议吗?我试了很多可能性,但没有...我错在哪里?请帮帮我。

  • 我的程序是采取任何类型的文件和打开他们自己。 我已经试过了 我只使用文件获得正确的数据。

  • 我用保存了一个文件。我的应用程序中的docx扩展名。该文件保存在sdcard中。该文件在我的sdcard中显示为word文件,但我无法打开它(使用polaris或任何其他默认软件),并显示消息“不支持的文件”。 当我保存扩展名为. txt的文件时,我可以打开它。 谢谢亚历山德鲁...但现在我在运行应用程序时收到一条错误消息,指出“此元素的Javadoc既无法在附加的源代码中找到,也不能在附加的Ja

  • 问题内容: 假设您的应用程序所做的很多事情都与读取文件内容有关。不用说,打开然后关闭的文件很有效,除非…新文件的传入速度比旧文件快。这是我发现自己遇到的情况的泡菜。 现在,有没有办法可靠地知道该进程打开了多少文件?像从JVM内部看一样可靠的东西吗? 我怀疑答案可能是特定于操作系统的,所以让我补充一点,我在Linux上运行Java。 问题答案: 在Unix上,一种方法是使用获取方法,如果是,则可以使

  • 问题内容: 我正在为Android开发一个应用程序,我不需要我的应用程序将日历作为其中的一部分(加上它会破坏目的),我的应用程序允许用户收听广播,并且需要选择设置事件到(记住在特定时间收听广播),如果应用程序具有自己的日历,则事件警报仅在用户打开应用程序时才会响起……毫无意义。我一直在寻找但找不到,有没有办法使用意图或其他方式打开Goog​​le日历或Android可能具有的其他日历?我需要将我的

  • 我有一个使用Spring mvc和Spring Security Eclipse Maven web项目。当我真的启动它时,它没有成功地初始化上下文: 更多详情如下: 这是我的 这是我的 我的问题是,当我启动应用程序时,我会出现类似的错误 它说它找不到但是我没有把它放进中,我的配置文件是