求助:
应用层的文件浏览器里使用的是java的FILE file; file.listFiles()函数来列出目录下的所有文件,那怎么来看这个函数不断向底层调用的过程呢?
比方说像网上很多牛人分析的发短信的流程一样,一个函数调用一个函数,最后一直到驱动层。
我就想知道这种文件浏览的过程是怎么样的。

这个说起来流程蛮多,反正大概就是:
1. android的java实现是在libcore/luni中,file.listFiles()在libcore/luni/src/main/java/java/io/File.java中,
public File[] listFiles() {
return filenamesToFiles(list());
}
这里的list()是各个file的信息集合,方法如下:
public String[] list() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
if (path.isEmpty()) {
return null;
}
return listImpl(absolutePath);
}
这里看到调用到listImpl方法,这是个native方法:private static native String[] listImpl(String path);在libcore/luni/src/main/native/java_io_File.cpp中:
static jobjectArray File_listImpl(JNIEnv* env, jclass, jstring javaPath) {
// Read the directory entries into an intermediate form.
DirEntries files;
if (!readDirectory(env, javaPath, files)) {
return NULL;
}
// Translate the intermediate form into a Java String[].
jobjectArray result = env->NewObjectArray(files.size(), JniConstants::stringClass, NULL);
for (int i = 0; files.size() != 0; files.pop_front(), ++i) {
ScopedLocalRef<jstring> javaFilename(env, env->NewStringUTF(files.front()));
if (env->ExceptionCheck()) {
return NULL;
}
env->SetObjectArrayElement(result, i, javaFilename.get());
if (env->ExceptionCheck()) {
return NULL;
}
}
return result;
}
这里调用到readDirectory方法,实现如下:
static bool readDirectory(JNIEnv* env, jstring javaPath, DirEntries& entries) {
ScopedUtfChars path(env, javaPath);
if (path.c_str() == NULL) {
return false;
}
ScopedReaddir dir(path.c_str());
if (dir.isBad()) {
return false;
}
const char* filename;
while ((filename = dir.next()) != NULL) {
if (strcmp(filename, ".") != 0 && strcmp(filename, "..") != 0) {
if (!entries.push_front(filename)) {
jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
return false;
}
}
}
return true;
}
最后可以看到使用ScopedReaddir dir(path.c_str());来读取dir信息.
ScopedReaddir是个class,其构造函数如下:
ScopedReaddir(const char* path) {
mDirStream = opendir(path);
mIsBad = (mDirStream == NULL);
}
可以看到,最后是调用了linux文件操作方法opendir,这个在dirent.h中能找到
实现在libc里面(android的glibc实现是在bionic/libc下)的unistd/opendir.c中找到
DIR* opendir( const char* dirpath )
{
DIR* dir = malloc(sizeof(DIR));
if (!dir)
goto Exit;
dir->_DIR_fd = open(dirpath, O_RDONLY|O_DIRECTORY);
if (dir->_DIR_fd < 0)
{
free(dir);
dir = NULL;
}
else
{
dir->_DIR_avail = 0;
dir->_DIR_next = NULL;
pthread_mutex_init( &dir->_DIR_lock, NULL );
}
Exit:
return dir;
}
这个open最终又会调用到内核的open函数,然后继续调用内核相关方法,找不到了
又找了下:反正要调用到系统调用open,这些显然用汇编写的,比如arch-arm/systcalls/_open.S
.type __open, #function
.globl __open
.align 4
.fnstart
__open:
.save {r4, r7}
stmfd sp!, {r4, r7}
ldr r7, =__NR_open
swi #0
ldmfd sp!, {r4, r7}
movs r0, r0
bxpl lr
b __set_syscall_errno
.fnend
这就是系统调用的open方法的实现,我这是一头雾水了哈哈。
分享到:
相关推荐
Android WIFI 应用层框架分析是从应用程序的角度描述 Android WIFI 的工作流程,主要介绍了各个控制接收模块的数据走向,具体数据传输流程和所调用到的方法介绍。本文将从 WIFI 初始化、WIFI 启动、开始扫描 AP、...
《Android系统底层到应用层全方位剖析》 在深入探讨Android系统之前,让我们先明确一个概念:Android是一个基于Linux内核的开源操作系统,广泛应用于智能手机、平板电脑和其他智能设备。它由谷歌公司领导开发,旨在...
它可能涵盖了如何编译内核、构建HAL、修改框架层代码以及调试应用程序等方面的指导。 总的来说,从Android kernel到App的流程涉及了系统层面的深度理解,包括内核与硬件的交互、硬件抽象、系统服务的管理和应用程序...
在Android系统中,开发流程涉及四个主要层次:驱动层、HAL层(硬件抽象层)、服务层和应用层。本文将重点解析s5p4418芯片在Android 4.4.2版本上的应用程序开发,特别是针对APP应用的源码分析。 首先,驱动层是...
8. **系统启动流程**:从Bootloader到Zygote,再到System Server,理解Android系统启动的每一个阶段,对于系统定制和故障排查至关重要。 9. **性能优化**:包括CPU调度、内存管理、电池寿命等方面的优化,是底层...
在Android应用层,这通常涉及到BroadcastReceiver监听ACTION_SHUTDOWN或ACTION_REBOOT广播事件。 2. **应用程序框架层**:当收到关机或重启请求时,系统会发送一个系统级广播。注册了相应广播接收器的应用程序会...
《Android底层开发实战》这...通过阅读《Android底层开发实战》,开发者不仅可以掌握Android底层开发的基础知识,还能学习到如何解决实际开发中遇到的问题,提升系统级优化能力,从而成为一名更全面的Android开发专家。
《Android系统源代码分析》是一本深度探讨Android操作系统内核及其组件的专业书籍,对于从事Android应用或系统开发的工程师来说,具有极高的学习价值。这本书旨在帮助开发者理解Android系统的内部工作机制,从而提升...
总之,"Android 串口JNI代码"是指使用JNI技术在Android平台上实现串口通信功能,允许应用程序与外部硬件设备进行数据交换。通过创建本地方法并在C/C++层面处理串口操作,开发者可以绕过Android SDK的限制,实现更...
1. **启动流程**:从bootloader到Zygote进程的启动,再到系统服务的初始化,理解这些步骤有助于优化系统启动时间和性能。 2. **进程与线程管理**:Android如何创建、调度和销毁进程与线程,以及进程间通信(IPC)...
这份光盘的内容可能包括了从底层驱动到上层应用程序框架的完整源码分析,旨在帮助开发者、研究人员以及对Android系统感兴趣的人员深化对系统的认识。 在Android系统源代码中,我们可以学习到以下几个核心知识点: ...
《Android系统源代码分析》是由李俊编著...通过阅读《Android系统源代码分析》,开发者不仅可以深化对Android系统底层运作的理解,还能提高解决实际问题的能力,无论是进行系统级优化还是开发创新应用,都将受益匪浅。
HAL使得Android能够支持多种硬件平台,而无需修改应用层代码。 3. **库和运行时**:Android系统包含大量C/C++库,如Bionic libc、SQLite、OpenSSL等,这些库提供了系统功能和服务。此外,Dalvik虚拟机(在较早版本...
《深入理解Android5源代码》是...通过对这些主题的深入探讨,《深入理解Android5源代码》为读者提供了一个全面了解Android系统底层运作的机会,有助于开发者提升技能,解决实际问题,构建更高效、更稳定的Android应用。
Apk是Android应用程序的打包格式,包含了应用的所有代码、资源和元数据。在Apk中,开发者通常使用Java或Kotlin等高级语言编写应用程序逻辑。由于Android系统主要基于Java,因此这些应用程序运行在Dalvik或ART虚拟机...
7. **权限管理(Permissions)**:Android的权限模型在不同版本中有所变化,源代码能帮助开发者理解权限检查和权限请求的流程,避免因权限问题导致的功能受限。 8. **硬件抽象层(Hardware Abstraction Layer, HAL...
3. **Java层**:JNI(Java Native Interface)允许Java代码调用C/C++库,这样在Android应用中就可以控制LED。 4. **应用程序**:最终用户界面,通过调用Java层的接口来控制LED的行为。 了解这一全过程有助于开发者...
7. **Android框架层**:包括ContentResolver、Intent、Broadcast等,这些都是应用程序与系统服务通信的重要接口,深入理解它们可以帮助开发出更高效的应用。 8. **Native层**:C/C++编写的库和系统服务,如HAL...
8. **Android源码分析**:通过分析AOSP源码,开发者可以深入理解系统底层的工作机制,例如Activity启动流程、广播接收者的工作原理,或者是系统服务的实现,这对优化应用性能和解决兼容性问题非常有帮助。...
源代码的开放性是 Android 平台的一大特点,它允许开发者深入理解系统的底层运作,并进行自定义修改、优化或者开发自己的应用程序。这份源代码对于软件工程师、系统开发者以及对 Android 内核感兴趣的爱好者来说具有...