天天看點

高通Android平台開發

轉自:http://blog.csdn.net/liwei405499/article/details/42008245

問題描述:

         對于有過開發高通android系統的人來說,擷取代碼建構開發環境并不是難事,但對于剛剛接觸這一塊内容的人,如果沒有詳細的說明很容易走彎路,本文檔就是根據本人的實踐總結的一些經驗教訓。

1.       代碼擷取

高通的android代碼分為兩部分,一部分是開源的,可以從網站https://www.codeaurora.org/xwiki/bin/QAEP/下載下傳,需要知道要下載下傳的代碼的分支及build id。另一部分是非開源的,需要從高通的另一個網站https://support.cdmatech.com/login/上下載下傳,這個下載下傳是有權限限制的,曉光的帳号可以下載下傳代碼。後面這部分代碼需要放到第一部分代碼的vendor指定目錄下,可能是vendor/qcom-proprietary或vendor/qcom/proprietary,根據版本的不同有所差別。

高通平台相關的東西基本都在vendor/qcom/proprietary下或device/qcom下

2.       編譯環境建構(ubuntu 10.04 64位)

Android2.3.x後的版本需要在64位下進行編譯

更新ubuntu源,要加上deb http://archive.canonical.com/ lucid partner 這個源用來安裝java。

apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev x11proto-core-dev libx11-dev  libxml-simple-perl sun-java6-jdk gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs lib32z-dev lib32readline5-dev

研發主機不能更新java,需要讓IT安裝sun-java6-jdk。

在指令行執行sudo dpkg-reconfigure dash 選擇no,否則編譯時會報一下腳本文法錯誤

編譯的過程中https://www.codeaurora.org/xwiki/bin/QAEP/和版本的release notes中都有介紹,首先source build/envsetup.sh,然後choosecombo選擇需要的選項,最後make或make –j4。-j4用來指定參與編譯的cpu個數,指定了編譯會快些。編譯單個子產品的時候隻需要在make後面跟上子產品的名字

為了簡化可以使用以下腳本

export TARGET_SIMULATOR=fasle

export TARGET_BUILD_TYPE=release

export TARGET_PRODUCT=msm7627a

export TARGET_BUILD_VARIANT=eng

set_stuff_for_environment

make $1

編譯的中間結果在out/target/product/平台/obj目錄下,有時候為了完全重新編譯需要把這裡對于的目錄删掉。

   編譯的結果在out/target/product/平台/下.

   Appsboot.mbn是bootloader

   Boot.img是核心+ramdisk,ramdisk根據目前目錄的root目錄生成

   System.img是闆子上/system目錄下的初始内容,根據目前目錄的system目錄生成

   Userdata.img是/data目錄下的内容,根據目前目錄的data目錄生成

3.       燒錄環境建構

需要讓pc識别插上的android裝置,需要安裝驅動,我的驅動是從BSP獲得的,目前也不知道具體從哪裡下載下傳。驅動下有幾個目錄,彈出安裝驅動的提示時挨個試就行了。

還需要android的adb和fastboot等工具,這些也是bsp提供的。

使用google的驅動應該也是可以的,在7225a上我試了是可以的,但在7625上卻不行。使用google的驅動的下載下傳需要參考http://developer.android.com/sdk/index.html

編輯google-usb_driver/ android_winusb.inf,按照已有的條目添加vid pid。

4.       Flash分區燒錄

Android提供了燒錄flash的fastboot模式,bsp會提供進入fastboot模式的方法。進入fastboot模式後,在pc的指令行執行fastboot devices可以檢視裝置,執行fastboot flash boot boot.img燒錄boot分區,執行fastboot flash system system.img燒錄system分區,執行fastboot flash userdata userdata.img燒錄data分區。有些人執行這些指令失敗都是因為一些低級的錯誤,比如打開指令行就直接輸指令,估計你自己都不知道fastboot在哪呢讓指令行到哪裡去找啊,或者到fastboot的目錄下後執行指令,又悲劇了誰知道你把那些img檔案放哪了,總不能讓人家周遊整個硬碟去給你找吧。這樣的問題對于開發人員來說實在不應該啊。

5.       開發調試

用前面提到的方法可以燒錄各個分區,但編譯燒錄分區還是比較麻煩的。使用adb可以對單個檔案進行操作

Adb push file /system/bin/将file上傳到闆子的/system/bin/目錄下

Adb pull /system/bin/file file 将闆子上的檔案/system/bin/file下載下傳到PC目前目錄下

Adb shell進入闆子的指令行

闆子上根目錄是隻讀的,如果需要寫權限,需要運作mount –o remount rw /

Adb logcat可以檢視日志

6.       增加軟體子產品

這裡寫的主要是如何寫android.mk

(1)       增加動态庫

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := a.c b.c

LOCAL_MODULE := libtest

LOCAL_C_INCLUDES := dir/include

LOCAL_CFLAGS := -g

LOCAL_LDLAGS := -lpthread

LOCAL_LDLIBS := -lpthread

LOCAL_SYSTEM_SHARED_LIBRARIES := libc libcutils

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

LOCAL_SRC_FILES指定源檔案

LOCAL_MODULE指定子產品的名字,整個andorid系統中必須唯一

LOCAL_C_INCLUDES指定需要包括的頭檔案路徑

LOCAL_CFLAGS指定編譯選項

LOCAL_LDLAGS指定連結選項

LOCAL_LDLIBS指定連結選項,和LOCAL_LDLAGS類似

LOCAL_SYSTEM_SHARED_LIBRARIES指定依賴的庫,這個和LOCAL_LDLAGS不同,首先是名字是以子產品名的方式指定的,其次是這裡面包含的依賴關系,會導緻被依賴的子產品也會被編譯

LOCAL_PRELINK_MODULE這個為我們編譯庫很重要,不加這行一般會編譯失敗。

最後一行開始進行編譯

(2)       增加靜态庫

與動态庫類似,把最後一句改為

Include $(BUILD_STATIC_LIBRARY)

(3)       增加應用

與動态庫類似,把最後一句改為

Include $(BUILD_EXECUTABLE)

去掉LOCAL_PRELINK_MODULE

(4)       增加資源

即隻需要拷貝到某個目錄

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

file := $(TARGET_OUT)/etc/lctpri

$(file) : $(LOCAL_PATH)/lctpri | $(ACP)

   $(transform-prebuilt-to-target)

ALL_PREBUILT += $(file)

上面這個andoird.mk的意思是将本目錄下的lctpri拷貝到system/etc下, $(TARGET_OUT)是編譯環境中的一個定義

(5) 特殊的例子

編譯Iptables的時候需要根據子產品生成一個初始化檔案,android中是這樣實作的

GEN_INITEXT:= $(intermediates)/extensions/gen_initext.c

$( GEN_INITEXT): PRIVATE_PATH := $(LOCAL_PATH)

$( GEN_INITEXT): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/extensions/create_initext “$(EXT_FUNC)”

$( GEN_INITEXT): PRIVATE_MODULE := $(LOCAL_MODULE)

$( GEN_INITEXT):

   $(transform-generated-source)

$(intermediates)/extensions/initext.o : $( GEN_INITEXT)

LOCAL_GENERATED_SOURCES := $( GEN_INITEXT)

create_initext是一個腳本檔案,從svn下載下傳下來的時候會失去可執行屬性,需要改變屬性。這個方式生成的gen_initext.c似乎并不會跟着選擇的子產品的變化而重新生成,是以需要手動将它删掉。

Android自帶的代碼中基本沒有一個目錄下既有代碼又有目錄的情況,而我們的代碼中這種情況很常見,出現這中情況的時候需要在飽含子目錄的android.mk的後面加入

include $(call all-makefiles-under,$(LOCAL_PATH))

沒有找到能解決android中兩個庫互相依賴的方法,雖然加入$(LOCAL_ALLOW_UNDEFINED_SYMBOLS) = true後可以編譯通過,但在闆子中不能正常運作。

7.       編譯最小系統

在編譯前先定義下面的環境變量

export BUILD_TINY_ANDROID=true

編譯的内容在build/core/main.mk中搜尋BUILD_TINY_ANDROID即可找到,如果需要增加新的内容加在這裡就行了

繼續閱讀