我对内容提供商有疑问.. 我们知道 binder 无法传输大量数据 (~>3MB),但即使内容提供商也使用 binder IPC 权利,这可能涉及 >3 MB 传输?或者内容提供者直接在调用者进程内存空间中读取数据库并且不涉及IPC?
请纠正我的理解。
我对内容提供商有疑问.. 我们知道 binder 无法传输大量数据 (~>3MB),但即使内容提供商也使用 binder IPC 权利,这可能涉及 >3 MB 传输?或者内容提供者直接在调用者进程内存空间中读取数据库并且不涉及IPC?
请纠正我的理解。
在最低级别,内容提供者使用基于共享内存 (ashmem) 的 CursorWindows。
查看 AOSP 源文件frameworks/base/libs/androidfw/CursorWindow.cpp
,最低级别的 C++ 代码似乎没有对共享内存大小施加任何限制,除了从系统级 ashmem 和 mmap 服务继承的限制。
下一个代码层,frameworks/base/core/jni/android_database_CursorWindow.cpp
似乎也没有对光标窗口大小施加任何限制。
Java 代码frameworks/base/core/java/android/database/CursorWindow.java
从 Android 框架的内部配置值中读取缓冲区大小config_cursorWindowSize
,至少在 KitKat 中,默认值似乎是 2048。因此,如果您使用普通的 Java 接口,在 KitKat 中,最大 CursorWindow 大小为 2 Mb。但是,如果您androidfw/CursorWindow.h
直接从 C++ 使用 AOSP 标头,那么您可以使用更大的 CursorWindows。(请注意,仅使用 NDK 是不够的,因为 CursorWindow 不是 NDK API 的一部分。)