ContentProvider 和 Binder IPC

Posted

技术标签:

【中文标题】ContentProvider 和 Binder IPC【英文标题】:ContentProvider and Binder IPC 【发布时间】:2014-02-21 11:25:31 【问题描述】:

我对内容提供商有疑问.. 我们知道 binder 无法传输大量数据 (~>3MB),但即使内容提供商使用 binder IPC 权利也可能涉及 >3 MB 传输? 还是内容提供者直接在调用者进程内存空间中读取数据库,不涉及IPC?

请纠正我的理解。

【问题讨论】:

ContentProvider 有 Binders 限制,不能传输大于默认 Binders 事务大小的数据 感谢 pskink 的重播,我们知道 db 总数据可能超过默认的活页夹事务大小,所以当我使用 contentresolver 查询后获得光标时 .. 光标指向客户端进程空间中的整个数据?或者它只是指向不同进程空间中的一条记录并在 db 中对每条记录进行 IPC 调用?请纠正我 不幸的是,整个 CursorWindow 都从 ContentProvider 的进程复制到了客户端的进程中,也许 android:multiprocess 会有所帮助 正如我在单独的答案中所写,CursorWindow 没有被复制,而是作为一块共享内存传递。 【参考方案1】:

在最低级别,内容提供者使用基于共享内存 (ashmem) 的 CursorWindows。

查看 AOSP 源文件frameworks/base/libs/androidfw/CursorWindow.cpp,除了从系统级 ashmem 和 mmap 服务继承的限制之外,最低级别的 C++ 代码似乎没有对共享内存大小施加任何限制。

下一个代码层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。但是,如果您直接从 C++ 中使用androidfw/CursorWindow.h,使用 AOSP 标头,那么您可以使用更大的 CursorWindows。 (请注意,仅使用 NDK 是不够的,因为 CursorWindow 不是 NDK API 的一部分。)

【讨论】:

我是安卓新手。 CursorWindow 使用 ashmem 而不是堆有什么特别的原因吗? ashmem 怎么跟 SQLite DB 有关系?

以上是关于ContentProvider 和 Binder IPC的主要内容,如果未能解决你的问题,请参考以下文章

[Android5.1]ContentProvider的Binder通信分析

ContentProvider学习笔记

Android 7.0中ContentProvider实现原理

Android ContentProvider 性能

Android - IPC之ContentProvider简介

Android-Binder 简析