物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè)教學(xué)資源建設(shè)AndroidLow課件_第1頁
物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè)教學(xué)資源建設(shè)AndroidLow課件_第2頁
物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè)教學(xué)資源建設(shè)AndroidLow課件_第3頁
物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè)教學(xué)資源建設(shè)AndroidLow課件_第4頁
物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè)教學(xué)資源建設(shè)AndroidLow課件_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè) 教學(xué)資源建設(shè)嵌入式技術(shù)應(yīng)用課程教學(xué)資源建設(shè)建設(shè)院校:無錫職業(yè)技術(shù)學(xué)院1.Android開發(fā)入門什么是Android2 Android開發(fā)平臺(tái)Android 簡(jiǎn)介Android是執(zhí)行于Linux kernel之上,但并不是Linux操作系統(tǒng)。因?yàn)樵谝话鉒inux里支持的功能,Android大都沒有支持,包括Cairo、X11、glibc、Gnome、KDE。Android為了達(dá)到商業(yè)應(yīng)用,使用的是更加對(duì)商用化友好的Apache協(xié)議進(jìn)行分發(fā),而且必須移除被GNU GPL授權(quán)證所約束的部份,包括很多l(xiāng)inux操作系統(tǒng)里的大量開源軟件。3Android的構(gòu)成移植要做的事在內(nèi)核層與框

2、架層之間4Android SDK: Android SDK(Software Development Kit)提供了在Windows/Linux/Mac平臺(tái)上開發(fā)Android應(yīng)用的開發(fā)組件,Android支持所有的平臺(tái),其包含了在Android平臺(tái)上開發(fā)移動(dòng)應(yīng)用的各種工具集。 工具集不僅包括了Android模擬器和用來調(diào)試、打包和在模擬器上安裝應(yīng)用的工具。 Android 編程主要是以Java語言為基礎(chǔ),用戶可以使用Java語言來開發(fā)Android平臺(tái)上的軟件應(yīng)用。通過SDK提供的一些工具將其打包成Android平臺(tái)使用的apk文件,然后可以用SDK中的模擬器(Emulator)來模擬和測(cè)試

3、軟件在Android平臺(tái)上運(yùn)行情況和效果。52.Android源代碼的下載和編譯版本管理工具git和repo下載Android源代碼編譯Android的虛擬機(jī)鏡像6Git 和 RepoGit是Linuz Torvalds為了幫助linux內(nèi)核開發(fā)而創(chuàng)建的一套分布式版本管理工具。分布式版本控制工具最重要的作用是沒有中央節(jié)點(diǎn),可以離線工作,并且極其容易派生出新的開發(fā)源代碼樹。Android源代碼管理本身是使用的Git,但因?yàn)锳ndroid源代碼里面包含了復(fù)雜的源代碼結(jié)構(gòu),所以又在Git之上包裝出一套新的工具,repo,這個(gè)repo只是一個(gè)簡(jiǎn)單的python腳本集7 Android源代碼的依賴項(xiàng)參考

4、http:/source/index.html,Getting Started章節(jié)要點(diǎn):Linux(推薦Ubuntu)或MacOSX(區(qū)別大小寫的文件系統(tǒng))2g以上內(nèi)存,12g以上硬盤空間JDK16非常長(zhǎng)的下載和編譯時(shí)間依賴軟件sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev設(shè)

5、置udev規(guī)則8下載Android源代碼 下載repo,http:/repowget http:/repo -O /bin/repochmod a+x /bin/repoexport PATH=$PATH:/bin初始化repomkdir android_workingcd android_workingrepo init -u git:/platform/manifest.git開始下載repo sync9編譯Android源代碼初始化Android編譯環(huán)境 source build/envsetup.sh設(shè)置編譯目標(biāo)(因?yàn)闆]有目標(biāo)板的設(shè)置,因?yàn)樯形赐瓿梢浦?,這時(shí)的編譯目標(biāo)會(huì)是虛擬機(jī))lun

6、ch full-eng編譯make j4結(jié)果生成的結(jié)果在out目錄里,其中out/host目錄里存在主機(jī)工具,out/target目錄里保存目標(biāo)板可執(zhí)行環(huán)境10編譯排錯(cuò)make j4是并行化編譯,以四個(gè)線程同時(shí)進(jìn)行編譯,但會(huì)影響出錯(cuò)時(shí)的輸出,一旦編譯最后出錯(cuò),應(yīng)該以make命令保持編譯的串行有時(shí),結(jié)果會(huì)不如預(yù)期,需要定位出錯(cuò)的詳細(xì)內(nèi)容,可以使用make showcommands另外,可以指定只編譯某一功能部件,以節(jié)省編譯時(shí)間,使用mm或是mmm命令來指定單一的子部件,這一命令會(huì)只編譯一個(gè)目標(biāo),以及這一目標(biāo)的依賴項(xiàng)113. Android的平臺(tái)移植Android移植的基本步驟Linux內(nèi)核加入新

7、的平臺(tái)的設(shè)置文件必備驅(qū)動(dòng)HAL123.1 Android移植的基本步驟編譯和移植linux內(nèi)核,先保證內(nèi)核沒有問題,可以基于busybox運(yùn)行出一個(gè)可調(diào)試環(huán)境,并且驗(yàn)證硬件驅(qū)動(dòng)的可用性。在Linux內(nèi)核里增加android所需要的驅(qū)動(dòng)調(diào)整init.rc相應(yīng)腳本,以及生成rootfs創(chuàng)建合適的平臺(tái)相關(guān)的配置文件實(shí)現(xiàn)平臺(tái)相應(yīng)的硬件抽象層(HAL)代碼燒寫及調(diào)試13Android的啟動(dòng)過程(1)上電,bootloader初始化硬件,檢測(cè)啟動(dòng)模式,正?;蚴荝ecovery模式。如果正常啟動(dòng)模式,則啟動(dòng)linux內(nèi)核。在內(nèi)核初始化的最后一步,會(huì)裝載ramfs到/目錄,嘗試運(yùn)行init進(jìn)程(Android

8、環(huán)境里會(huì)是android特定的init可執(zhí)行程序)Init進(jìn)程解析init.rc和目標(biāo)板特定的init.XXX.rc文件,設(shè)置環(huán)境變量,裝載各個(gè)分區(qū),執(zhí)行各個(gè)系統(tǒng)服務(wù),以及運(yùn)行Zygote這個(gè)Dalvik虛擬的管理工具。Init.rc文件允許類似于shell之類的執(zhí)行,這樣可以加入用c寫的系統(tǒng)服務(wù),初始化特殊化硬件。14Android啟動(dòng)過程(2)Zygote的第一生成的進(jìn)程,會(huì)生成system_server,這個(gè)進(jìn)程創(chuàng)建及控制android系統(tǒng)內(nèi)的所有系統(tǒng)服務(wù)。在這些系統(tǒng)服務(wù)的初始化過程中,會(huì)初始化各個(gè)硬件驅(qū)動(dòng)的hal實(shí)現(xiàn),比如SurfaceFlinger初始化Framebuffer輸出,S

9、ensorService初始化感應(yīng)器。在bootanimation成功運(yùn)行,則android啟動(dòng)已經(jīng)成功了一小步在bootanimation結(jié)束后,Zygote會(huì)嘗試發(fā)送intent.category.HOME,這一Intent會(huì)觸發(fā)發(fā)Home的執(zhí)行,也就是Android的主界面Launcher。這時(shí)用戶可見部分就成功了。15內(nèi)核的移植增加arch/CPU/MACH目錄CPU目錄存在相應(yīng)芯片體系的支持,比如arm,mips,powerpc。MACH對(duì)應(yīng)到具體的芯片,比如mach-omap4實(shí)現(xiàn)芯片的支持,包括CPU初始化,內(nèi)存初始化,串口,時(shí)鐘,關(guān)鍵gpio,能源管理芯片,以及設(shè)備驅(qū)動(dòng)模型管理

10、下的所有硬件驅(qū)動(dòng)定義數(shù)組。編譯busybox,生成根文件系統(tǒng),即所謂的initramfs,在這一文件系統(tǒng)里先完成硬件的可用性測(cè)試16輸入,輸出和USB作為基本的嵌入式系統(tǒng),至少需要基本的輸入輸出設(shè)備支持,對(duì)于Android,則作為USB設(shè)備端的驅(qū)動(dòng)也需要,以方便adb的連接調(diào)試(或者用網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)代替也行)。因?yàn)轫?xiàng)目進(jìn)度的原因,有時(shí)不一定所有設(shè)備都在android移植前就緒,所以在開始移植前,首先要保證這些設(shè)備驅(qū)動(dòng)的優(yōu)先級(jí)。輸入,指至少有一種linux標(biāo)準(zhǔn)input設(shè)備,比如按鍵、觸摸屏、鼠標(biāo)等。輸出,則是指圖像輸出,linux里的framebuffer。17Android特定的驅(qū)動(dòng)Andro

11、id被社區(qū)所不滿的重要原因,就是這些不符合linux標(biāo)準(zhǔn)的專有驅(qū)動(dòng)。但對(duì)于Android系統(tǒng)來說,這些驅(qū)動(dòng)是必需的,包括OpenBinder、Logger、RawConsole、Ashmem和pmem等。另外,一些Android新加的驅(qū)動(dòng),比如LowMemoryKiller、timed_gpio,并不一定在開始時(shí)就必須,但會(huì)影響到android正常運(yùn)行,最好一次移植。對(duì)于Android特定驅(qū)動(dòng),如果內(nèi)核沒有指定,最好直接基于android源代碼樹里的某個(gè)內(nèi)核工程進(jìn)行移植,以減小移植工作量。如果內(nèi)核已指定,則只需要drivers/staging/android目錄。18Linux Input 子

12、系統(tǒng)19USB Gadget for AndroidAndroid對(duì)USB Gadget驅(qū)動(dòng)的修改,是插入一個(gè)新的功能,接供基本的讀寫通道,提供給adb使用。當(dāng)運(yùn)行android的設(shè)備一旦插到某臺(tái)主機(jī)的usb口上,主機(jī)上就可以通過adb來監(jiān)控設(shè)備,進(jìn)行特殊操作和調(diào)試應(yīng)用程序。另外,一般設(shè)備上的gadget驅(qū)動(dòng)也會(huì)提供文件存儲(chǔ)Mass Storage功能,這一部分也需要考慮這兩種功能的切換。這一功能由drivers/usb/gadget目錄里特定部分實(shí)現(xiàn):android.c實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)f_adb.c實(shí)現(xiàn)adb功能XXX_udc.c實(shí)現(xiàn)設(shè)備自己的gadget驅(qū)動(dòng),以及功能的切換20Android

13、Low Memory Killer機(jī)制Android的Low Memory Killer根據(jù)需要(當(dāng)系統(tǒng)物理內(nèi)存短缺時(shí))殺死進(jìn)程釋放其內(nèi)存,源代碼在drivers/staging/android/lowmemorykiller.c。據(jù)說它提供了比標(biāo)準(zhǔn)linux內(nèi)核的OOM機(jī)制更靈活的低內(nèi)存狀態(tài)下的管理。其一是task_struct-signal_struct-oom_adj越大的越優(yōu)先被kill;其二是占用物理內(nèi)存最多的那個(gè)進(jìn)程會(huì)被優(yōu)先kill。進(jìn)程描述符里面的signal_struct-oom_adj表示一個(gè)進(jìn)程在內(nèi)存短缺時(shí)候被選擇kill的優(yōu)先級(jí),取值在-1715,如果是-17則表示不會(huì)被

14、選中kill,值越大越可能被選中。一旦一個(gè)進(jìn)程被選中,內(nèi)核會(huì)發(fā)送SIGKILL信號(hào)將之殺死。21OOM實(shí)現(xiàn)標(biāo)準(zhǔn)Linux內(nèi)核OOM Killer在mm/oom_kill.c中實(shí)現(xiàn),在mm/page_alloc.c_alloc_pages_may_oom被調(diào)用。Oom_kill.c最主要的一個(gè)函數(shù)是out_of_memory,它選擇一個(gè)bad進(jìn)程殺死,殺死的方法同樣是通過發(fā)送SIGKILL信號(hào)。在out_of_memory中通過調(diào)用select_bad_process選擇一個(gè)進(jìn)程殺死,選擇的依據(jù)在badness函數(shù)中實(shí)現(xiàn),基于多個(gè)標(biāo)準(zhǔn)來給每個(gè)進(jìn)程算分,分最高的被選中殺死?;旧鲜钦加脙?nèi)存越多,o

15、om_adj越大越有可能被選中??梢奱ndroid的low memory killer和標(biāo)準(zhǔn)的oom killer很多想法是一致的,只不過low memory killer作為一個(gè)shrinker實(shí)現(xiàn);而oom killer則在分配內(nèi)存時(shí)候被調(diào)用(如果內(nèi)存資源很緊張)221、源代碼分析2、配置接口 過下面兩個(gè)文件,/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller /parameters/minfree配置系統(tǒng)的相關(guān)參數(shù)。23OpenBinder代碼目錄:kernel/include/linux/bind

16、er.hkernel/drivers/staging/android/binder.c binder驅(qū)動(dòng)程序是一個(gè)miscdevice,主設(shè)備號(hào)為10,此設(shè)備號(hào)使用動(dòng)態(tài)獲得(MISC_DYNAMIC_MINOR),其設(shè)備的節(jié)點(diǎn)為:/dev/binder從Linux的概念空間中,Android的設(shè)計(jì)Activity托管在不同的的進(jìn)程,Service也都是托管在不同的進(jìn)程,不同進(jìn)程間的Activity、Service之間要交換數(shù)據(jù)屬于IPC。Binder就是為了Activity通訊而設(shè)計(jì)的一個(gè)輕量級(jí)的IPC框架。binder解決的是進(jìn)程間通信,也能共享對(duì)象。IPC的過程是通過 內(nèi)核一個(gè)模塊(或用戶

17、空間的守護(hù)進(jìn)程),中轉(zhuǎn)和翻譯不同進(jìn)程需要共享的對(duì)象,以取得所有進(jìn)程似乎處于同一個(gè)名字空間的效果。比如A進(jìn)程如果要使用B進(jìn)程的 服務(wù),B進(jìn)程首先注冊(cè)此服務(wù),A進(jìn)程通過binder獲取該服務(wù)的hanlde,用這個(gè)handle,A進(jìn)程就可以使用該服務(wù)了。24ashmemashmem是android的內(nèi)存分配/共享機(jī)制,在dev目錄下對(duì)應(yīng)的設(shè)備是/dev/ashmem,相比于傳統(tǒng)的內(nèi)存分配機(jī)制,如malloc、anonymous/named mmap,其好處是提供了輔助內(nèi)核內(nèi)存回收算法的pin/unpin機(jī)制。ashmem的典型用法是先打開設(shè)備文件,然后做mmap映射。第一步通過調(diào)用ashmem_cr

18、eate_region函數(shù),這個(gè)函數(shù)完成這幾件事:1)fd = open(/dev/ashmem, O_RDWR);2)ioctl(fd, ASHMEM_SET_NAME, region_name); / 這一步可選3)ioctl(fd, ASHMEM_SET_SIZE, region_size);25第二步,應(yīng)用程序一般會(huì)調(diào)用mmap來把a(bǔ)shmem分配的空間映射到進(jìn)程空間:mapAddr = mmap(NULL, pHdr-mapLength, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);應(yīng)用程序還可以通過ioctl來pin和unpin某一段映射

19、的空間,以提示內(nèi)核的page cache算法可以把哪些頁面回收,這是一般mmap做不到的??梢哉fashmem以較小的代價(jià)(用戶需進(jìn)行額外的ioctl調(diào)用來設(shè)置名字,大小,pin和unpin),獲得了一些內(nèi)存使用的智能性。26pmem目的:為系統(tǒng)提供“連續(xù)的物理內(nèi)存”申請(qǐng)方式:1.直接向linux內(nèi)核申請(qǐng),在系統(tǒng)啟動(dòng)初reserve內(nèi)存。2 .利用內(nèi)存物理地址傳遞信息驅(qū)動(dòng)源碼分析如何添加一段pmem內(nèi)存如何使用kernel提供的pmem2728電源控制(Wakelock)Android電源管理的新手段之一,全稱“喚醒鎖”,防止系統(tǒng)在未經(jīng)允許情況下睡眠引起異常。應(yīng)小心使用,防止引起電流損失。參照文

20、檔:http:/Android_Power_ManagementWakelock 的類型:WAKE_LOCK_IDLE, orWAKE_LOCK_SUSPEND.29Android的文件系統(tǒng)boot.img,包含zImage和init ramdiskrecovery,system, userdata, cache,標(biāo)準(zhǔn)是使用yaffs2,但也有可能使用jffs2,ubifs或是ext3(如果是emmc)Recovery,是一個(gè)包含有一個(gè)類似于busybox環(huán)境的字符界面的根文件系統(tǒng),用于系統(tǒng)恢復(fù)和升級(jí)system,存放系統(tǒng)可執(zhí)行,只讀的文件系統(tǒng),包含framework,和系統(tǒng)自帶的應(yīng)用程序等。

21、data,存放動(dòng)態(tài)、需要持久保存的數(shù)據(jù)文件,比如用戶自己安裝的應(yīng)用程序、應(yīng)用程序的數(shù)據(jù)庫等cache,存放動(dòng)態(tài)存儲(chǔ)可隨時(shí)刪除的數(shù)據(jù)文件,比如下載中間文件,安裝中間文件等30boot.img* + * | boot header | 1 page* +* | kernel | n pages* +* | ramdisk | m pages* +* | second stage | o pages* +解開boot.img:讀第一頁讀出kernel和ramdisk的大小信息,再使用dd命令拷貝出內(nèi)核文件和ramdisk。解開ramdisk:mkdir dir_for_rootfscd dir_fo

22、r_rootfsgunzip c ramdisk.img | cpio -idv31打包ramdiskfind . | cpio o H newc | gzip ramdisk.img打包boot.imgmkbootimg-cmdlineno_console_suspend=1console=null-kernelyour-kernel-file-ramdisknewramdisk.cpio.gz-omynewimage.img使用fastboot模式,或是recovery模式將boot.img燒寫到boot分區(qū)在移植階段,剛開始不建議使用這種模式,因?yàn)椴灰渍{(diào)試和修改32其他文件分區(qū)其他分區(qū),

23、一般使用同一文件系統(tǒng),以減少不必要的開銷。這些分區(qū)的鏡像文件由android源代碼編譯時(shí)生成,生成的文件鏡像在out/target/product/BOARD_NAME目錄里,BOARD_NAME是由移植者指定的目標(biāo)板的名字。使用基于nand的文件系統(tǒng),需要使用專門的文件系統(tǒng)工具編輯和修改,使用emmc的,則可以像一般文件系統(tǒng)那樣操作只有system是必須的,其他可以清空Recovery一般只在出廠設(shè)備里才有用33Android的init內(nèi)核裝載init ramdisk之后,執(zhí)行/init文件,對(duì)init.rc進(jìn)行解析執(zhí)行,完成系統(tǒng)啟動(dòng)Android的init跟普通的init腳本不一樣,它不是

24、由shell寫的,功能很有限,快速而調(diào)試?yán)щyInit腳本執(zhí)行的目的只是為了啟動(dòng)和完善dalvik虛擬機(jī)的可執(zhí)行環(huán)境34init初始化流程Init進(jìn)程Android啟動(dòng)后,系統(tǒng)執(zhí)行的第一個(gè)進(jìn)程是一個(gè)名 稱為init的可執(zhí)行程序。提供了以下的功能: 設(shè)備管理 解析啟動(dòng)腳本 執(zhí)行基本的功能 啟動(dòng)各種服務(wù)35代碼的路徑: system/core/init 編譯的結(jié)果是一個(gè)可執(zhí)行文件:init啟動(dòng)腳本的路徑: system/core/rootdir/init.rcinit的可執(zhí)行文件是系統(tǒng)運(yùn)行的第一個(gè)用戶空間的程序,它以守護(hù)進(jìn)程的方式運(yùn)行。36 init.rcinit.rc是在init啟動(dòng)后被執(zhí)行的啟動(dòng)

25、腳本,其語法 包含了Actions,Triggers,Services,Options,Commands,Properties等。查看init.rc幫助文檔:on initexport PATH /sbin:/system/sbin:/system/bin:/system/xbinmkdir /systemon property:ro.kernel.qemu=1start adbdservice vold /system/bin/voldsocket vold stream 0660 root mount37Service配置Service是用于控制系統(tǒng)服務(wù)配置項(xiàng),使用方法service *

26、Name 服務(wù)的名字,定義后可用于triggerPathname 執(zhí)行文件的路徑Argument 可選項(xiàng),執(zhí)行時(shí)的參數(shù)Option 指定執(zhí)行的一些屬性例子:service vold /system/bin/voldsocket vold stream 0660 root mount38使用方法參考system/core/init/readme.txt關(guān)鍵字參考system/core/init/keyword.hShell 工具Bash/ash/*Android系統(tǒng)的啟動(dòng)后,提供了基本shell界面供開發(fā)調(diào)試使用。需要啟動(dòng)了一個(gè)名稱為console的服務(wù),實(shí)際上執(zhí)行的程序:39/system/b

27、in/sh sh代碼的路徑:system/core/sh toolbox代碼的路徑:system/core/toolbox 生成的文件/system/bin/toolbox,目標(biāo)文件系統(tǒng)/system/bin/中的具有一些符號(hào)將連接到toolbox上。40libutils是Android的底層庫,這個(gè)庫以C+實(shí)現(xiàn),它提供的API也是C+的。Android的層次的C語言程序和庫,大都基于libutils開發(fā)。頭文件的路徑: frameworks/base/include/utils庫的路徑 frameworks/base/libs/utils編譯的結(jié)果是:libutils.so41Android

28、中幾個(gè)重要系統(tǒng)進(jìn)程為:/init/system/bin/servicemanager ,/system/bin/mediaserversystem_serverzygote前面init分析章節(jié)提到init通過解析init.rc,啟動(dòng)對(duì)應(yīng)的服務(wù)程序。servicemanager,zygote和mediaserver都通過這種方式啟動(dòng)。system_server則是通過zygote孵化出來。這幾個(gè)進(jìn)程是Android系統(tǒng)運(yùn)行的基礎(chǔ)。423.2 Android的編譯系統(tǒng)特點(diǎn)1. Multiple Targets (多目標(biāo)性,靈活)2. Non-Recursive Make(非迭代創(chuàng)建,高效)3. R

29、apid Compile-Test Cycles(快速,高效)4. Both Environment and Config File Based Settings (環(huán)境變量和配置文件結(jié)合,簡(jiǎn)單)5. Object File Directory / make clean (獨(dú)立干凈,不會(huì)破壞源代碼結(jié)構(gòu))43基于Gnu MakeMakefile 規(guī)則簡(jiǎn)介 target . : prerequisites . command . .target也就是一個(gè)目標(biāo)文件,可以是Object File,也可以是執(zhí)行文件。還可以是一個(gè)標(biāo)簽(Label),對(duì)于標(biāo)簽這種特性,在后續(xù)的“偽目標(biāo)”章節(jié)中會(huì)有敘述。pr

30、erequisites就是,要生成那個(gè)target所需要的文件或是目標(biāo)。command也就是make需要執(zhí)行的命令。(任意的Shell命令)44Android編譯系統(tǒng)構(gòu)成完全由build目錄里的.mk文件及一些腳本組成:build/core/main.mk makefile的主入口build/core/config.mk 用來進(jìn)行配置基本性配置build/core/envsetup.mk 用來處理環(huán)境變量的設(shè)置build/target/product 產(chǎn)品相關(guān)的配置build/target/board 板卡相關(guān)的配置build/core/combo 用來處理各種組合情況,比如Host跟Targ

31、et的編譯器選項(xiàng)的組合45Local Module整體由部分組成,對(duì)于Android系統(tǒng),在編譯系統(tǒng)之外,每一個(gè)部分就是由Android.mk來生成的。它只會(huì)找到一個(gè)目錄里最先找到的Android.mk,如果要進(jìn)一步編譯子目錄里的工程,則需要進(jìn)行makefile的包含處理。LOCAL_MODULE_TAGS可用于指定在不同模式下需要編譯哪些模塊,比如user、eng、debug。編譯子目錄使用mm,mmm清除指定模塊project_name,使用make clean-project_name463.3 在Android里面加入自己的平臺(tái)Android的編譯系統(tǒng),會(huì)到一個(gè)固定的目錄里去讀取平臺(tái)相

32、關(guān)的配置,在2.2以前的版本在vendor目錄,2.2版之后,換到了device目錄。命名為vendor/產(chǎn)商名/設(shè)備名。比如是ti的panda-board,則以如下方式建立這個(gè)目錄,再在這個(gè)目錄里放置平臺(tái)相關(guān)的配置項(xiàng)。device/acom/s5pc110平臺(tái)相關(guān)的配置,主要由幾個(gè)關(guān)鍵文件構(gòu)成:vendorsetup.shAndroidProducts.mkacom_s5pc110.mkdevice.mkBoardConfig.mk47vendorsetup.sh提供給build/envsetup.sh,進(jìn)行環(huán)境變量設(shè)置,使配置項(xiàng)可被導(dǎo)入編譯系統(tǒng)。在Android編譯里一般是使用lunch

33、ti_pandaboard-eng這種方式指定編譯配置,這一文件就可以將配置加入到編譯系統(tǒng)可選項(xiàng)里。它的內(nèi)容一般很簡(jiǎn)單,是一系列的add_lunch_combo語句。比如我們要加入我們的s5pc110,以工程機(jī)方式編譯,就是:add_lunch_como acom_s5pc110-eng48AndroidProducts.mk用來指定這一產(chǎn)品配置文件的主入品配置文件是哪個(gè),一般這個(gè)主配置文件以產(chǎn)商名_設(shè)備名.mk的方式命名,如下面的acom_s5pc110.mk。而這一文件的內(nèi)容,也只有簡(jiǎn)單的一行:PRODUCT_MAKEFILES := $(LOCAL_DIR)/acom_s5pc110.m

34、k49acom_s5pc110.mk產(chǎn)品主配置文件,定義PRODUCT_NAME、PRODUCT_DEVICE等關(guān)鍵變量通過這一主makefile文件,可以通過導(dǎo)入其他makefile文件來實(shí)現(xiàn)導(dǎo)入其他編譯相關(guān)的配置,比如設(shè)定產(chǎn)品的語言支持、使用哪些預(yù)裝包,導(dǎo)入哪些子項(xiàng)目等這些設(shè)置一般會(huì)導(dǎo)入一個(gè)本地的device.mk文件,在這個(gè)文件里,再去覆蓋掉繼承過來的配置屬性示例50# Inherit from those products. Most specific first.$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_f

35、ull.mk)# This is where wed set a backup provider if we had one#$(call inherit-product, device/sample/products/backup_overlay.mk)$(call inherit-product, device/acom/s5pc110/device.mk)$(call inherit-product, $(SRC_TARGET_DIR)/product/full.mk)# Discard inherited values and use our own instead.PRODUCT_N

36、AME := acom_s5pc110PRODUCT_DEVICE := s5pc110PRODUCT_MODEL := Full Android on Acom S5PC110PRODUCT_MANUFACTURER := ACOM51device.mk基于一個(gè)基本的產(chǎn)品定義,會(huì)需要很多的用戶自定義的內(nèi)容,就可以在這個(gè)device.mk里面對(duì)那些默認(rèn)的值進(jìn)行針對(duì)于目標(biāo)平臺(tái)的覆蓋。DEVICE_PACKAGE_OVERLAYS這個(gè)參數(shù)可以直接使用一些主題等資源文件覆蓋掉默認(rèn)主題。一般這個(gè)文件里只提供文件復(fù)制(用于替換)的功能,但這個(gè)文件里也可以指定針對(duì)于目標(biāo)平臺(tái)的子項(xiàng)目(包括Android.m

37、k的子目錄)是否需要被編譯和包含。52device.mkDEVICE_PACKAGE_OVERLAYS := device/ti/pandaboard/overlay# These are the hardware-specific configuration filesPRODUCT_COPY_FILES := device/ti/pandaboard/vold.fstab:system/etc/vold.fstab device/ti/pandaboard/egl.cfg:system/lib/egl/egl.cfg# Filesystem management toolsPRODUCT_

38、PACKAGES += make_ext4fs setup_fs# graphicsPRODUCT_PACKAGES += sgx-driver53Android.mk對(duì)于Android的編譯,要讓這個(gè)文件可以翻譯系統(tǒng)掃描到,也必須包括一個(gè)Android.mk文件。這個(gè)文件的構(gòu)成會(huì)盡可能簡(jiǎn)單,只用于包含子項(xiàng)目的Android.mk文件。例如:include $(call all-subdir-makefiles)54CleanSpec.mkGNU Make是一種漸見式的編譯工具,其他結(jié)果,在操作源不變的情況下是不會(huì)重復(fù)執(zhí)行的,這樣就可以達(dá)到最高的編譯效率,只編譯有改動(dòng)的部分。但有些文件,可能每

39、次都希望它被重新編譯一次,生成新的內(nèi)容。這時(shí)就可以通過一個(gè)CleanSpec.mk文件,每次翻譯前就先清理一下這些中間結(jié)果。它的內(nèi)容如下一系列的call all-clean-step語句組成:$(call add-clean-step, rm rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates55有了這幾個(gè)文件,新的平臺(tái)支持就被加入了,然后就可以基于這些文件的配置,往這個(gè)目錄里填寫相應(yīng)的平臺(tái)支持。對(duì)于項(xiàng)目外包或是解決方案提供商,可能需要面臨一個(gè)二進(jìn)制文件分發(fā)問題(受保密協(xié)議限制,不公布源代碼)。對(duì)于這類代碼,一般可

40、以在vendor/ti/pandaboard里提供。而開發(fā)這類源代碼的項(xiàng)目,可以使用一個(gè)Android.mk文件將項(xiàng)目加入Android的編譯工程里563.4 在Android里新增一個(gè)編譯工程 一個(gè)包含Android.mk的目錄,就是一個(gè)Android的工程。而這個(gè)被用到的Android.mk文件,可以用于一些翻譯用途,比如編譯java、c、c+文件,打包資源文件,拷貝,或是文件轉(zhuǎn)換。Android.mk指定的編譯工程,既可以用于Android源代碼里的項(xiàng)目生成,又可以用于NDK。區(qū)別是,在Android源代碼里新建工程,則工程會(huì)被編入Android系統(tǒng),全局可使用;而在NDK里,則只能用于

41、某一個(gè)應(yīng)用程序,而且生成的編譯結(jié)果必須要被打包進(jìn)某一個(gè)應(yīng)用程序。在NDK里的工程,一般只會(huì)是JNI項(xiàng)目,因?yàn)锳ndroid只能通過Java被調(diào)用。而在源代碼里,這種制約性就沒有了,一些底層代碼也可以由新建的工程來提供,唯一的要求是放到一個(gè)編譯系統(tǒng)會(huì)掃描的目錄,比如device/ti/pandaboard57Android.mk一個(gè)最簡(jiǎn)單的Android.mk文件如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= helloworldLOCAL_SRC_FILES := helloworld.cinclude $(

42、BUILD_SHARED_LIBRARY)它會(huì)編譯一個(gè)helloworld.c,生成helloword可執(zhí)行文件58CLEAR_VARS指向一個(gè)編譯腳本,幾乎所有未定義的LOCAL_XXX變量都在“Module-description”節(jié)中列出。必須在開始一個(gè)新模塊之前包含這個(gè)腳本。include $(CLEAR_VARS)BUILD_SHARED_LIBRARY指向編譯腳本,收集所有的你在LOCAL_XXX變量中提供的信息,并且決定如何把你列出的源代碼文件編譯成一個(gè)共享庫。注意,必須至少在包含這個(gè)文件之前定義LOCAL_MODULE和LOCAL_SRC_FILESinclude $(BUILD_SHARED_LIBRARY)這將生成一個(gè)名為lib$(LOCAL_MO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論