版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè) 教學資源建設(shè)嵌入式技術(shù)應(yīng)用課程教學資源建設(shè)建設(shè)院校:無錫職業(yè)技術(shù)學院1.Android開發(fā)入門什么是Android2 Android開發(fā)平臺Android 簡介Android是執(zhí)行于Linux kernel之上,但并不是Linux操作系統(tǒng)。因為在一般Linux里支持的功能,Android大都沒有支持,包括Cairo、X11、glibc、Gnome、KDE。Android為了達到商業(yè)應(yīng)用,使用的是更加對商用化友好的Apache協(xié)議進行分發(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平臺上開發(fā)Android應(yīng)用的開發(fā)組件,Android支持所有的平臺,其包含了在Android平臺上開發(fā)移動應(yīng)用的各種工具集。 工具集不僅包括了Android模擬器和用來調(diào)試、打包和在模擬器上安裝應(yīng)用的工具。 Android 編程主要是以Java語言為基礎(chǔ),用戶可以使用Java語言來開發(fā)Android平臺上的軟件應(yīng)用。通過SDK提供的一些工具將其打包成Android平臺使用的apk文件,然后可以用SDK中的模擬器(Emulator)來模擬和測試
3、軟件在Android平臺上運行情況和效果。52.Android源代碼的下載和編譯版本管理工具git和repo下載Android源代碼編譯Android的虛擬機鏡像6Git 和 RepoGit是Linuz Torvalds為了幫助linux內(nèi)核開發(fā)而創(chuàng)建的一套分布式版本管理工具。分布式版本控制工具最重要的作用是沒有中央節(jié)點,可以離線工作,并且極其容易派生出新的開發(fā)源代碼樹。Android源代碼管理本身是使用的Git,但因為Android源代碼里面包含了復(fù)雜的源代碼結(jié)構(gòu),所以又在Git之上包裝出一套新的工具,repo,這個repo只是一個簡單的python腳本集7 Android源代碼的依賴項參考
4、http:/source/index.html,Getting Started章節(jié)要點:Linux(推薦Ubuntu)或MacOSX(區(qū)別大小寫的文件系統(tǒng))2g以上內(nèi)存,12g以上硬盤空間JDK16非常長的下載和編譯時間依賴軟件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è)置編譯目標(因為沒有目標板的設(shè)置,因為尚未完成移植,這時的編譯目標會是虛擬機)lun
6、ch full-eng編譯make j4結(jié)果生成的結(jié)果在out目錄里,其中out/host目錄里存在主機工具,out/target目錄里保存目標板可執(zhí)行環(huán)境10編譯排錯make j4是并行化編譯,以四個線程同時進行編譯,但會影響出錯時的輸出,一旦編譯最后出錯,應(yīng)該以make命令保持編譯的串行有時,結(jié)果會不如預(yù)期,需要定位出錯的詳細內(nèi)容,可以使用make showcommands另外,可以指定只編譯某一功能部件,以節(jié)省編譯時間,使用mm或是mmm命令來指定單一的子部件,這一命令會只編譯一個目標,以及這一目標的依賴項113. Android的平臺移植Android移植的基本步驟Linux內(nèi)核加入新
7、的平臺的設(shè)置文件必備驅(qū)動HAL123.1 Android移植的基本步驟編譯和移植linux內(nèi)核,先保證內(nèi)核沒有問題,可以基于busybox運行出一個可調(diào)試環(huán)境,并且驗證硬件驅(qū)動的可用性。在Linux內(nèi)核里增加android所需要的驅(qū)動調(diào)整init.rc相應(yīng)腳本,以及生成rootfs創(chuàng)建合適的平臺相關(guān)的配置文件實現(xiàn)平臺相應(yīng)的硬件抽象層(HAL)代碼燒寫及調(diào)試13Android的啟動過程(1)上電,bootloader初始化硬件,檢測啟動模式,正常或是Recovery模式。如果正常啟動模式,則啟動linux內(nèi)核。在內(nèi)核初始化的最后一步,會裝載ramfs到/目錄,嘗試運行init進程(Android
8、環(huán)境里會是android特定的init可執(zhí)行程序)Init進程解析init.rc和目標板特定的init.XXX.rc文件,設(shè)置環(huán)境變量,裝載各個分區(qū),執(zhí)行各個系統(tǒng)服務(wù),以及運行Zygote這個Dalvik虛擬的管理工具。Init.rc文件允許類似于shell之類的執(zhí)行,這樣可以加入用c寫的系統(tǒng)服務(wù),初始化特殊化硬件。14Android啟動過程(2)Zygote的第一生成的進程,會生成system_server,這個進程創(chuàng)建及控制android系統(tǒng)內(nèi)的所有系統(tǒng)服務(wù)。在這些系統(tǒng)服務(wù)的初始化過程中,會初始化各個硬件驅(qū)動的hal實現(xiàn),比如SurfaceFlinger初始化Framebuffer輸出,S
9、ensorService初始化感應(yīng)器。在bootanimation成功運行,則android啟動已經(jīng)成功了一小步在bootanimation結(jié)束后,Zygote會嘗試發(fā)送intent.category.HOME,這一Intent會觸發(fā)發(fā)Home的執(zhí)行,也就是Android的主界面Launcher。這時用戶可見部分就成功了。15內(nèi)核的移植增加arch/CPU/MACH目錄CPU目錄存在相應(yīng)芯片體系的支持,比如arm,mips,powerpc。MACH對應(yīng)到具體的芯片,比如mach-omap4實現(xiàn)芯片的支持,包括CPU初始化,內(nèi)存初始化,串口,時鐘,關(guān)鍵gpio,能源管理芯片,以及設(shè)備驅(qū)動模型管理
10、下的所有硬件驅(qū)動定義數(shù)組。編譯busybox,生成根文件系統(tǒng),即所謂的initramfs,在這一文件系統(tǒng)里先完成硬件的可用性測試16輸入,輸出和USB作為基本的嵌入式系統(tǒng),至少需要基本的輸入輸出設(shè)備支持,對于Android,則作為USB設(shè)備端的驅(qū)動也需要,以方便adb的連接調(diào)試(或者用網(wǎng)絡(luò)設(shè)備驅(qū)動代替也行)。因為項目進度的原因,有時不一定所有設(shè)備都在android移植前就緒,所以在開始移植前,首先要保證這些設(shè)備驅(qū)動的優(yōu)先級。輸入,指至少有一種linux標準input設(shè)備,比如按鍵、觸摸屏、鼠標等。輸出,則是指圖像輸出,linux里的framebuffer。17Android特定的驅(qū)動Andro
11、id被社區(qū)所不滿的重要原因,就是這些不符合linux標準的專有驅(qū)動。但對于Android系統(tǒng)來說,這些驅(qū)動是必需的,包括OpenBinder、Logger、RawConsole、Ashmem和pmem等。另外,一些Android新加的驅(qū)動,比如LowMemoryKiller、timed_gpio,并不一定在開始時就必須,但會影響到android正常運行,最好一次移植。對于Android特定驅(qū)動,如果內(nèi)核沒有指定,最好直接基于android源代碼樹里的某個內(nèi)核工程進行移植,以減小移植工作量。如果內(nèi)核已指定,則只需要drivers/staging/android目錄。18Linux Input 子
12、系統(tǒng)19USB Gadget for AndroidAndroid對USB Gadget驅(qū)動的修改,是插入一個新的功能,接供基本的讀寫通道,提供給adb使用。當運行android的設(shè)備一旦插到某臺主機的usb口上,主機上就可以通過adb來監(jiān)控設(shè)備,進行特殊操作和調(diào)試應(yīng)用程序。另外,一般設(shè)備上的gadget驅(qū)動也會提供文件存儲Mass Storage功能,這一部分也需要考慮這兩種功能的切換。這一功能由drivers/usb/gadget目錄里特定部分實現(xiàn):android.c實現(xiàn)設(shè)備驅(qū)動f_adb.c實現(xiàn)adb功能XXX_udc.c實現(xiàn)設(shè)備自己的gadget驅(qū)動,以及功能的切換20Android
13、Low Memory Killer機制Android的Low Memory Killer根據(jù)需要(當系統(tǒng)物理內(nèi)存短缺時)殺死進程釋放其內(nèi)存,源代碼在drivers/staging/android/lowmemorykiller.c。據(jù)說它提供了比標準linux內(nèi)核的OOM機制更靈活的低內(nèi)存狀態(tài)下的管理。其一是task_struct-signal_struct-oom_adj越大的越優(yōu)先被kill;其二是占用物理內(nèi)存最多的那個進程會被優(yōu)先kill。進程描述符里面的signal_struct-oom_adj表示一個進程在內(nèi)存短缺時候被選擇kill的優(yōu)先級,取值在-1715,如果是-17則表示不會被
14、選中kill,值越大越可能被選中。一旦一個進程被選中,內(nèi)核會發(fā)送SIGKILL信號將之殺死。21OOM實現(xiàn)標準Linux內(nèi)核OOM Killer在mm/oom_kill.c中實現(xiàn),在mm/page_alloc.c_alloc_pages_may_oom被調(diào)用。Oom_kill.c最主要的一個函數(shù)是out_of_memory,它選擇一個bad進程殺死,殺死的方法同樣是通過發(fā)送SIGKILL信號。在out_of_memory中通過調(diào)用select_bad_process選擇一個進程殺死,選擇的依據(jù)在badness函數(shù)中實現(xiàn),基于多個標準來給每個進程算分,分最高的被選中殺死?;旧鲜钦加脙?nèi)存越多,o
15、om_adj越大越有可能被選中??梢奱ndroid的low memory killer和標準的oom killer很多想法是一致的,只不過low memory killer作為一個shrinker實現(xiàn);而oom killer則在分配內(nèi)存時候被調(diào)用(如果內(nèi)存資源很緊張)221、源代碼分析2、配置接口 過下面兩個文件,/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ū)動程序是一個miscdevice,主設(shè)備號為10,此設(shè)備號使用動態(tài)獲得(MISC_DYNAMIC_MINOR),其設(shè)備的節(jié)點為:/dev/binder從Linux的概念空間中,Android的設(shè)計Activity托管在不同的的進程,Service也都是托管在不同的進程,不同進程間的Activity、Service之間要交換數(shù)據(jù)屬于IPC。Binder就是為了Activity通訊而設(shè)計的一個輕量級的IPC框架。binder解決的是進程間通信,也能共享對象。IPC的過程是通過 內(nèi)核一個模塊(或用戶
17、空間的守護進程),中轉(zhuǎn)和翻譯不同進程需要共享的對象,以取得所有進程似乎處于同一個名字空間的效果。比如A進程如果要使用B進程的 服務(wù),B進程首先注冊此服務(wù),A進程通過binder獲取該服務(wù)的hanlde,用這個handle,A進程就可以使用該服務(wù)了。24ashmemashmem是android的內(nèi)存分配/共享機制,在dev目錄下對應(yīng)的設(shè)備是/dev/ashmem,相比于傳統(tǒng)的內(nèi)存分配機制,如malloc、anonymous/named mmap,其好處是提供了輔助內(nèi)核內(nèi)存回收算法的pin/unpin機制。ashmem的典型用法是先打開設(shè)備文件,然后做mmap映射。第一步通過調(diào)用ashmem_cr
18、eate_region函數(shù),這個函數(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)用程序一般會調(diào)用mmap來把ashmem分配的空間映射到進程空間:mapAddr = mmap(NULL, pHdr-mapLength, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);應(yīng)用程序還可以通過ioctl來pin和unpin某一段映射
19、的空間,以提示內(nèi)核的page cache算法可以把哪些頁面回收,這是一般mmap做不到的。可以說ashmem以較小的代價(用戶需進行額外的ioctl調(diào)用來設(shè)置名字,大小,pin和unpin),獲得了一些內(nèi)存使用的智能性。26pmem目的:為系統(tǒng)提供“連續(xù)的物理內(nèi)存”申請方式:1.直接向linux內(nèi)核申請,在系統(tǒng)啟動初reserve內(nèi)存。2 .利用內(nèi)存物理地址傳遞信息驅(qū)動源碼分析如何添加一段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,標準是使用yaffs2,但也有可能使用jffs2,ubifs或是ext3(如果是emmc)Recovery,是一個包含有一個類似于busybox環(huán)境的字符界面的根文件系統(tǒng),用于系統(tǒng)恢復(fù)和升級system,存放系統(tǒng)可執(zhí)行,只讀的文件系統(tǒng),包含framework,和系統(tǒng)自帶的應(yīng)用程序等。
21、data,存放動態(tài)、需要持久保存的數(shù)據(jù)文件,比如用戶自己安裝的應(yīng)用程序、應(yīng)用程序的數(shù)據(jù)庫等cache,存放動態(tài)存儲可隨時刪除的數(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ū)在移植階段,剛開始不建議使用這種模式,因為不易調(diào)試和修改32其他文件分區(qū)其他分區(qū),
23、一般使用同一文件系統(tǒng),以減少不必要的開銷。這些分區(qū)的鏡像文件由android源代碼編譯時生成,生成的文件鏡像在out/target/product/BOARD_NAME目錄里,BOARD_NAME是由移植者指定的目標板的名字。使用基于nand的文件系統(tǒng),需要使用專門的文件系統(tǒng)工具編輯和修改,使用emmc的,則可以像一般文件系統(tǒng)那樣操作只有system是必須的,其他可以清空Recovery一般只在出廠設(shè)備里才有用33Android的init內(nèi)核裝載init ramdisk之后,執(zhí)行/init文件,對init.rc進行解析執(zhí)行,完成系統(tǒng)啟動Android的init跟普通的init腳本不一樣,它不是
24、由shell寫的,功能很有限,快速而調(diào)試困難Init腳本執(zhí)行的目的只是為了啟動和完善dalvik虛擬機的可執(zhí)行環(huán)境34init初始化流程Init進程Android啟動后,系統(tǒng)執(zhí)行的第一個進程是一個名 稱為init的可執(zhí)行程序。提供了以下的功能: 設(shè)備管理 解析啟動腳本 執(zhí)行基本的功能 啟動各種服務(wù)35代碼的路徑: system/core/init 編譯的結(jié)果是一個可執(zhí)行文件:init啟動腳本的路徑: system/core/rootdir/init.rcinit的可執(zhí)行文件是系統(tǒng)運行的第一個用戶空間的程序,它以守護進程的方式運行。36 init.rcinit.rc是在init啟動后被執(zhí)行的啟動
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ù)配置項,使用方法service *
26、Name 服務(wù)的名字,定義后可用于triggerPathname 執(zhí)行文件的路徑Argument 可選項,執(zhí)行時的參數(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)的啟動后,提供了基本shell界面供開發(fā)調(diào)試使用。需要啟動了一個名稱為console的服務(wù),實際上執(zhí)行的程序:39/system/b
27、in/sh sh代碼的路徑:system/core/sh toolbox代碼的路徑:system/core/toolbox 生成的文件/system/bin/toolbox,目標文件系統(tǒng)/system/bin/中的具有一些符號將連接到toolbox上。40libutils是Android的底層庫,這個庫以C+實現(xiàn),它提供的API也是C+的。Android的層次的C語言程序和庫,大都基于libutils開發(fā)。頭文件的路徑: frameworks/base/include/utils庫的路徑 frameworks/base/libs/utils編譯的結(jié)果是:libutils.so41Android
28、中幾個重要系統(tǒng)進程為:/init/system/bin/servicemanager ,/system/bin/mediaserversystem_serverzygote前面init分析章節(jié)提到init通過解析init.rc,啟動對應(yīng)的服務(wù)程序。servicemanager,zygote和mediaserver都通過這種方式啟動。system_server則是通過zygote孵化出來。這幾個進程是Android系統(tǒng)運行的基礎(chǔ)。423.2 Android的編譯系統(tǒng)特點1. Multiple Targets (多目標性,靈活)2. Non-Recursive Make(非迭代創(chuàng)建,高效)3. R
29、apid Compile-Test Cycles(快速,高效)4. Both Environment and Config File Based Settings (環(huán)境變量和配置文件結(jié)合,簡單)5. Object File Directory / make clean (獨立干凈,不會破壞源代碼結(jié)構(gòu))43基于Gnu MakeMakefile 規(guī)則簡介 target . : prerequisites . command . .target也就是一個目標文件,可以是Object File,也可以是執(zhí)行文件。還可以是一個標簽(Label),對于標簽這種特性,在后續(xù)的“偽目標”章節(jié)中會有敘述。pr
30、erequisites就是,要生成那個target所需要的文件或是目標。command也就是make需要執(zhí)行的命令。(任意的Shell命令)44Android編譯系統(tǒng)構(gòu)成完全由build目錄里的.mk文件及一些腳本組成:build/core/main.mk makefile的主入口build/core/config.mk 用來進行配置基本性配置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的編譯器選項的組合45Local Module整體由部分組成,對于Android系統(tǒng),在編譯系統(tǒng)之外,每一個部分就是由Android.mk來生成的。它只會找到一個目錄里最先找到的Android.mk,如果要進一步編譯子目錄里的工程,則需要進行makefile的包含處理。LOCAL_MODULE_TAGS可用于指定在不同模式下需要編譯哪些模塊,比如user、eng、debug。編譯子目錄使用mm,mmm清除指定模塊project_name,使用make clean-project_name463.3 在Android里面加入自己的平臺Android的編譯系統(tǒng),會到一個固定的目錄里去讀取平臺相
32、關(guān)的配置,在2.2以前的版本在vendor目錄,2.2版之后,換到了device目錄。命名為vendor/產(chǎn)商名/設(shè)備名。比如是ti的panda-board,則以如下方式建立這個目錄,再在這個目錄里放置平臺相關(guān)的配置項。device/acom/s5pc110平臺相關(guān)的配置,主要由幾個關(guān)鍵文件構(gòu)成:vendorsetup.shAndroidProducts.mkacom_s5pc110.mkdevice.mkBoardConfig.mk47vendorsetup.sh提供給build/envsetup.sh,進行環(huán)境變量設(shè)置,使配置項可被導(dǎo)入編譯系統(tǒng)。在Android編譯里一般是使用lunch
33、ti_pandaboard-eng這種方式指定編譯配置,這一文件就可以將配置加入到編譯系統(tǒng)可選項里。它的內(nèi)容一般很簡單,是一系列的add_lunch_combo語句。比如我們要加入我們的s5pc110,以工程機方式編譯,就是:add_lunch_como acom_s5pc110-eng48AndroidProducts.mk用來指定這一產(chǎn)品配置文件的主入品配置文件是哪個,一般這個主配置文件以產(chǎn)商名_設(shè)備名.mk的方式命名,如下面的acom_s5pc110.mk。而這一文件的內(nèi)容,也只有簡單的一行:PRODUCT_MAKEFILES := $(LOCAL_DIR)/acom_s5pc110.m
34、k49acom_s5pc110.mk產(chǎn)品主配置文件,定義PRODUCT_NAME、PRODUCT_DEVICE等關(guān)鍵變量通過這一主makefile文件,可以通過導(dǎo)入其他makefile文件來實現(xiàn)導(dǎo)入其他編譯相關(guān)的配置,比如設(shè)定產(chǎn)品的語言支持、使用哪些預(yù)裝包,導(dǎo)入哪些子項目等這些設(shè)置一般會導(dǎo)入一個本地的device.mk文件,在這個文件里,再去覆蓋掉繼承過來的配置屬性示例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基于一個基本的產(chǎn)品定義,會需要很多的用戶自定義的內(nèi)容,就可以在這個device.mk里面對那些默認的值進行針對于目標平臺的覆蓋。DEVICE_PACKAGE_OVERLAYS這個參數(shù)可以直接使用一些主題等資源文件覆蓋掉默認主題。一般這個文件里只提供文件復(fù)制(用于替換)的功能,但這個文件里也可以指定針對于目標平臺的子項目(包括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對于Android的編譯,要讓這個文件可以翻譯系統(tǒng)掃描到,也必須包括一個Android.mk文件。這個文件的構(gòu)成會盡可能簡單,只用于包含子項目的Android.mk文件。例如:include $(call all-subdir-makefiles)54CleanSpec.mkGNU Make是一種漸見式的編譯工具,其他結(jié)果,在操作源不變的情況下是不會重復(fù)執(zhí)行的,這樣就可以達到最高的編譯效率,只編譯有改動的部分。但有些文件,可能每
39、次都希望它被重新編譯一次,生成新的內(nèi)容。這時就可以通過一個CleanSpec.mk文件,每次翻譯前就先清理一下這些中間結(jié)果。它的內(nèi)容如下一系列的call all-clean-step語句組成:$(call add-clean-step, rm rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates55有了這幾個文件,新的平臺支持就被加入了,然后就可以基于這些文件的配置,往這個目錄里填寫相應(yīng)的平臺支持。對于項目外包或是解決方案提供商,可能需要面臨一個二進制文件分發(fā)問題(受保密協(xié)議限制,不公布源代碼)。對于這類代碼,一般可
40、以在vendor/ti/pandaboard里提供。而開發(fā)這類源代碼的項目,可以使用一個Android.mk文件將項目加入Android的編譯工程里563.4 在Android里新增一個編譯工程 一個包含Android.mk的目錄,就是一個Android的工程。而這個被用到的Android.mk文件,可以用于一些翻譯用途,比如編譯java、c、c+文件,打包資源文件,拷貝,或是文件轉(zhuǎn)換。Android.mk指定的編譯工程,既可以用于Android源代碼里的項目生成,又可以用于NDK。區(qū)別是,在Android源代碼里新建工程,則工程會被編入Android系統(tǒng),全局可使用;而在NDK里,則只能用于
41、某一個應(yīng)用程序,而且生成的編譯結(jié)果必須要被打包進某一個應(yīng)用程序。在NDK里的工程,一般只會是JNI項目,因為Android只能通過Java被調(diào)用。而在源代碼里,這種制約性就沒有了,一些底層代碼也可以由新建的工程來提供,唯一的要求是放到一個編譯系統(tǒng)會掃描的目錄,比如device/ti/pandaboard57Android.mk一個最簡單的Android.mk文件如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= helloworldLOCAL_SRC_FILES := helloworld.cinclude $(
42、BUILD_SHARED_LIBRARY)它會編譯一個helloworld.c,生成helloword可執(zhí)行文件58CLEAR_VARS指向一個編譯腳本,幾乎所有未定義的LOCAL_XXX變量都在“Module-description”節(jié)中列出。必須在開始一個新模塊之前包含這個腳本。include $(CLEAR_VARS)BUILD_SHARED_LIBRARY指向編譯腳本,收集所有的你在LOCAL_XXX變量中提供的信息,并且決定如何把你列出的源代碼文件編譯成一個共享庫。注意,必須至少在包含這個文件之前定義LOCAL_MODULE和LOCAL_SRC_FILESinclude $(BUILD_SHARED_LIBRARY)這將生成一個名為lib$(LOCAL_MO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 陽臺斷橋鋁防水施工方案
- 燃氣凝水缸施工方案
- 線路登檢施工方案
- 知名的假樹施工方案
- 商洛環(huán)保塑膠跑道施工方案
- 室外籃球場刷漆施工方案
- 群租房社區(qū)治理方案
- 全自動立式制袋包裝機行業(yè)深度研究報告
- 2025年中國核素藥物行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略咨詢報告
- 宏觀經(jīng)濟學2024年案例分析教案2篇
- 道德經(jīng)中德文對照版
- 公路工程隨機抽樣一覽表(路基路面現(xiàn)場測試隨機選點方法自動計算)
- 2021版中醫(yī)癥候醫(yī)保對應(yīng)中醫(yī)癥候醫(yī)保2
- 2023年山東省青島市中考化學試題(含答案解析)
- 商業(yè)計劃書(BP)產(chǎn)品與服務(wù)的撰寫秘籍
- 安徽華塑股份有限公司年產(chǎn) 4萬噸氯化石蠟項目環(huán)境影響報告書
- 公司章程(二個股東模板)
- 世界奧林匹克數(shù)學競賽6年級試題
- 藥用植物學-課件
- 文化差異與跨文化交際課件(完整版)
- 國貨彩瞳美妝化消費趨勢洞察報告
評論
0/150
提交評論