问题点6:Android(原生) BT 中BluetoothSocket.java中InputStream已被重写
---在原生Framework中,我们看到在BluetoothSocket.java中使用InputStream中的read进行数据读取,但在实际checking中发现InputStream 中的read、write和close已经被重写;
-->当我们执行Java层的Socket 监听函数bindListen时,
发现原生Source Code 中并没有直接使用ParcelFileDescriptor 中方法进行数据操作,而是通过交给LocalSocket并得到InputStream 和OutputStream;(Note: 关键点在此:mSocket.getInputStream和mSocket.getOutputStream)
-->执行readInt 函数进行4Byte数据监听,来获取Channel ID;
-->调用readAll 方法,在此函数中最终调用read();
Attention:如果我们checking Code ,很可能就直接理解为其是调用InputStream中的read 方法;---这是有偏差的;
关键在前面的mSocket.getInputStream中;
-->在getInputStream中,其调用类LocalSocketImpl 中的getInputStream
-->SocketInputStream extend InputStream,并重写了read等方法;
SocketOutputStream重写了OutputStream
-->重写后的Read方法,调用JNI 方法readba_native进行data 读取,
最终实现在android_net_LocalSocketImpl.cpp (frameworks\base\core\jni)
-->C++层:socket_readba -->socket_read_all-->recvmsg;
小结:所以BluetoothSocket中的read和write等操作,Code表面是调用InputStream 和OutputStream进行操作,但实际上这里的InputStream 和OutputStream已被重写,最终调用的是C++中的socket 操作方法并返回读取到的data。