libvncserver 原始碼入門介紹

使用到 libvncserver 的專案有很多,像是比較有名的 x11vnc,其中一個便是 android-vnc-server,我便稍微研究了一下在 Android 怎麼使用,

在 fbvncserver.c 裡 Framebuffer device 的路徑定義如下,Android 不使用 /dev/fb0 路徑,

1
#define FB_DEVICE "/dev/graphics/fb0"

所以只要從這個裝置裡取出影像資料便是螢幕的影像了,所以螢幕截圖的功能也可以這樣實現。

init_fb() 裡用 open 開啟 fb 裝置,之後再用 ioctl() 取得該裝置的資訊(寬跟高),
再用 mmap() 取得 fb 裝置記憶體的映射

update_screen() 裡取得 framebuffer 的 pixel 的資料,比對跟前一幀的 pixel,不一樣的話就使用 rfbMarkRectAsModified() 更新這次的畫面有改變的矩形範圍,

這樣一個小小的程式便完成了 VNC Server 的工作,用了 libvncserver 提供好的 API 是方便許多。

其他參考
fbvncserver.c
https://android.googlesource.com/platform/external/libvncserver/+/master/examples/android/jni/fbvncserver.c
PC 远程控制 android手机的方法之一VNC
https://blog.csdn.net/shuzui1985/article/details/7841079
另外還一有篇簡單的 libvncserver 入門介紹
https://my.oschina.net/u/1250206/blog/1577985
oNaiPs/droidVncServer
https://github.com/oNaiPs/droidVncServer
在這個 Android 專案裡多了一層 GUI 來控制 VNC Server 的設定