當前位置:首頁 » 安卓系統 » framebufferandroid

framebufferandroid

發布時間: 2024-12-15 09:04:13

『壹』 Android開機logo簡單修改方法

Android 手機開機logo主要分為2部分:

1.按下開機鍵後linux開機顯示開機第一幀部分。此Kernel中的畫面在ANDROID里默認是關閉的,需要打開時可以配置打開kernel下面2個選項:

CONFIG_FRAMEBUFFER_CONSOLE

CONFIG_LOGO

意即KERNEL支持幀緩沖控制台,並且顯示開機LOGO

2.開機過程從開機畫面已經進入了android的范圍,在INIT進程啟動的時候載入的開機動畫。

1).如果想要修改手機的開機第一幀,以高通SDM450平台為例,講解一下開機第一幀logo的製作過程:

首先准備好需要更換的顯示第一幀的logo圖標,只需要顯示圖案的部分即可。比如安卓源碼的小企鵝圖標,為寬88 高102像素的bmp格式。

1 ps-截圖-垂直翻轉-另存為bmp-24位-高級模式-RGB888

2 .bmp文件命名為splash.bmp,在linux下執行xxd -i splash.bmp > splash.h

3 h文件去文件頭54位元組

unsigned char splash_24_bmp[] = {

0x42, 0x4d, 0x98, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00,

0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x5a, 0x00,

0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0xc3, 0x0e, 0x00, 0x00, 0xc3, 0x0e, 0x00, 0x00, 0x00, 0x00,

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 

4 查看splash.bmp-屬性-摘要-寬88 高 102

5 修改文件

     \android\bootable\bootloader\lk\platform\msm_shared\include\splash.h

      imageBuffer_rgb888[] 此數組用步驟3製作出的數組內容

#define SPLASH_IMAGE_WIDTH     88

#define SPLASH_IMAGE_HEIGHT    102

6 bmptool工具上驗證效果

txt2bin->生成bin->直接把bin拖入->設寬高為源bmp文件的寬高,24位

如果顯示正常,直接如此修改驗證就ok,如果顯示有傾斜,先改小源圖片的大小,重復此步驟製作。

bmptool工具驗證的效果如此圖顯示, 則表示正常。

以上步驟,開機第一幀圖片就修改ok。

2.開機動畫修改

android\vendor\qcom\proprietary\qrdplus\Extension\apps\BootAnimation 目錄下修改

bootanimation.zip

shutdownanimation.zip

這個壓縮文件可以解壓後參考源碼中圖片修改,修改後mm編譯後驗證即可。

以上就是Android修改開機動畫的一種簡單方法。

『貳』 怎麼修改android 啟動過程中的第二個開機畫面

第一個開機畫面是在內核啟動的過程中出現的,它是一個靜態的畫面。第二個開機畫面是在init進程啟動的過程中出現的,它也是一個靜態的畫面。第三個開機畫面是在系統服務啟動的過程中出現的,它是一個動態的畫面。無論是哪一個畫面,它們都是在一個稱為幀緩沖區(frame buffer,簡稱fb)的硬體設備上進行渲染的。接下來,我們就分別分析這三個畫面是如何在fb上顯示的。
1. 第一個開機畫面的顯示過程
Android系統的第一個開機畫面其實是Linux內核的啟動畫面。在默認情況下,這個畫面是不會出現的,除非我們在編譯內核的時候,啟用以下兩個編譯選項:
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_LOGO
第一個編譯選項表示內核支持幀緩沖區控制台,它對應的配置菜單項為:Device Drivers ---> Graphics support ---> Console display driver support ---> Framebuffer Console support。第二個編譯選項表示內核在啟動的過程中,需要顯示LOGO,它對應的配置菜單項為:Device Drivers ---> Graphics support ---> Bootup logo。配置Android內核編譯選項可以參考在Ubuntu上下載、編譯和安裝Android最新內核源代碼(Linux Kernel)一文。
幀緩沖區硬體設備在內核中有一個對應的驅動程序模塊fbmem,它實現在文件kernel/goldfish/drivers/video/fbmem.c中,它的初始化函數如下所示:

/**
* fbmem_init - init frame buffer subsystem
*
* Initialize the frame buffer subsystem.
*
* NOTE: This function is _only_ to be called by drivers/char/mem.c.
*
*/

static int __init
fbmem_init(void)
{
proc_create("fb", 0, NULL, &fb_proc_fops);

if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devs\n", FB_MAJOR);

fb_class = class_create(THIS_MODULE, "graphics");
if (IS_ERR(fb_class)) {
printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
fb_class = NULL;
}
return 0;
}
這個函數首先調用函數proc_create在/proc目錄下創建了一個fb文件,接著又調用函數register_chrdev來注冊了一個名稱為fb的字元設備,最後調用函數class_create在/sys/class目錄下創建了一個graphics目錄,用來描述內核的圖形系統。

模塊fbmem除了會執行上述初始化工作之外,還會導出一個函數register_framebuffer:

EXPORT_SYMBOL(register_framebuffer);
這個函數在內核的啟動過程會被調用,以便用來執行注冊幀緩沖區硬體設備的操作,它的實現如下所示:

/**
* register_framebuffer - registers a frame buffer device
* @fb_info: frame buffer info structure
*
* Registers a frame buffer device @fb_info.
*
* Returns negative errno on error, or zero for success.
*
*/

int
register_framebuffer(struct fb_info *fb_info)
{
int i;
struct fb_event event;
......

if (num_registered_fb == FB_MAX)
return -ENXIO;

......

num_registered_fb++;
for (i = 0 ; i < FB_MAX; i++)
if (!registered_fb[i])
break;
fb_info->node = i;
mutex_init(&fb_info->lock);
fb_info->dev = device_create(fb_class, fb_info->device,
MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
if (IS_ERR(fb_info->dev)) {
/* Not fatal */
printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));
fb_info->dev = NULL;
} else
fb_init_device(fb_info);

......

registered_fb[i] = fb_info;

event.info = fb_info;
fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
return 0;
}
由於系統中可能會存在多個幀緩沖區硬體設備,因此,fbmem模塊使用一個數組registered_fb保存所有已經注冊了的幀緩沖區硬體設備,其中,每一個幀緩沖區硬體都是使用一個結構體fb_info來描述的。

『叄』 android 屏幕顯示 怎麼刷新 framebuffer 詳解

Android屏幕繪制基本與linux相同,都是使用Framebuffer來繪制屏幕,設備為/dev/graphic/fb0.Framebuffer 存儲在內存或者顯存中,比如一個800 ×600的屏幕,每個像素點為16位色,那麼Framebuffer的大小就為(800 × 600 × 16/8) byte
手機的LCD屏幕通過顯存中當前的Framebffer和緩存的framebuffer來繪制屏幕上的每一個像素點.

具體順序為:

1打開framebuffer設備;

2通過ioctl取得fixed screen information;(ioctl(fd,FBIOGET_FSCREENINFO, &finfo))

3通過ioctl取得variable screen information;(ioctl(fd,FBIOGET_VSCREENINFO, &vinfo))

4通過mmap映射設備內存到進程空間;(記得區分內核空間和用戶空間,用戶空間是無法對物理內存直接讀寫的)

5寫framebuffer;

6終止。(記得終止時一定要取消映射,並close掉句柄)

『肆』 如何在Android裡面使用代碼截屏

  • 回答:Android SDK的截屏

  • 方法步驟:如下

方法一:

(1)主要就是利用SDK提供的View.getDrawingCache()方法。網上已經有很多的實例了。首先創建一個android project,然後進行Layout,畫一個按鍵

HelloAndroid.java實現代碼為:packagecom.example.helloandroid;

這個代碼會在按下app中按鍵的時候自動在手機的/sdcard/目錄下生成一個時間戳命名的png截屏文件。

這種截屏有一個問題,就是只能截到一部分,比如電池指示部分就截不出來了。

(2)在APK中調用「adb shell screencap -pfilepath」 命令

  • 該命令讀取系統的framebuffer,需要獲得系統許可權:

(1). 在AndroidManifest.xml文件中添加

(2). 修改APK為系統許可權,將APK放到源碼中編譯,

(3).利用系統的API,實現Screenshot,這部分代碼是系統隱藏的,需要在源碼下編譯,

1).修改Android.mk, 添加系統許可權

LOCAL_CERTIFICATE := platform

2).修改AndroidManifest.xml 文件,添加

許可權

方法二:

  • Android ddmlib進行截屏

Android本地編程(Native Programming)讀取framebuffer

(1)命令行,框架的截屏功能是通過framebuffer來實現的,所以我們先來介紹一下framebuffer。

Linux FrameBuffer 本質上只是提供了對圖形設備的硬體抽象,在開發者看來,FrameBuffer 是一塊顯示緩存,往顯示緩存中寫入特定格式的數據就意味著向屏幕輸出內容。所以說FrameBuffer就是一塊白板。例如對於初始化為16 位色的FrameBuffer 來說, FrameBuffer中的兩個位元組代表屏幕上一個點,從上到下,從左至右,屏幕位置與內存地址是順序的線性關系。幀緩存有個地址,是在內存里。我們通過不停的向frame buffer中寫入數據, 顯示控制器就自動的從frame buffer中取數據並顯示出來。全部的圖形都共享內存中同一個幀緩存。

  • 方法三:Android截屏實現思路

Android系統是基於Linux內核的,所以也存在framebuffer這個設備,我們要實現截屏的話只要能獲取到framebuffer中的數據,然後把數據轉換成圖片就可以了,android中的framebuffer數據是存放在 /dev/graphics/fb0 文件中的,所以我們只需要來獲取這個文件的數據就可以得到當前屏幕的內容。

現在我們的測試代碼運行時候是通過RC(remote controller)方式來運行被測應用的,那就需要在PC機上來訪問模擬器或者真機上的framebuffer數據,這個的話可以通過android的ADB命令來實現。

  • 注意:

1、需要在AndroidManifest.xml中加入代碼:android:sharedUserId="android.uid.system"。

2、由於調用了@hide的API,所以編譯得時候請使用makefile編譯。或者通過在Eclipse中添加Jar文件通過編譯。

3、此代碼只在Android4.0中使用過,2.3的就沒去做測試了。

  • 補充說明:

  1. 利用TakeScreenShotService截圖Android手機一般都自帶有手機屏幕截圖的功能:在手機任何界面(當然手機要是開機點亮狀態),通過按組合鍵,屏幕閃一下,然後咔嚓一聲,截圖的照片會保存到當前手機的圖庫中,

  2. 對手機android源碼中通過組合鍵屏幕截圖的整個流程有個大體了解了,在改動中熟悉按鍵的捕獲原理,並且清楚調用的截屏函數介面即可。

熱點內容
怎麼登錄linux 發布:2024-12-15 11:41:38 瀏覽:716
java字元串去掉空格 發布:2024-12-15 11:36:43 瀏覽:979
錢幣編程 發布:2024-12-15 11:28:00 瀏覽:779
標准c語言頭文件 發布:2024-12-15 11:27:55 瀏覽:220
自動化測試框架python 發布:2024-12-15 11:13:14 瀏覽:325
手游雲伺服器怎麼搭建 發布:2024-12-15 10:59:36 瀏覽:123
android找不到so文件 發布:2024-12-15 10:50:13 瀏覽:586
共享ftp伺服器的搭建 發布:2024-12-15 10:49:40 瀏覽:488
我的世界戰爭伺服器需要的模組 發布:2024-12-15 10:41:11 瀏覽:75
java介面的引用 發布:2024-12-15 10:22:32 瀏覽:270