Java 详细描述write()从Android到硬件层的步骤

Java 详细描述write()从Android到硬件层的步骤,java,io,Java,Io,我需要从一开始就关注Android IO调用,直到接近硬件层 实际上,我需要的是像下面的例子中那样的一堆指向可靠来源的链接,这样一个人就可以很容易地跟随 这在观念上与这个不知名的问题非常相似 让我们看一个例子: FileOutputStream fos = OpenFileOutput(„filename”, Contex.MODE_PRIVATE) fos.write(somemeaninglessstring.getBytes()); 让我们想象一下,我们对写更感兴趣,但希望先遍历打开文件

我需要从一开始就关注Android IO调用,直到接近硬件层

  • 实际上,我需要的是像下面的例子中那样的一堆指向可靠来源的链接,这样一个人就可以很容易地跟随
  • 这在观念上与这个不知名的问题非常相似

    让我们看一个例子:

    FileOutputStream fos = OpenFileOutput(„filename”, Contex.MODE_PRIVATE)
    fos.write(somemeaninglessstring.getBytes());
    
    让我们想象一下,我们对写更感兴趣,但希望先遍历打开文件的几个步骤。我们从/frameworks/base/core/java/android/content/Context.java+ContextWrapper.java开始查看

    @Override
    public FileInputStream openFileInput(String name)
    
    嗯。接下来我们来看java.io.FileOutputStream.write(),接下来是基类java.io.OutputStream.write()

    。。。这就是我一直坚持的地方

    java.io.*是顶级包,OutputStream只在Object之后继承,所以-如何找到好的算法来检查JVM在java.io.OutputStream中使用write()做了什么

  • 我还想知道,如果我需要重复这个过程,是否有类似于ctags的东西可以加快这个过程,最好不要将整个分支导入Eclipse等等

  • Android是开源的(),因此您可以下载源代码并继续深入系统。

    我不确定这会有什么帮助。事实上,我确实喜欢挖掘,下载Android源代码或浏览在线存储库其实并不重要。顺便说一句,这个问题涉及Java的IO部分。我猜JVM内部应该有一个连接,通过JNI write(?),然后,Dalvik像任何其他linux应用程序一样使用linux write,而linux write最终使用syscall.OutputStream.write(int)是一个抽象方法,因此在派生类中实现,例如FileOutputStream最终使用
    IoBridge.write(fd、缓冲区、字节偏移量、字节计数)
    写入字节。接下来,进一步查找
    libcore.io.IoBridge
    的源代码。最终,您将到达linux系统调用。是的,流由libcore的io子系统使用。问题是-也许我遗漏了什么或我的解释不清楚-我如何想出一个算法,允许有人在这方面倒退se调用,只需浏览代码。可能更清楚的是:-person查看java函数,比如System.out.println。-可以向后移动,观察执行此命令时,合成层参与了哪些操作,如PrintStream的“out”对象和系统(以及数据在其中的修改和解析方式)。显而易见的问题是,回过头来看,找到“超级”类IoBridge并不总是一件小事。只要你在Java中,IDE就能帮上大忙。当跨越实现层边界时(Java->本机代码->内核)这变得更加困难。有时调试器可以帮助找出函数调用的堆栈。我仍然不太明白您想要的是什么样的算法。算法,或者更好的措辞是“查找方法”对于每个下一层应该向用户显示的源文件,从Android中的任何函数调用向后移动,通过Java、JNI、*libc,直到硬件细节。类似于在源代码中回溯callstack,然后向后…现在我已经这样写了,我觉得这听起来很疯狂:)
    public void write(byte[] buffer) throws IOException {
        write(buffer, 0, buffer.length);
    }