2014-02-21 73 views
2

我對內容提供者有疑問..我們知道binder不能傳輸大量數據(〜> 3MB),但即使是內容提供者使用了可能涉及3 MB傳輸的binder IPC權限? 或內容提供者直接讀取調用者進程內存空間中的數據庫並且不涉及IPC?ContentProvider和Binder IPC

請糾正我的理解

感謝和問候 曼蘇爾V.M

+1

ContentProvider具有綁定器限制,並且不能傳輸比默認綁定器更大的數據事務大小 – pskink

+0

感謝您的重播pskink,正如我們所知數據庫總數據可以超過默認綁定器事務大小,所以當我使用contentresolver進行查詢後得到遊標時,遊標指向客戶端進程空間中的整個數據?或者它只是指向不同進程空間中的一條記錄,並在db中對每個記錄進行IPC調用?請修正我 –

+0

不幸的是,整個CursorWindow從ContentProvider的進程複製到客戶端,bur可能是android:multiprocess可以幫助 – pskink

回答

3

在最低層次,內容提供商使用CursorWindows,它是基於共享內存(ashmem)。

查看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。因此,在KitKat中,如果使用常規Java接口,則最大CursorWindow大小爲2 Mb。但是,如果直接使用C++中的androidfw/CursorWindow.h,使用AOSP頭,則可以使用較大的CursorWindows。 (請注意,僅使用NDK是不夠的,因爲CursorWindow不是NDK API的一部分。)