一、原理分析
android中顯示屏裝置被抽象成乙個幀緩衝區;linux核心建立的"/dev/graphics/fb0"裝置、就是用來描述系統中的乙個幀緩衝區(也就是乙個顯示屏),android系統grallochal模組封裝了對幀緩衝區的所有訪問操作。
grallochal模組包含兩個裝置alloc和fb。
android應用程式通過su***ceflinger服務操作這兩個裝置,完成顯示;首先通過gralloc裝置申請乙個圖形緩衝區、並將該圖形緩衝區對映到應用程式的位址空間,然後通過fb裝置將前邊已經繪製好的圖形緩衝區渲染到幀緩衝區上去、完成顯示。
總結:1.grallochal模組中alloc裝置使用結構體alloc_device_t來描述;完成對圖形緩衝區的管理:
2.grallochal模組中fb裝置使用結構體framebuffer_device_t來描述;完成對linux核心幀緩衝區的管理。
成員函式setswapinterval用來設定幀緩衝區交換前後兩個圖形緩衝區的最小和最大時間間隔;
成員函式setupdaterect用來設定幀緩衝區的更新區域;
成員函式post用來將圖形緩衝區buffer的內容渲染到幀緩衝區中去,即顯示在裝置的顯示屏中去;
成員函式compositioncomplete用來通知fb裝置device,圖形緩衝區的組合工作已經完成,目前沒有使用這個成員函式。
二、服務端呼叫流程
1.整體流程
frameworks/base/services/su***ceflinger/su***ceflinger.cpp
status_t su***ceflinger::readytorun()
frameworks/base/services/su***ceflinger/displayhardware/displayhardware.cppframeworks/base/libs/ui/framebuffernativewindow.cppdisplayhardware::displayhardware(
const sp& flinger,
uint32_t dpy)
: displayhardwarebase(flinger, dpy),
mflinger(flinger), mflags(0), mhwc(0)
void displayhardware::init(uint32_t dpy)
}
2.fb裝置流程framebuffernativewindow::framebuffernativewindow()
: base(), fbdev(0), grdev(0), mupdateondemand(false)
for (i = 0; i < mnumbuffers; i++)
}}}
hardware/libhardware/include/hardware/fb.h
hardware/mstar/gralloc/gralloc_module.cppstatic inline int framebuffer_open(const struct hw_module_t* module,
struct framebuffer_device_t** device)
hardware/mstar/gralloc/framebuffer_device.cppstruct private_module_t hal_module_info_sym = ,
},registerbuffer: gralloc_register_buffer,
unregisterbuffer: gralloc_unregister_buffer,
lock: gralloc_lock,
unlock: gralloc_unlock,
perform: null,
reserved_proc: ,
},framebuffer: null,
flags: 0,
numbuffers: 0,
buffermask: 0,
lock: pthread_mutex_initializer,
currentbuffer: null,
};static struct hw_module_methods_t gralloc_module_methods = ;
static int gralloc_device_open(const hw_module_t* module, const char* name, hw_device_t** device)
else if (!strcmp(name, gralloc_hardware_fb0))
return status;
}
3.alloc裝置流程int framebuffer_device_open(hw_module_t const* module, const char* name,
hw_device_t** device)
static int init_frame_buffer(struct private_module_t* module)
int init_frame_buffer_locked(struct private_module_t* module)
; int fd = -1;
int i = 0;
char name[64];
while ((fd == -1) && device_template[i])
//獲得
struct fb_fix_screeninfo finfo;
if (fbdev_ioctl(fd, fbioget_fscreeninfo, &finfo) == -1)
return -errno;
struct fb_var_screeninfo info;
if (fbdev_ioctl(fd, fbioget_vscreeninfo, &info) == -1)
return -errno;
//設定
uint32_t flags = page_flip;
if (fbdev_ioctl(fd, fbioput_vscreeninfo, &info) == -1)
//對映framebuffer
size_t fbsize = round_up_to_page_size(finfo.smem_len);
void* vaddr = fbdev_mmap(0, fbsize, prot_read|prot_write, map_shared, fd, 0);
int hw_base = static_cast(unsigned(finfo.smem_start) & mask_miu_physaddress);
module->framebuffer = new private_handle_t(private_handle_t::priv_flags_framebuffer, fbsize, intptr_t(vaddr),
0, hw_base, channel, 0);
}
其他呼叫同上,不再分析
hardware/mstar/gralloc/alloc_device.cpp
4.alloc渲染到fbstatic int alloc_device_alloc(alloc_device_t* dev, int w, int h, int format, int usage, buffer_handle_t* phandle, int* pstride)
hardware/mstar/gralloc/framebuffer_device.cpp
static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer)
m->currentbuffer = buffer;
}esle
}
Android 4 0 事件系統
2013 01 31 15 13 295人閱讀收藏 舉報 事件系統簡介 1.android 事件系統,它解決的是如何將按鍵 滑鼠 觸屏訊息從收集到最終將之傳送到焦點視窗進行處理的問題 2.android 事件處理 流程分兩部分,一部分是從 framework 開始,如何 從底層讀取事件並分發 給ac...
android4 0上網設定
很多也問到為啥自己在家的pc機可以上網,而執行在pc機上面的android模擬器卻不能上網呢?是因為家裡的pc機的dns一般為 192.168.1.1,這個只是一般而言,不是絕對,這個得自己使用ipconfig all命令檢查下 而模擬器預設的dns為 10.0.2.3,那麼模擬器跟自己的pc就不在...
android 4 0開機啟動服務
網上找了幾個方法 第一,寫乙個很簡單的程式,就乙個activity,指此activity標題欄去掉,背景全透明,然後在此activity的oncreate將自己finish 掉,什麼都不用幹,只要在manifest.xml中申明開機服務就ok,然後在程式內部響應此開機服務。下面 就是這種方式 第二,...