編輯:關於Android編程
在Android頂層源碼目錄使用make編譯完成後,會生成這樣一個目錄:
out/target/product/xxx,該目錄內部有我們需要的boot.img,system.img等文件,boot.img使用kernel和out/target/product/xxx/root(廣義的ramdisk)目錄打包而成,也就是說boot.img是由kernel和ramdisk.img生成得到。
在android的編譯框架中,把許多固定的、反復用到的目錄路徑定義為宏變量,而上述生成的目錄
out/target/product/xxx的宏為PRODUCT_OUT
out/target/product/xxx/system的宏即為:TARGET_OUT
而out/target/product/xxx/root的宏即為:TARGET_ROOT_OUT,
out/target/product/xxx/root主要是由system/core/rootdir目錄拷貝得到的,
而對於編譯過程中bootloader,kernel以及system的規定都是放在build/core/Makefile文件中。啟動規定了編譯生成的規則。
1
2
3
4
5
6
7
#build/core/Makefile
INTERNAL_BOOTIMAGE_ARGS := \
--kernel $(INSTALLED_KERNEL_TARGET) \
--ramdisk $(INSTALLED_RAMDISK_TARGET)
顯然,boot.img中包含了Image和ramdisk.img文件,但boot.img中的內容遠不只這麼多,本文將介紹
boot.img中的其它參數,boot.img的生成以及最終boot.img的組成格式.
INTERNAL_BOOTIMAGE_ARGS還包含以下內容:
1.附加的內核命令行(cmdline): BOARD_KERNEL_CMDLINE
同樣在build/core/Makefile中,有以下一段內容(strip起到去除空格的作用):
?
1
2
3
4
5
6
7
BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE)
ifdef BOARD_KERNEL_CMDLINE
INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)"
#endif
而BOARD_KERNEL_CMDLINE則在文件device/telechips/tcc88xx-common/BoardConfigCommon.mk中定義:
?
1
BOARD_KERNEL_CMDLINE := console=ttyTCC, 115200n8
2.內核加載的基地址,BOARD_KERNEL_BASE
同樣在build/core/Makefile中,有以下一段內容:
?
1
2
3
4
5
6
7
BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
ifdef BOARD_KERNEL_BASE
INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
endif
而BOARD_KERNEL_BASE也在device/telechips/tcc88xx-common/BoardConfigCommon.mk中定義。
?
1
BOARD_KERNEL_BASE := 0x40000000
3.映像的頁面大小:BOARD_KERNEL_PAGESIZE
同樣在build/core/Makefile中,有以下一段內容:
?
1
2
3
4
5
6
7
BOARD_KERNEL_PAGESIZE:= $(strip $(BOARD_KERNEL_PAGESIZE))
ifdef BOARD_KERNEL_PAGESIZE
INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
endif
而BOARD_KERNEL_PAGESIZE 卻在device/telechips/tcc8800/BoardConfig.mk中定義:
?
1
BOARD_KERNEL_PAGESIZE := 8192
剩下的內容就是生成boot.img的關鍵語句,在 build/core/Makefile中,內容如下:
?
1
2
3
4
5
INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
$(INTALLED_BOOTIMAGE_TARGET) : $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILE
$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@
到此,我們可以知道 INTERNAL_BOOTIMAGE_ARGS的內容是:
?
1
2
3
4
--kernel out/target/product/tcc8800/kernel
--ramdisk out/target/product/tcc8800/ramdisk.img
--cmdline console=ttyTCC,115200n8
--base 0x40000000 --pagesize 8192
而預知boot.img的格式,必須查看MKBOOTIMG這個程序,其實就是out/host/linux-x86/bin/mkbootimg中的mkbootimg程序。
mkbootimg程序由system/core/mkbootimg工程生成得到,為此我們來看看其中的mkbootimg.c文件,其中有這樣一段:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
//信息頭部分
if(write(fd,&hdr,sizeof(hdr)) != sizeof(hdr)) goto fail;
if(write_padding(fd,pagesize,sizeof(hdr))) goto fail;
//內核部分
if(write(fd,&kernel_data, hdr.kernel_size)!= hdr.kernel_size)
goto fail;
if(write_padding(fd,pagesize,hdr.kernel_size)) goto fail;
//文件系統部分
if(write(fd,&ramdisk_data,hdr.ramdisk_size)!= hdr.ramdisk_size)
goto fail;
if(wirte_padding(fd,pagesize,hdr.ramdisk_size)) goto fail;
可見boot.img是由文件頭信息,內核數據以及文件系統數據組成,它們之間非頁面對齊部分用0填充(可以
查看write_padding的代碼),文件頭信息的具體結構可以在system/core/mkbootimg/bootimg.h中看到:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct boot_img_hdr
{
unsigned char magic[BOOT_MAGIC_SIZE];
unsigned kernel_size;
unsigned kernel_addr;
unsigned ramdisk_size;
unsigned ramdisk_addr;
unsigned second_size;
unsigned second_addr;
unsigned tags_addr;
unsigned page_size;
unsigned unused[2];
unsigned char name[BOOT_NAME_SIZE]
unsigned char cmdline[BOOT_ARGS_SIZE]
unsigned id[8]; //存放時間戳,校驗和,SHA加密等內容
}
其它成員也很明了,由此可知boot.img的大致組成結構了。
並不是所有的BAT的API都是非常好用的,微信支付就有不少的缺陷,總結一下微信支付實現中出現的問題 坑點一: PayReq的參數 sign的生成&
android中提供了4中動畫: AlphaAnimation 透明度動畫效果 ScaleAnimation 縮放動畫效果 TranslateAnimation 位移動畫
推送現在在移動項目開發中已經很常見了,比較常見的推送方式有小米推送、極光推送和個推,今天我們所講解的是Tencent的信鴿推送在Android上的應用。一、信鴿Andro
Volley是Android系統下的一個網絡通信庫,為Android提供簡單快速的網絡操作(Volley:Esay, Fast Networking for Androi