轉自: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即可找到,如果需要增加新的内容加在這裡就行了