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

Dav*_*lds 2 io android xamarin

当我尝试在 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>();
    }
Run Code Online (Sandbox Code Playgroud)

sda*_*bet 7

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

  1. 启动外壳:

    $adb shell

  2. 查找您的应用程序的进程 ID:

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

  3. 列出您的应用程序打开的文件:

    shell@android:/ $lsof -p <pid>