Recovery只有在升級的時候才會呈現給用戶,所以界面一般都很簡單,沒有android上層那么絢麗,所以recovery下面對圖片的支持很有限,僅支持png圖片顯示,所以我們可以看到,recovery下面所有的背景以及提示信息,都是以png格式圖片的資源文件存在。一般的廠商都會覺得,原生的機器人很low,都會重新整理一套升級顯示的UI,但並非所有的png圖片recovery都是支持的,下面我們來分析下recovery下png資源文件的支持。
6.1 資源文件路徑以及分類
我們資源文件的路徑在SDK中的bootable/recovery/res-相關的目錄中,針對不同的DPI的場景,分別有不同的資源文件:
一般情況下,dpi對應的分辨率如下:
mdpi HVGA 480*320
hdpi WVGA 800*480 FWVGA 854*480 QHD 960*540 xhdpi 720P 1280*720 xxhdpi 1080P 1920*1080
xxxhdpi 4K 4096×2160
針對分辨率,PPI DPI分不清的,可以參考之前的一篇博客:分辨率 PPI DPI概念定義詳解http://blog.csdn.net/csdn66_2016/article/details/70331919
6.2 PNG支持的種類
並非所有的PNG圖片,在recovery下面都可以顯示,這也是很多人會遇到的問題,明明是png圖片,怎么還是不能顯示呢,recovery原生對png圖片的支持如下:
bit_depth channels color_type
8 3 2
<=8 1 0
<=8 1 3
其中bit_depth是位深度, channels是指支持的顏色的種類,color_type是值顏色類型。我們需要記住的是:
bit_depth不能大於8。
color_type值有 PNG_COLOR_TYPE_GRAY(0)
PNG_COLOR_TYPE_RGB(2)
PNG_COLOR_TYPE_PALETTE(3)
channels值,與color_type有關,PNG_COLOR_TYPE_GRAY與PNG_COLOR_TYPE_PALETTE時,只有一種顏色,PNG_COLOR_TYPE_RGB時有三種顏色
6.3 判斷PNG屬性方法
我們上節描述了,通過三個屬性,來看一個png圖片是否能在recovery中顯示,當我們拿到一個png圖片的時候,怎么分析呢,我們可以寫個小的獲取png info的程序。
第一步:編譯libpng.a庫文件
我們從官網下載png的源碼,http://www.libpng.org/pub/png/libpng.html,然后在服務器解壓,然后編譯:./configure CC=gcc --prefix=$PWD/_install, make, make install; 然后就可以生成libpng.a以及png.h相關文件了。
第二步:寫sample
pnginfo.c
#include <stdlib.h> #include <string.h> #include <stdio.h> #include "png.h" int main(int argc ,char **argv) { unsigned char header[8]; size_t bytesRead; int result = 0; FILE* fp = NULL; png_structp png_ptr = NULL; png_infop info_ptr = NULL; int color_type, bit_depth; png_uint_32 width; png_uint_32 height; png_byte channels; if (argc !=2 ) { printf("eg:./pnginfo png_name\n"); return -1; } fp = fopen(argv[1], "rb"); if (fp == NULL) { result = -1; goto exit; } bytesRead = fread(header, 1, sizeof(header), fp); if (bytesRead != sizeof(header)) { result = -2; goto exit; } if (png_sig_cmp(header, 0, sizeof(header))) { result = -3; goto exit; } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { result = -4; goto exit; } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { result = -5; goto exit; } if (setjmp(png_jmpbuf(png_ptr))) { result = -6; goto exit; } png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, sizeof(header)); png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); channels = png_get_channels(png_ptr, info_ptr); printf("pnginfo bit_depth:%d, channels:%d, color_type:%d\n", bit_depth, channels, color_type); exit: if (fp != NULL) { fclose(fp); fp = NULL; } printf("pnginfo result:%d\n", result); return result; }
makefile:
CC=gcc
TARGET=pnginfo
%.o:%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
all:pnginfo.o
$(CC) -o $(TARGET) $< -L. -lpng -lz -lm
clean:
rm -rf *.o $(TARGET)
執行make即可生成pnginfo
第三步:獲取png屬性
./pnginfo icon_error.png
6.4 png轉換
如果我拿到的png圖片,不支持怎么辦呢,我們可以使用PS工具,把png圖片轉換為recovery可支持的格式即可,如果又不太會使用PS工具呢,還有個更簡單的方法,采用QQ的截圖功能,然后另存為png圖片即可,QQ截圖保存的png是標准的RGB格式,即bit_depth(8)channels(3)color_type(2)
6.5 總結
通過上述了解,現在知道了recovery的圖片資源文件png的信息了,怎么去判斷png是否能夠在recovery中顯示,以及如果制作recovery支持的png背景圖片了。