高通Android平臺開發

lalalalala發表於2014-12-18
問題描述:
         對於有過開發高通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即可找到,如果需要增加新的內容加在這裡就行了

相關文章