我對內容提供者有疑問..我們知道binder不能傳輸大量數據(〜> 3MB),但即使是內容提供者使用了可能涉及3 MB傳輸的binder IPC權限? 或內容提供者直接讀取調用者進程內存空間中的數據庫並且不涉及IPC?ContentProvider和Binder IPC
請糾正我的理解
感謝和問候 曼蘇爾V.M
我對內容提供者有疑問..我們知道binder不能傳輸大量數據(〜> 3MB),但即使是內容提供者使用了可能涉及3 MB傳輸的binder IPC權限? 或內容提供者直接讀取調用者進程內存空間中的數據庫並且不涉及IPC?ContentProvider和Binder IPC
請糾正我的理解
感謝和問候 曼蘇爾V.M
在最低層次,內容提供商使用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的一部分。)
ContentProvider具有綁定器限制,並且不能傳輸比默認綁定器更大的數據事務大小 – pskink
感謝您的重播pskink,正如我們所知數據庫總數據可以超過默認綁定器事務大小,所以當我使用contentresolver進行查詢後得到遊標時,遊標指向客戶端進程空間中的整個數據?或者它只是指向不同進程空間中的一條記錄,並在db中對每個記錄進行IPC調用?請修正我 –
不幸的是,整個CursorWindow從ContentProvider的進程複製到客戶端,bur可能是android:multiprocess可以幫助 – pskink