高通Android平臺開發
問題描述:
對於有過開發高通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即可找到,如果需要增加新的內容加在這裡就行了
對於有過開發高通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即可找到,如果需要增加新的內容加在這裡就行了
相關文章
- 高通平臺android開發總結Android
- 高通MDM平臺開發入門
- 最新高通平臺驅動開發參考文件
- 高通平臺手機開發之Bring-up
- 高通平臺開發環境搭建、編譯、燒錄(android5.1以上系統)開發環境編譯Android
- Android高通平臺處理器間通訊驅動Android
- 綠茵面家平臺開發(開發平臺)
- Android平臺Camera開發實踐指南Android
- 手遊開發Android平臺周邊工具介紹Android
- 高通晶片平臺進9008埠晶片
- 如何開發直播平臺,直播平臺開發需要CDN嗎
- 谷歌開發Android Pay 搭建移動支付平臺谷歌Android
- PlayJam: 60%開發商將選擇Android平臺Android
- Web快速開發平臺,基於二次開發平臺Web
- 力軟快速開發平臺:方便快捷的Web開發平臺Web
- 數控開發平臺
- 國內開發平臺
- 平臺碎片化 Android應用開發該如何取捨?Android
- 高通平臺 按鍵 進入 fastboot/recovery/edl 模式ASTboot模式
- node.js開發平臺Node.js
- 微信公共平臺開發(轉)
- 直播平臺軟體開發,Android 10 拍照和相簿選擇Android
- 搭建直播平臺,Android開發之禁止下拉通知欄的方法Android
- 直播電商平臺開發,Android | 圖片縮放、自動居中Android
- 直播平臺軟體開發,Android 計時器,定時功能Android
- 分享個高通平臺NV引數恢復工具-QSerWriteNumber
- 數字資產幣幣交易平臺開發區塊鏈合約交易平臺開發區塊鏈
- 低程式碼開發平臺是什麼意思?低程式碼開發平臺優勢!
- C#Winform快速開發平臺與軟體配置平臺C#ORM
- TRONex智慧合約APP開發平臺(真實平臺)APP
- 跨平臺開發框架的大旗框架
- SAAS平臺每日開發進度
- 數藏平臺開發貴嗎
- 跨平臺開發框架 Lynx 初探框架
- .NET平臺常用的開發元件元件
- Windows Live平臺開發資源Windows
- EOS開發平臺和框架薦框架
- QT6跨平臺開發QT