Android系統(tǒng)移植技術(shù)詳解_第1頁(yè)
Android系統(tǒng)移植技術(shù)詳解_第2頁(yè)
Android系統(tǒng)移植技術(shù)詳解_第3頁(yè)
Android系統(tǒng)移植技術(shù)詳解_第4頁(yè)
Android系統(tǒng)移植技術(shù)詳解_第5頁(yè)
已閱讀5頁(yè),還剩157頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGEAndroid系統(tǒng)開(kāi)發(fā)編譯環(huán)境配置主機(jī)系統(tǒng):Ubuntu9.04

(1)安裝如下軟件包

sudoapt-getinstallgit-core

sudoapt-getinstallgnupg

sudoapt-getinstallsun-java5-jdk

sudoapt-getinstallflex

sudoapt-getinstallbison

sudoapt-getinstallgperf

sudoapt-getinstalllibsdl-dev

sudoapt-getinstalllibesd0-dev

sudoapt-getinstallbuild-essential

sudoapt-getinstallzip

sudoapt-getinstallcurl

sudoapt-getinstalllibncurses5-dev

sudoapt-getinstallzlib1g-dev

android編譯對(duì)java的需求只支持jdk5.0低版本,jdk5.0update12版本和java6不支持。

(2)下載repo工具

curl/repo>/bin/repo

chmoda+x/bin/repo

(3)創(chuàng)建源代碼下載目錄:

mkdir/work/android-froyo-r2

(4)用repo工具初始化一個(gè)版本(以android2.2r2為例)

cd/work/android-froyo-r2

repoinit-ugit:///platform/manifest.git-bfroyo

初始化過(guò)程中會(huì)顯示相關(guān)的版本的TAG信息,同時(shí)會(huì)提示你輸入用戶(hù)名和郵箱地址,以上面的方式初始化的是android2.2froyo的最新版本,

android2.2本身也會(huì)有很多個(gè)版本,這可以從TAG信息中看出來(lái),當(dāng)前froyo的所有版本如下:

*[newtag]

android-2.2.1_r1->android-2.2.1_r1

*[newtag]

android-2.2_r1->android-2.2_r1

*[newtag]

android-2.2_r1.1->android-2.2_r1.1

*[newtag]

android-2.2_r1.2->android-2.2_r1.2

*[newtag]

android-2.2_r1.3->android-2.2_r1.3

*[newtag]

android-cts-2.2_r1->android-cts-2.2_r1

*[newtag]

android-cts-2.2_r2->android-cts-2.2_r2

*[newtag]

android-cts-2.2_r3->android-cts-2.2_r3

這樣每次下載的都是最新的版本,當(dāng)然我們也可以根據(jù)TAG信息下載某一特定的版本如下:

repoinit-ugit:///platform/manifest.git-bandroid-cts-2.2_r3

(5)下載代碼

reposync

froyo版本的代碼大小超過(guò)2G,漫長(zhǎng)的下載過(guò)程。

(6)編譯代碼

cd/work/android-froyo-r2

makeUbuntu下使用Simba服務(wù)實(shí)現(xiàn)局域網(wǎng)內(nèi)文件共享Ubuntu下安裝Simba服務(wù)器將linux電腦上的內(nèi)容共享,同一局域網(wǎng)內(nèi)的另外一臺(tái)WindowsPC即可訪問(wèn)其共享內(nèi)容,從而實(shí)現(xiàn)Windows電腦向訪問(wèn)本地文件一樣訪問(wèn)Linux文件系統(tǒng)的內(nèi)容。(1)安裝Simaba服務(wù)器sudoapt-getinstallsamba(2)安裝samba圖形化配置軟件sudoapt-getinstallsystem-config-samba(3)創(chuàng)建一個(gè)Simba專(zhuān)用用戶(hù)從“系統(tǒng)”—“系統(tǒng)管理”—“用戶(hù)和組”,來(lái)創(chuàng)建。如圖,先點(diǎn)擊“解鎖”,然后“添加新用戶(hù)”然后輸入新用戶(hù)名字(如Simba)和密碼(如111111),然后在“高級(jí)”里面,選擇“主組”為sambashare后點(diǎn)擊"確定"即可一句話來(lái)概括,就是創(chuàng)建一個(gè)主組為sambashare的用戶(hù)(4)配置samba共享從“系統(tǒng)”—“系統(tǒng)管理—”samba“,運(yùn)行配置界面然后”首選項(xiàng)“—”服務(wù)器設(shè)置“。點(diǎn)擊:安全性,在最后的”來(lái)賓帳號(hào)“里面,選擇我們新建立的那個(gè)用戶(hù)simba后點(diǎn)擊確定(5)修改samba配置文件打開(kāi)/etc/samba/smb.conf,修改validusers=XXXX為validusers=simba(6)重啟samba服務(wù)sudo/etc/init.d/sambarestart(7)添加共享文件從“系統(tǒng)”—“系統(tǒng)管理—”samba“,運(yùn)行配置界面點(diǎn)擊"添加"來(lái)添加共享文件夾,點(diǎn)擊"瀏覽"來(lái)選擇需要共享的文件夾,選擇"可擦寫(xiě)"和"顯示",點(diǎn)擊"訪問(wèn)"可以設(shè)置訪問(wèn)權(quán)限,最好設(shè)置成"允許所有用戶(hù)訪問(wèn)"本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:/jiajie961/archive/2010/11/04/5987821.aspxUbuntu下tftp服務(wù)器的創(chuàng)建實(shí)驗(yàn)平臺(tái):Ubuntu9.04(1)安裝tftp服務(wù)sudoapt-getinstalltftptftpdopenbsd-inetd(2)在根目錄下創(chuàng)建文件夾tftpboot文件夾并修改權(quán)限cd/sudomkdirtftpbootsudochmod777tftpboot(3)修改/etc/inetd.conf文件如下:tftpdgramudpwaitnobody/usr/sbin/tcpd/usr/sbin/in.tftpd/tftpboot(4)開(kāi)啟tftp服務(wù)sudo/etc/init.d/openbsd-inetdreloadsudoin.tftpd-l/tftpboot(5)重啟電腦,然后將測(cè)試文件放入/tftpboot目錄下即可開(kāi)始測(cè)試,出現(xiàn)問(wèn)題可能一般都是權(quán)限問(wèn)題/tftpboot目錄下的文件訪問(wèn)權(quán)限改成0777本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:/jiajie961/archive/2010/11/05/5989328.aspx創(chuàng)建一個(gè)新的Android產(chǎn)品項(xiàng)目從google網(wǎng)站上下載的android源代碼編譯時(shí)默認(rèn)是編譯google設(shè)定的產(chǎn)品,如果要開(kāi)發(fā)自己的產(chǎn)品,則需要重新定義一個(gè)產(chǎn)品項(xiàng)目,過(guò)程如下:首先我們定義產(chǎn)品的規(guī)格,舉例如下:公司名稱(chēng)ardent產(chǎn)品名稱(chēng)MTP主板名稱(chēng)merlin然后安裝下面的步驟新建產(chǎn)品項(xiàng)目:(1)在源代碼目錄下創(chuàng)建一個(gè)用戶(hù)目錄mkdirvendor(2)在用戶(hù)目錄下創(chuàng)建一個(gè)公司目錄mkdirvendor/merlin(3)在公司目錄下創(chuàng)建一個(gè)products目錄mkdirvendor/merlin/products(4)在上面創(chuàng)建的products下創(chuàng)建一個(gè)產(chǎn)品makefile文件MTP.mk,內(nèi)容如下:PRODUCT_PACKAGES:=\AlarmClock\Email\Fallback\Launcher2\Music\Camera\Settings\LatinIME\NotePad\SoundRecorder\Bluetooth\CertInstaller\DeskClock$(callinherit-product,$(SRC_TARGET_DIR)/product/core.mk)##OverridesPRODUCT_MANUFACTURER:=ardentPRODUCT_BRAND:=ardentPRODUCT_NAME:=MTPPRODUCT_MODEL:=MultiMediaTouchPhonePRODUCT_DEVICE:=merlinPRODUCT_LOCALES:=zh_CN產(chǎn)品makefile文件的編寫(xiě)有一套規(guī)則,詳細(xì)情況見(jiàn)此文后面的補(bǔ)充內(nèi)容。(5)在vendor/merlin/products目錄下創(chuàng)建一個(gè)AndroidProducts.mk文件,定義Android產(chǎn)品配置文件的路徑,具體如下:PRODUCT_MAKEFILES:=\$(LOCAL_DIR)/MTP.mk(6)在公司目錄下創(chuàng)建一個(gè)主板目錄mkdirvendor/ardent/merlin(7)在主板目錄下新建一個(gè)主板配置文件BoardConfig.mk,內(nèi)容如下:TARGET_NO_BOOTLOADER:=trueTARGET_NO_KERNEL:=trueTARGET_CPU_ABI:=armeabiBOARD_USES_GENERIC_AUDIO:=trueUSE_CAMERA_STUB:=true(8)如果你希望修改系統(tǒng)屬性,則可以在主板目錄下新建一個(gè)p文件,該文件中可以修改系統(tǒng)屬性,舉例如下:#pfor#Thisoverridessettingsintheproducts/generic/pfile##rild.libpath=/system/lib/libreference-ril.so#rild.libargs=-d/dev/ttyS0(9)在主板目錄下建議一個(gè)Android的主板配置文件AndroidBoard.mk,此文件是編譯系統(tǒng)接口文件,內(nèi)容如下:#makefilefornewhardwarefrom#LOCAL_PATH:=$(callmy-dir)##thisisheretousethepre-builtkernelifeq($(TARGET_PREBUILT_KERNEL),)TARGET_PREBUILT_KERNEL:=$(LOCAL_PATH)/kernelendiffile:=$(INSTALLED_KERNEL_TARGET)ALL_PREBUILT+=$(file)$(file):$(TARGET_PREBUILT_KERNEL)|$(ACP)$(transform-prebuilt-to-target)##nobootloader,sowedon'tneedanyofthatstuff..#LOCAL_PATH:=vendor/ardent/merlininclude$(CLEAR_VARS)##includemoreboardspecificstuffhere?SuchasAudioparameters.#(10)編譯新的項(xiàng)目.build/envsetup.shmakePRODUCT-MTP-user補(bǔ)充內(nèi)容:(1)上面的新建的幾個(gè)文件的編寫(xiě)可以參考build/target/board/generic目錄下的AndroidBoard.mk,BoardConfig.mk和p(2)產(chǎn)品makefile的編寫(xiě)規(guī)則,變量定義解釋如下:PRODUCT_NAME終端用戶(hù)可見(jiàn)的產(chǎn)品名稱(chēng),對(duì)應(yīng)到“Settings“中的“Aboutthephone”信息PRODUCT_MODELEnd-user-visiblenamefortheendproductPRODUCT_LOCALES1個(gè)以空格分隔開(kāi)的兩個(gè)字母的語(yǔ)言碼加上2字節(jié)的國(guó)家碼的列表,影響到"Settings"中的語(yǔ)言,時(shí)間,日期和貨幣格式設(shè)置,舉例:en_GBde_DEes_ESfr_CAPRODUCT_PACKAGES需要安裝的APK應(yīng)用程序列表PRODUCT_DEVICE工作設(shè)計(jì)名稱(chēng),即主板名稱(chēng)PRODUCT_MANUFACTURER生產(chǎn)廠家PRODUCT_BRAND軟件設(shè)計(jì)針對(duì)的客戶(hù)品牌PRODUCT_PROPERTY_OVERRIDES以"key=value"為格式的屬性列表PRODUCT_COPY_FILES文件復(fù)制列表,格式為“原文件路徑:目的文件路徑”,編譯過(guò)程中會(huì)按照此規(guī)則復(fù)制文件PRODUCT_OTA_PUBLIC_KEYS產(chǎn)品的OTA公共密匙列表PRODUCT_POLICY聲明此產(chǎn)品使用的政策PRODUCT_PACKAGE_OVERLAYS指示是否使用默認(rèn)資源或添加任何產(chǎn)品特定的資源,例如:vendor/acme/overlayPRODUCT_CONTRIBUTORS_FILEHTML文件中包含項(xiàng)目的貢獻(xiàn)者PRODUCT_TAGS以空格分隔開(kāi)的指定產(chǎn)品關(guān)鍵詞列表本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:ttp:///jiajie961/archive/2010/11/07/5993126.aspx制作ubifs文件系統(tǒng)1,安裝相關(guān)的軟件包apt-getinstallliblzo2-dev2,獲取相關(guān)的工具mkfs.ubifs和ubinize這兩個(gè)工具是制作ubifs文件系統(tǒng)的時(shí)候用到,它們是mtd-utils工具包中的內(nèi)容,mtd-utils工具包你可以從下面的網(wǎng)站下載和編譯出來(lái):官方網(wǎng)站:/index.html資源下載網(wǎng)站:/3,創(chuàng)建一個(gè)create-ubifs.sh腳本,主要是調(diào)用mkfs.ubifs和ubinize工具和相關(guān)參數(shù)來(lái)制作ubifs文件系統(tǒng),內(nèi)容如下:#!/bin/bash###########################################################Scripttogenerateubifsfilesystemimage.################################################################ubinizeconfigurationfileconfig_file=rootfs_ubinize.cfg#####Functiontocheckresultofthecommandcheck_result(){if[$?-ne0]thenecho"FAILED"elseecho"SUCCESSFUL"fi}######Functiontocheckwhetheranapplicationexistscheck_program(){forcmdin"$@"dowhich${cmd}>/dev/null2>&1if[$?-ne0]thenechoecho"Cannotfindcommand\"${cmd}\""echoexit1fidone}if[$#-ne5]thenechoecho'Usage:create-ubifs.sh[page_size_in_bytes][pages_per_block][partition_size_in_bytes][blocks_per_device][path_to_rootfs]'echoexitfipage_size_in_bytes=$1echo"Pagesize[$page_size_in_bytes]bytes."pages_per_block=$2echo"Pagesperblock[$pages_per_block]"partition_size_in_bytes=$3echo"File-systempartitionsize[$partition_size_in_bytes]bytes."blocks_per_device=$4echo"Blocksperdevice[$blocks_per_device]"path_to_rootfs=$5#wear_level_reserved_blocksis1%oftotalblcoksperdevicewear_level_reserved_blocks=`expr$blocks_per_device/100`echo"Reservedblocksforwearlevel[$wear_level_reserved_blocks]"#logical_erase_block_sizeisphysicaleraseblocksizeminus2pagesforUBIlogical_pages_per_block=`expr$pages_per_block-2`logical_erase_block_size=`expr$page_size_in_bytes\*$logical_pages_per_block`echo"Logicaleraseblocksize[$logical_erase_block_size]bytes."#Blocksize=page_size*pages_per_blockblock_size=`expr$page_size_in_bytes\*$pages_per_block`echo"Blocksize[$block_size]bytes."#physicalblocksonapartition=partitionsize/blocksizepartition_physical_blocks=`expr$partition_size_in_bytes/$block_size`echo"Physicalblocksinapartition[$partition_physical_blocks]"#Logicalblocksonapartition=physicalblocksonapartitiion-reservedforwearlevelpatition_logical_blocks=`expr$partition_physical_blocks-$wear_level_reserved_blocks`echo"Logicalblocksinapartition[$patition_logical_blocks]"#File-systemvolume=Logicalblocksinapartition*Logicaleraseblocksizefs_vol_size=`expr$patition_logical_blocks\*$logical_erase_block_size`echo"File-systemvolume[$fs_vol_size]bytes."echoecho"Generatingconfigurationfile..."echo"[rootfs-volume]">$config_fileecho"mode=ubi">>$config_fileecho"image=rootfs_ubifs.img">>$config_fileecho"vol_id=0">>$config_fileecho"vol_size=$fs_vol_size">>$config_fileecho"vol_type=dynamic">>$config_fileecho"vol_name=system">>$config_fileecho#Note:Checknecessaryprogramforinstallation#echo-n"Checkingnecessaryprogramforinstallation"#check_programmkfs.ubifsubinize#echo"Done"#Generateubifsimageecho-n"Generatingubifs..."./mkfs.ubifs-xlzo-m$page_size_in_bytes-e$logical_erase_block_size-c$patition_logical_blocks-orootfs_ubifs.img-d$path_to_rootfscheck_resultecho-n"Generatingubiimageoutoftheubifs..."./ubinize-oubi.img-m$page_size_in_bytes-p$block_size-s$page_size_in_bytes$config_file-vcheck_resultrm-frootfs_ubifs.imgrm-f$config_file(4)將mkfs.ubifs和ubinize以及create-ubifs.sh放置在同一目錄下,然后調(diào)用create-ubifs.sh即可創(chuàng)建ubifs文件系統(tǒng),create-ubifs.sh用法如下:create-ubifs.shpage_size_in_bytes(頁(yè)大小)pages_per_block(每個(gè)扇區(qū)的頁(yè)數(shù)量)partition_size_in_bytes(分區(qū)大小)blocks_per_device(扇區(qū)數(shù)量)path_to_rootfs(文件系統(tǒng)路徑)舉例如下:./create-ubifs.sh204864838860804096./rootfs上面命令的意思是調(diào)用create-ubifs.sh將當(dāng)前目錄下的rootfs文件夾的內(nèi)容制作成ubifs文件系統(tǒng),nandflash的頁(yè)大小為2k,每個(gè)扇區(qū)有64頁(yè),總共有4096個(gè)扇區(qū),要制作的文件系統(tǒng)的大小為83886080字節(jié)。本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:/jiajie961/archive/2010/11/08/5994713.aspxandroid編譯系統(tǒng)makefile(Android.mk)寫(xiě)法android編譯系統(tǒng)的makefile文件Android.mk寫(xiě)法如下(1)Android.mk文件首先需要指定LOCAL_PATH變量,用于查找源文件。由于一般情況下Android.mk和需要編譯的源文件在同一目錄下,所以定義成如下形式:LOCAL_PATH:=$(callmy-dir)上面的語(yǔ)句的意思是將LOCAL_PATH變量定義成本文件所在目錄路徑。(2)Android.mk中可以定義多個(gè)編譯模塊,每個(gè)編譯模塊都是以include$(CLEAR_VARS)開(kāi)始以include$(BUILD_XXX)結(jié)束。include$(CLEAR_VARS)CLEAR_VARS由編譯系統(tǒng)提供,指定讓GNUMAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。include$(BUILD_STATIC_LIBRARY)表示編譯成靜態(tài)庫(kù)include$(BUILD_SHARED_LIBRARY)表示編譯成動(dòng)態(tài)庫(kù)。include$(BUILD_EXECUTABLE)表示編譯成可執(zhí)行程序(3)舉例如下(frameworks/base/libs/audioflinger/Android.mk):LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)模塊一ifeq($(AUDIO_POLICY_TEST),true)ENABLE_AUDIO_DUMP:=trueendifLOCAL_SRC_FILES:=\AudioHardwareGeneric.cpp\AudioHardwareStub.cpp\AudioHardwareInterface.cppifeq($(ENABLE_AUDIO_DUMP),true)LOCAL_SRC_FILES+=AudioDumpInterface.cppLOCAL_CFLAGS+=-DENABLE_AUDIO_DUMPendifLOCAL_SHARED_LIBRARIES:=\libcutils\libutils\libbinder\libmedia\libhardware_legacyifeq($(strip$(BOARD_USES_GENERIC_AUDIO)),true)LOCAL_CFLAGS+=-DGENERIC_AUDIOendifLOCAL_MODULE:=libaudiointerfaceifeq($(BOARD_HAVE_BLUETOOTH),true)LOCAL_SRC_FILES+=A2dpAudioInterface.cppLOCAL_SHARED_LIBRARIES+=liba2dpLOCAL_CFLAGS+=-DWITH_BLUETOOTH-DWITH_A2DPLOCAL_C_INCLUDES+=$(callinclude-path-for,bluez)endifinclude$(BUILD_STATIC_LIBRARY)模塊一編譯成靜態(tài)庫(kù)include$(CLEAR_VARS)模塊二LOCAL_SRC_FILES:=\AudioPolicyManagerBase.cppLOCAL_SHARED_LIBRARIES:=\libcutils\libutils\libmediaifeq($(TARGET_SIMULATOR),true)LOCAL_LDLIBS+=-ldlelseLOCAL_SHARED_LIBRARIES+=libdlendifLOCAL_MODULE:=libaudiopolicybaseifeq($(BOARD_HAVE_BLUETOOTH),true)LOCAL_CFLAGS+=-DWITH_A2DPendififeq($(AUDIO_POLICY_TEST),true)LOCAL_CFLAGS+=-DAUDIO_POLICY_TESTendifinclude$(BUILD_STATIC_LIBRARY)模塊二編譯成靜態(tài)庫(kù)include$(CLEAR_VARS)模塊三LOCAL_SRC_FILES:=\AudioFlinger.cpp\AudioMixer.cpp.arm\AudioResampler.cpp.arm\AudioResamplerSinc.cpp.arm\AudioResamplerCubic.cpp.arm\AudioPolicyService.cppLOCAL_SHARED_LIBRARIES:=\libcutils\libutils\libbinder\libmedia\libhardware_legacyifeq($(strip$(BOARD_USES_GENERIC_AUDIO)),true)LOCAL_STATIC_LIBRARIES+=libaudiointerfacelibaudiopolicybaseLOCAL_CFLAGS+=-DGENERIC_AUDIOelseLOCAL_SHARED_LIBRARIES+=libaudiolibaudiopolicyendififeq($(TARGET_SIMULATOR),true)LOCAL_LDLIBS+=-ldlelseLOCAL_SHARED_LIBRARIES+=libdlendifLOCAL_MODULE:=libaudioflingerifeq($(BOARD_HAVE_BLUETOOTH),true)LOCAL_CFLAGS+=-DWITH_BLUETOOTH-DWITH_A2DPLOCAL_SHARED_LIBRARIES+=liba2dpendififeq($(AUDIO_POLICY_TEST),true)LOCAL_CFLAGS+=-DAUDIO_POLICY_TESTendififeq($(TARGET_SIMULATOR),true)ifeq($(HOST_OS),linux)LOCAL_LDLIBS+=-lrt-lpthreadendifendififeq($(BOARD_USE_LVMX),true)LOCAL_CFLAGS+=-DLVMXLOCAL_C_INCLUDES+=vendor/nxpLOCAL_STATIC_LIBRARIES+=liblifevibesLOCAL_SHARED_LIBRARIES+=liblvmxservice#LOCAL_SHARED_LIBRARIES+=liblvmxipcendifinclude$(BUILD_SHARED_LIBRARY)模塊三編譯成動(dòng)態(tài)庫(kù)(4)編譯一個(gè)應(yīng)用程序(APK)LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#BuildalljavafilesinthejavasubdirectoryLOCAL_SRC_FILES:=$(callall-subdir-java-files)#NameoftheAPKtobuildLOCAL_PACKAGE_NAME:=LocalPackage#TellittobuildanAPKinclude$(BUILD_PACKAGE)(5)編譯一個(gè)依賴(lài)于靜態(tài)Java庫(kù)(static.jar)的應(yīng)用程序LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#ListofstaticlibrariestoincludeinthepackageLOCAL_STATIC_JAVA_LIBRARIES:=static-library#BuildalljavafilesinthejavasubdirectoryLOCAL_SRC_FILES:=$(callall-subdir-java-files)#NameoftheAPKtobuildLOCAL_PACKAGE_NAME:=LocalPackage#TellittobuildanAPKinclude$(BUILD_PACKAGE)(6)編譯一個(gè)需要用平臺(tái)的key簽名的應(yīng)用程序LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#BuildalljavafilesinthejavasubdirectoryLOCAL_SRC_FILES:=$(callall-subdir-java-files)#NameoftheAPKtobuildLOCAL_PACKAGE_NAME:=LocalPackageLOCAL_CERTIFICATE:=platform#TellittobuildanAPKinclude$(BUILD_PACKAGE)(7)編譯一個(gè)需要用特定key前面的應(yīng)用程序LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#BuildalljavafilesinthejavasubdirectoryLOCAL_SRC_FILES:=$(callall-subdir-java-files)#NameoftheAPKtobuildLOCAL_PACKAGE_NAME:=LocalPackageLOCAL_CERTIFICATE:=vendor/example/certs/app#TellittobuildanAPKinclude$(BUILD_PACKAGE)(8)添加一個(gè)預(yù)編譯應(yīng)用程序LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#Modulenameshouldmatchapknametobeinstalled.LOCAL_MODULE:=LocalModuleNameLOCAL_SRC_FILES:=$(LOCAL_MODULE).apkLOCAL_MODULE_CLASS:=APPSLOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)include$(BUILD_PREBUILT)(9)添加一個(gè)靜態(tài)JAVA庫(kù)LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#BuildalljavafilesinthejavasubdirectoryLOCAL_SRC_FILES:=$(callall-subdir-java-files)#AnylibrariesthatthislibrarydependsonLOCAL_JAVA_LIBRARIES:=android.test.runner#ThenameofthejarfiletocreateLOCAL_MODULE:=sample#Buildastaticjarfile.include$(BUILD_STATIC_JAVA_LIBRARY)(10)Android.mk的編譯模塊中間可以定義相關(guān)的編譯內(nèi)容,也就是指定相關(guān)的變量如下:LOCAL_AAPT_FLAGSLOCAL_ACP_UNAVAILABLELOCAL_ADDITIONAL_JAVA_DIRLOCAL_AIDL_INCLUDESLOCAL_ALLOW_UNDEFINED_SYMBOLSLOCAL_ARM_MODELOCAL_ASFLAGSLOCAL_ASSET_DIRLOCAL_ASSET_FILES在Android.mk文件中編譯應(yīng)用程序(BUILD_PACKAGE)時(shí)設(shè)置此變量,表示資源文件,通常會(huì)定義成LOCAL_ASSET_FILES+=$(callfind-subdir-assets)LOCAL_BUILT_MODULE_STEMLOCAL_C_INCLUDES額外的C/C++編譯頭文件路徑,用LOCAL_PATH表示本文件所在目錄舉例如下:LOCAL_C_INCLUDES+=extlibs/zlib-1.2.3LOCAL_C_INCLUDES+=$(LOCAL_PATH)/srcLOCAL_CC指定C編譯器LOCAL_CERTIFICATE簽名認(rèn)證LOCAL_CFLAGS為C/C++編譯器定義額外的標(biāo)志(如宏定義),舉例:LOCAL_CFLAGS+=-DLIBUTILS_NATIVE=1LOCAL_CLASSPATHLOCAL_COMPRESS_MODULE_SYMBOLSLOCAL_COPY_HEADERSinstall應(yīng)用程序時(shí)需要復(fù)制的頭文件,必須同時(shí)定義LOCAL_COPY_HEADERS_TOLOCAL_COPY_HEADERS_TOinstall應(yīng)用程序時(shí)復(fù)制頭文件的目的路徑LOCAL_CPP_EXTENSION如果你的C++文件不是以cpp為文件后綴,你可以通過(guò)LOCAL_CPP_EXTENSION指定C++文件后綴名如:LOCAL_CPP_EXTENSION:=.cc注意統(tǒng)一模塊中C++文件后綴必須保持一致。LOCAL_CPPFLAGS傳遞額外的標(biāo)志給C++編譯器,如:LOCAL_CPPFLAGS+=-ffriend-injectionLOCAL_CXX指定C++編譯器LOCAL_DX_FLAGSLOCAL_EXPORT_PACKAGE_RESOURCESLOCAL_FORCE_STATIC_EXECUTABLE如果編譯的可執(zhí)行程序要進(jìn)行靜態(tài)鏈接(執(zhí)行時(shí)不依賴(lài)于任何動(dòng)態(tài)庫(kù)),則設(shè)置LOCAL_FORCE_STATIC_EXECUTABLE:=true目前只有l(wèi)ibc有靜態(tài)庫(kù)形式,這個(gè)只有文件系統(tǒng)中/sbin目錄下的應(yīng)用程序會(huì)用到,這個(gè)目錄下的應(yīng)用程序在運(yùn)行時(shí)通常文件系統(tǒng)的其它部分還沒(méi)有加載,所以必須進(jìn)行靜態(tài)鏈接。LOCAL_GENERATED_SOURCESLOCAL_INSTRUMENTATION_FORLOCAL_INSTRUMENTATION_FOR_PACKAGE_NAMELOCAL_INTERMEDIATE_SOURCESLOCAL_INTERMEDIATE_TARGETSLOCAL_IS_HOST_MODULELOCAL_JAR_MANIFESTLOCAL_JARJAR_RULESLOCAL_JAVA_LIBRARIES編譯java應(yīng)用程序和庫(kù)的時(shí)候指定包含的java類(lèi)庫(kù),目前有core和framework兩種多數(shù)情況下定義成:LOCAL_JAVA_LIBRARIES:=coreframework注意LOCAL_JAVA_LIBRARIES不是必須的,而且編譯APK時(shí)不允許定義(系統(tǒng)會(huì)自動(dòng)添加)LOCAL_JAVA_RESOURCE_DIRSLOCAL_JAVA_RESOURCE_FILESLOCAL_JNI_SHARED_LIBRARIESLOCAL_LDFLAGS傳遞額外的參數(shù)給連接器(務(wù)必注意參數(shù)的順序)LOCAL_LDLIBS為可執(zhí)行程序或者庫(kù)的編譯指定額外的庫(kù),指定庫(kù)以"-lxxx"格式,舉例:LOCAL_LDLIBS+=-lcurses-lpthreadLOCAL_LDLIBS+=-Wl,-z,originLOCAL_MODULE生成的模塊的名稱(chēng)(注意應(yīng)用程序名稱(chēng)用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)LOCAL_MODULE_PATH生成模塊的路徑LOCAL_MODULE_STEMLOCAL_MODULE_TAGS生成模塊的標(biāo)記LOCAL_NO_DEFAULT_COMPILER_FLAGSLOCAL_NO_EMMA_COMPILELOCAL_NO_EMMA_INSTRUMENTLOCAL_NO_STANDARD_LIBRARIESLOCAL_OVERRIDES_PACKAGESLOCAL_PACKAGE_NAMEAPK應(yīng)用程序的名稱(chēng)LOCAL_POST_PROCESS_COMMANDLOCAL_PREBUILT_EXECUTABLES預(yù)編譯including$(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時(shí)所用,指定需要復(fù)制的可執(zhí)行文件LOCAL_PREBUILT_JAVA_LIBRARIESLOCAL_PREBUILT_LIBS預(yù)編譯including$(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時(shí)所用,指定需要復(fù)制的庫(kù).LOCAL_PREBUILT_OBJ_FILESLOCAL_PREBUILT_STATIC_JAVA_LIBRARIESLOCAL_PRELINK_MODULE是否需要預(yù)連接處理(默認(rèn)需要,用來(lái)做動(dòng)態(tài)庫(kù)優(yōu)化)LOCAL_REQUIRED_MODULES指定模塊運(yùn)行所依賴(lài)的模塊(模塊安裝時(shí)將會(huì)同步安裝它所依賴(lài)的模塊)LOCAL_RESOURCE_DIRLOCAL_SDK_VERSIONLOCAL_SHARED_LIBRARIES可鏈接動(dòng)態(tài)庫(kù)LOCAL_SRC_FILES編譯源文件LOCAL_STATIC_JAVA_LIBRARIESLOCAL_STATIC_LIBRARIES可鏈接靜態(tài)庫(kù)LOCAL_UNINSTALLABLE_MODULELOCAL_UNSTRIPPED_PATHLOCAL_WHOLE_STATIC_LIBRARIES指定模塊所需要載入的完整靜態(tài)庫(kù)(這些精通庫(kù)在鏈接是不允許鏈接器刪除其中無(wú)用的代碼)LOCAL_YACCFLAGSOVERRIDE_BUILT_MODULE_PATH本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:/jiajie961/archive/2010/11/09/5997147.aspxAndroid系統(tǒng)移植(一)-讓android系統(tǒng)在目標(biāo)平臺(tái)上運(yùn)行起來(lái)Android系統(tǒng)由于用的是linux內(nèi)核,因此內(nèi)核移植和嵌入式linux內(nèi)核移植差異不大,過(guò)程如下:

(1)移植boot-loader和linux2.6內(nèi)核到目標(biāo)平臺(tái)上,讓linux內(nèi)核可以啟動(dòng)起來(lái),基本的驅(qū)動(dòng)允許正常。

此過(guò)程完全是嵌入式linux的開(kāi)發(fā),這里直接跳過(guò)。需要注意的是,由于android已經(jīng)被linux官方開(kāi)除,因此從

網(wǎng)站上(如/)下載的最新linux內(nèi)核源代碼已經(jīng)不包含android的專(zhuān)有驅(qū)動(dòng),因此建議

從google網(wǎng)上下下載Linux內(nèi)核,android源代碼瀏覽網(wǎng)站如下:

/

從該網(wǎng)站上發(fā)現(xiàn)內(nèi)核相關(guān)的包如下:

kernel/common.git通用android內(nèi)核項(xiàng)目

kernel/experimental.git實(shí)驗(yàn)性?xún)?nèi)核項(xiàng)目

kernel/linux-2.6.git這個(gè)是標(biāo)準(zhǔn)的Linux內(nèi)核,沒(méi)有android的驅(qū)動(dòng)

kernel/lk.git微內(nèi)核項(xiàng)目

kernel/msm.git這個(gè)是高通msm7xxx系列芯片所用內(nèi)核

kernel/omap.git

kernel/tegra.gitNVIDIATegra系列芯片所用內(nèi)核

下載內(nèi)核代碼的方法如下:

gitclonegit:///kernel/common.git

下載完后用gitbranch-a查看所有g(shù)it分支,結(jié)果如下:

android-2.6.27

origin/HEAD

origin/android-2.6.25

origin/android-2.6.27

origin/android-2.6.29

origin/android-2.6.32

origin/android-2.6.35

origin/android-2.6.36

origin/android-goldfish-2.6.27

origin/android-goldfish-2.6.29

然后切換到最新分支gitcheckoutorigin/android-2.6.36

(2)修改內(nèi)核配置文件,打開(kāi)Android必須的驅(qū)動(dòng)(日志和BINDER)如下:

CONFIG_ANDROID=y

CONFIG_ANDROID_BINDER_IPC=y

CONFIG_ANDROID_LOGGER=y

此部分的代碼在內(nèi)核drivers/staging/android目錄下。

(3)為了提高啟動(dòng)速度,采用ramdisk,將android文件系統(tǒng)的部分內(nèi)容壓縮到內(nèi)核中。

首先打開(kāi)內(nèi)核驅(qū)動(dòng):

CONFIG_BLK_DEV_INITRD=y

CONFIG_INITRAMFS_SOURCE="root"

CONFIG_INITRAMFS_ROOT_UID=0

CONFIG_INITRAMFS_ROOT_GID=0

然后在android源代碼編譯出來(lái)的out/target/product/merlin/root目錄復(fù)制到內(nèi)核目錄下。

(4)根據(jù)android文件系統(tǒng)的要求對(duì)nandflash進(jìn)行重新分區(qū),舉例如下:

將nandflash分區(qū)以下8個(gè)分區(qū)

NTIM

OBM

U-boot

Kernel

System

UserData

MassStorage

BBT

(5)根據(jù)分區(qū)表修改內(nèi)核啟動(dòng)參數(shù)如下:

CONFIG_CMDLINE="ubi.mtd=4ubi.mtd=5ubi.mtd=6root=ubi0_0rootfstype=ubifsconsole=ttyS1,115200uart_dmainit=/init"

參數(shù)的意思是:載入的文件系統(tǒng)部分有3個(gè)分區(qū),分別為nandflash的第4,5,6分區(qū)(從0編號(hào)),文件系統(tǒng)采用ubifs格式,控制臺(tái)設(shè)備為ttyS1,波特率為115200

啟動(dòng)的第一個(gè)應(yīng)用程序是/init

(6)確保控制臺(tái)的設(shè)置和硬件保持一致,如:硬件上串口用的是UART1,則內(nèi)核啟動(dòng)參數(shù)中設(shè)置有console=ttyS1,而且android的啟動(dòng)過(guò)程中設(shè)要設(shè)置正確,修改

部分位于android源代碼system/core/init/init.c文件中,將

staticchar*console_name="/dev/console";

修改成

staticchar*console_name="/dev/ttyS1";

(7)修改android源代碼system/core/rootdir目錄下的init.rc文件,作如下修改(android默認(rèn)yaffs2文件系統(tǒng)):

首先將android文件系統(tǒng)修改成可讀寫(xiě),將

mountrootfsrootfs/roremount

修改成

mountrootfsrootfs/rwremount

然后修改掛載system和userdata部分的代碼,將

#Mount/systemrwfirsttogivethefilesystemachancetosaveacheckpoint

mountyaffs2mtd@system/system

mountyaffs2mtd@system/systemroremount

#Wechown/chmod/dataagainsobecausemountisrunasroot+defaults

mountyaffs2mtd@userdata/datanosuidnodev

chownsystemsystem/data

chmod0771/data

改成

#Mount/systemrwfirsttogivethefilesystemachancetosaveacheckpoint

mountubifsubi0_0/systemro

#Wechown/chmod/dataagainsobecausemountisrunasroot+defaults

mountubifsubi1_0/datanosuidnodev

chownsystemsystem/data

chmod0771/data

(8)完成后編譯內(nèi)核,可以啟動(dòng)文件系統(tǒng),控制臺(tái)可用,但是沒(méi)有顯示啟動(dòng)log,而且不停的重啟。

(9)系統(tǒng)不停的重啟,因此控制臺(tái)已經(jīng)可用了,自然而然的想到看到logcat日志,一看,發(fā)現(xiàn)logcat設(shè)備居然沒(méi)起來(lái),配置文件里面都定義了

居然沒(méi)起來(lái),查看了下內(nèi)核drivers/staging/android目錄,沒(méi)有.o文件,證明是沒(méi)編譯到,在看內(nèi)核目錄下的.config文件,發(fā)現(xiàn)居然沒(méi)有了

logcat和binder的宏定義,配置文件里面有定義而.config文件中無(wú)定義,肯定是相關(guān)Kconfig文件的問(wèn)題,通過(guò)分析drivers/staging目錄下的

Kconfig文件發(fā)現(xiàn)是因?yàn)镾TAGING_EXCLUDE_BUILD宏默認(rèn)是y,在配置文件中否定此宏即可,在配置文件中CONFIG_STAGING定義后加上即可,如下:

CONFIG_STAGING=y

#CONFIG_STAGING_EXCLUDE_BUILDisnotset

修改后重新編譯發(fā)現(xiàn)系統(tǒng)完成正常啟動(dòng),啟動(dòng)過(guò)程中啟動(dòng)log也顯示正常。

至此,android初步移植工作已經(jīng)完成,當(dāng)然,系統(tǒng)還有很多問(wèn)題,需要下一步繼續(xù)修改。

總結(jié):android的移植按如下流程:

(1)androidlinux內(nèi)核的普通驅(qū)動(dòng)移植,讓內(nèi)核可以在目標(biāo)平臺(tái)上運(yùn)行起來(lái)。

(2)正確掛載文件系統(tǒng),確保內(nèi)核啟動(dòng)參數(shù)和android源代碼system/core/rootdir目錄下的init.rc中的文件系統(tǒng)掛載正確。

(3)調(diào)試控制臺(tái),讓內(nèi)核啟動(dòng)參數(shù)中的console參數(shù)以及android源代碼system/core/init/init.c中的console_name設(shè)置和硬件保持一致

(4)打開(kāi)android相關(guān)的驅(qū)動(dòng)(logger,binder等),串口輸入logcat看logger驅(qū)動(dòng)起來(lái),沒(méi)有的話調(diào)試logger驅(qū)動(dòng)。

說(shuō)明:ARM的內(nèi)核配置文件定義在內(nèi)核arch/arm/configs目錄下Android系統(tǒng)移植(二)-按鍵移植這一部分主要是移植android的鍵盤(pán)和按鍵

(1)Android使用標(biāo)準(zhǔn)的linux輸入事件設(shè)備(/dev/input目錄下)和驅(qū)動(dòng),按鍵定義在內(nèi)核include/linux/input.h文件中,

按鍵定義形式如下:

#defineKEY_ESC

1

#defineKEY_1

2

#defineKEY_2

3

(2)內(nèi)核中(我的平臺(tái)是arch/arm/mach-mmp/merlin.c文件)中按鍵的定義如下形式:

staticstructgpio_keys_buttonbtn_button_table[]={

[0]={

.code

=

KEY_F1,

.gpio

=

MFP_PIN_GPIO2,

.active_low

=

1,

/*0fordown0,up1;1fordown1,up0*/

.desc

=

"H_BTNbutton",

.type

=

EV_KEY,

/*.wakeup

=*/

.debounce_interval

=

10,

/*10msecjitterelimination*/

},

[1]={

.code

=

KEY_F2,

.gpio

=

MFP_PIN_GPIO3,

.active_low

=

1,

/*0fordown0,up1;1fordown1,up0*/

.desc

=

"O_BTNbutton",

.type

=

EV_KEY,

/*.wakeup

=*/

.debounce_interval

=

10,

/*10msecjitterelimination*/

},

[2]={

.code

=

KEY_F4,

.gpio

=

MFP_PIN_GPIO1,

.active_low

=

1,

/*0fordown0,up1;1fordown1,up0*/

.desc

=

"S_BTNbutton",

.type

=

EV_KEY,

/*.wakeup

=*/

.debounce_interval

=

10,

/*10msecjitterelimination*/

},

};

staticstructgpio_keys_platform_datagpio_keys_data={

.buttons

=btn_button_table,

.nbuttons=ARRAY_SIZE(btn_button_table),

};

staticstructplatform_devicegpio_keys={

.name="gpio-keys",

.dev

={

.platform_data=&gpio_keys_data,

},

.id

=-1,

};

上面定義是將MFP_PIN_GPIO2這個(gè)GPIO口的按鍵映射到Linux的KEY_F1按鍵,MPF_PIN_GPIO3映射到KEY_F2,MFP_PIN_GPIO1映射到KEY_F4

(3)上面(2)步實(shí)現(xiàn)了從硬件GPIO口到內(nèi)核標(biāo)準(zhǔn)按鍵的映射,但是android并沒(méi)有直接使用映射后的鍵值,而且對(duì)其再進(jìn)行了一次映射,從內(nèi)核標(biāo)準(zhǔn)鍵值

到android所用鍵值的映射表定義在android文件系統(tǒng)的/system/usr/keylayout目錄下。標(biāo)準(zhǔn)的映射文件為qwerty.kl,定義如下:

key399

GRAVE

key2

1

key3

2

key4

3

key5

4

key6

5

key7

6

key8

7

key9

8

key10

9

key11

0

key158

BACK

WAKE_DROPPED

key230

SOFT_RIGHT

WAKE

key60

SOFT_RIGHT

WAKE

key107

ENDCALL

WAKE_DROPPED

key62

ENDCALL

WAKE_DROPPED

key229

MENU

WAKE_DROPPED

key139

MENU

WAKE_DROPPED

key59

MENU

WAKE_DROPPED

key127

SEARCH

WAKE_DROPPED

key217

SEARCH

WAKE_DROPPED

key228

POUND

key227

STAR

key231

CALL

WAKE_DROPPED

key61

CALL

WAKE_DROPPED

key232

DPAD_CENTER

WAKE_DROPPED

key108

DPAD_DOWN

WAKE_DROPPED

key103

DPAD_UP

WAKE_DROPPED

key102

HOME

WAKE

key105

DPAD_LEFT

WAKE_DROPPED

key106

DPAD_RIGHT

WAKE_DROPPED

key115

VOLUME_UP

key114

VOLUME_DOWN

key116

POWER

WAKE

key212

CAMERA

key16

Q

key17

W

key18

E

key19

R

key20

T

key21

Y

key22

U

key23

I

key24

O

key25

P

key26

LEFT_BRACKET

key27

RIGHT_BRACKET

key43

BACKSLASH

key30

A

key31

S

key32

D

key33

F

key34

G

key35

H

key36

J

key37

K

key38

L

key39

SEMICOLON

key40

APOSTROPHE

key14

DEL

key44

Z

key45

X

key46

C

key47

V

key48

B

key49

N

key50

M

key51

COMMA

key52

PERIOD

key53

SLASH

key28

ENTER

key56

ALT_LEFT

key100

ALT_RIGHT

key42

SHIFT_LEFT

key54

SHIFT_RIGHT

key15

TAB

key57

SPACE

key150

EXPLORER

key155

ENVELOPE

key12

MINUS

key13

EQUALS

key215

AT

(4)android對(duì)底層按鍵的處理方法

android按鍵的處理是WindowManager負(fù)責(zé),主要的映射轉(zhuǎn)換實(shí)現(xiàn)在android源代碼frameworks/base/libs/ui/EventHub.cpp

此文件處理來(lái)自底層的所有輸入事件,并根據(jù)來(lái)源對(duì)事件進(jìn)行分類(lèi)處理,對(duì)于按鍵事件,處理過(guò)程如下:

(a)記錄驅(qū)動(dòng)名稱(chēng)為

(b)獲取環(huán)境變量ANDROID_ROOT為系統(tǒng)路徑(默認(rèn)是/system,定義在android源代碼/system/core/rootdir/init.rc文件中)

(c)查找路徑為"系統(tǒng)路徑/usr/keylayout/驅(qū)動(dòng)名稱(chēng).kl"的按鍵映射文件,如果不存在則默認(rèn)用路徑為"系統(tǒng)路徑/usr/keylayout/qwerty.kl"

這個(gè)默認(rèn)的按鍵映射文件,映射完成后再把經(jīng)映射得到的android按鍵碼值發(fā)給上層應(yīng)用程序。

所以我們可以在內(nèi)核中定義多個(gè)按鍵設(shè)備,然后為每個(gè)設(shè)備設(shè)定不同的按鍵映射文件,不定義則會(huì)默認(rèn)用qwerty.kl

(5)舉例

上面(2)步我們?cè)趦?nèi)核中聲明了一個(gè)名為"gpio-keys"的按鍵設(shè)備,此設(shè)備定義在內(nèi)核drivers/input/keyboard/gpio_keys.c文件中

然后我們?cè)趦?nèi)核啟動(dòng)過(guò)程中注冊(cè)此設(shè)備:

platform_device_register(&gpio_keys);

然后我們可以自己定義一個(gè)名為gpio-keys.kl的android按鍵映射文件,此文件的定義可以參考querty.kl的內(nèi)容,比如說(shuō)我們想將MPF_PIN_GPIO3

對(duì)應(yīng)的按鍵作android中的MENU鍵用,首先我們?cè)趦?nèi)核中將MPF_PIN_GPIO3映射到KEY_F2,在內(nèi)核include/linux/input.h中查找KEY_F2發(fā)現(xiàn)

#defineKEY_F2

60

參照KEY_F2的值我們?cè)趃pio-keys.kl中加入如下映射即可

key60

MENU

WAKE

其它按鍵也照此添加,完成后將按鍵表放置到/system/usr/keylayout目錄下即可。

補(bǔ)充:

(1)android按鍵設(shè)備的映射關(guān)系可以在logcat開(kāi)機(jī)日志中找的到(查找EventHub即可)

(2)android按鍵設(shè)備由WindowManager負(fù)責(zé),WindowManager從按鍵驅(qū)動(dòng)讀取內(nèi)核按鍵碼,然后將內(nèi)核按鍵碼轉(zhuǎn)換成android按鍵碼,轉(zhuǎn)換完成

后WindowManager會(huì)將內(nèi)核按鍵碼和android按鍵碼一起發(fā)給應(yīng)用程序來(lái)使用,這一點(diǎn)一定要注意。Android系統(tǒng)開(kāi)發(fā)小知識(shí)-在android產(chǎn)品開(kāi)發(fā)中添加新的編譯模塊Android開(kāi)發(fā)中用戶(hù)內(nèi)容定義在vendor目錄下,而用戶(hù)產(chǎn)品的內(nèi)容都定義在vendor/<company_name>/<board_name>目錄下

如果需要添加新的內(nèi)容,可以在該目錄下新建子

溫馨提示

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

評(píng)論

0/150

提交評(píng)論