列出我的Android App打开的所有文件

时间:2016-02-22 15:48:12

标签: android xamarin io

当我尝试写入我的Xamarin / Android应用程序中的文本文件时,我间歇地得到太多打开文件异常。 我知道这是因为每个Android应用程序都限制了它可以打开的文件数量,显然我的应用程序在某些情况下超出了它。因此,我必须保留一些文件打开/不在某处妥善处理它们。 我想知道我是否可以以编程方式列出我的应用程序在任何给定时间打开的文件?显然操作系统知道这一点,是否可以在我的应用程序中执行此操作?这将帮助我找到问题。

感谢小提琴手,这就是我解决它的方式,万一其他人将来需要这样做(在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 个答案:

答案 0 :(得分:2)

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

1)启动shell:

$ adb shell

2)找到您应用的进程ID:

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

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

shell@android:/ $ lsof <pid>