編輯:Android開發實例
關於android系統的編譯,Android的官方網站上也給出了詳細的說明。
http://source.android.com/source/building.html
Ø 初始化編譯環境
切換到Android源碼目錄:
$ cd WORKING_DIRECTORY
執行下面命令,加載編譯過程中用到的命令、環境變量:
$ source build/envsetup.sh
Ø 選擇編譯選項
執行下面的命令,從列表中選擇一個編譯項:
$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. full-eng
2.full_x86-eng
3.vbox_x86-eng
4.full_maguro-userdebug
5.full_tuna-userdebug
6.full_panda-eng
我們選擇:1,也就是說,編譯full-eng的目標,當然我們也可以直接指定編譯項,如下:
$ lunch full-eng
其中,lunch命令是指打印或設置出當前系統中設置的編譯項,full-eng這個編譯項由兩部分組成,其中前半部分full表示目標設備為Android的模擬器,官方解釋為:fully configured with all languages,apps, input methods,全部的應用程序及語言,輸入法等。後半部分eng表示帶有調試功能的工程機。
lunch命令打印全部的信息,如下表所示:
Build name Device Notes
full
emulator
fully configured with all languages, apps, input methods
full_maguro
maguro
full build running on Galaxy Nexus GSM/HSPA+ ("maguro")
full_panda
panda
full build running on PandaBoard ("panda")
Buildtype
Use
user
limited access; suited for production
userdebug
like "user" but with root access and debuggability; preferred for debugging
eng
development configuration with additional debugging tools
Ø 編譯前的准備
由於我們使用ubuntu12.04對Android進行編譯,Android對Ubuntu12.04的編譯平台的支持不是很推薦,有些庫的兼容方面會有一些問題,在編譯過程中會產生一些錯誤,我們要進行一些修正。
錯誤信息:
g++ selected multilib '32' not installed
或
<command-line>:0:0: error:"_FORTIFY_SOURCE" redefined [-Werror]
<built-in>:0:0: note: this is thelocation of the previous definition
cc1plus: all warnings being treated aserrors
make: ***[out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1
原因:
在Android系統過程中,要使用gcc-4.4/g++-4.4的編譯器,而Ubuntu12.04的gcc版本為4.6.3
解決方法:
安裝gcc-4.4
$sudo apt-get install gcc-4.4
$sudo apt-get install g++-4.4
進入到/usr/bin目錄下,刪除gcc對gcc-4.6的鏈接,創建到新安裝的gcc-4.4的鏈接:
$cd /usr/bin
$sudo rm -r gcc
$sudo ln -s gcc-4.4 gcc
驗證結果:
$gcc -v
$g++ -v
打印其版本為gcc-4.4x、g++-4.4x即可。
Ø 編譯源碼
輸入下面命令開始編譯:
$ make -jn
其中,-jn表示,n個線程同時編譯,一般n的值為CPU核的2倍,但是,也要和你的Ubuntu的內存有關系,每個線程在編譯時最少需要1G內存,如果你沒有很多內存,還是直接使用make命令吧,否則,編譯到後面會出錯。
這個過程,如果是虛擬機的話,至少要4個多小時,如果是實體機的話,要看配置,一般在1個小時以上。
編譯成功結果如下圖所示:
編譯Linux源碼必然要先指定gcc交叉編譯器,我們直接使用Android自帶的arm-eabi-4.4.3編譯器,它在WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin路徑下。
$ ls WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
我們編譯下面一個編譯腳本make_zImage.sh,讓這個腳本去編譯goldfish的內核:
#!/bin/bash
export PATH=/home/farsight/andorid/android4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make goldfish_armv7_defconfig
make
給make_zImage.sh添加可執行權限,然後執行該編譯腳本:
$ chmod a+x make_zImage.sh
$ ./make_zImage.sh
當我們看到下面的結果時,表示goldfish的內核編譯出來了:
如果想要了解,Android的編譯過程,可以參照下面三篇博文:
Android編譯系統詳解(一)
Android編譯系統詳解(二)
Android編譯系統詳解(三)
按照google給出的編譯步驟如下:
1> source build/envsetup.sh:加載命令
2> lunch:選擇目標平台編譯選項
3> make:執行編譯
我們按照編譯步驟來分析編譯過程的細節,最終添加自己的平台產品的編譯選項。
該命令是用來將envsetup.sh裡的所有用到的命令加載到環境變量裡去。主要幾個命令如下:
function help() #顯示幫助信息
function check_product() # 檢查product
function check_variant() # 檢查變量
function printconfig() #打印配置
function add_lunch_combo() # 添加lunch項目
function print_lunch_menu() # 打印lunch列表
function lunch() #配置lunch
function m() #make from top
function mm() #make from current directory
function mmm() #make the supplied directories
build/envsetup.sh其主要作用如下:
ü 加載了編譯時使用到的函數命令,如:help,lunch,m,mm,mmm等
ü 添加了兩個編譯選項:generic-eng和simulator,這兩個選項是系統默認選項
ü 查找vendor/*/*/vendorsetup.sh和device/*/*/vendorsetup.sh,也就是說從vendor/<廠商目錄>/<平台設備目錄>/目錄和device/<廠商目錄>/<平台設備目錄>/目錄下,查找vendorsetup.sh,如果找到的話,加載執行它,添加廠商自定義產品的編譯選項。
如果想要添加自己的目標設備編譯選項,我們就要在device或vendor目錄下創建設備廠商,然後在設備廠商目錄下,創建一個vendorsetup.sh文件,在裡面添加上自己的編譯項。
$mkdir -p device/farsight/fsdevice
$touch device/farsight/fsdevice/vendorsetup.sh
$echo "add_lunch_combo fs100-eng" > device/farsight/fsdevice/vendorsetup.sh
注:
farsight:廠商名
fsdevice:平台設備名
fs100-eng:自定義的目標產品名為fs100,eng為編譯目標類型
所有的編譯項的格式都是:設備名-編譯目標類型,編譯目標類型為:eng,user,userdebug,三種類型之一(詳細見3.1節)。
下面驗證一下我們的結果,當在Android目錄下,再次執行source build/envsetup.sh時,我們可以看到我們新添加的編譯項:
我們當然也可以直接執行lunch命令,然後在彈出菜單裡面來選擇我們的編譯項,如下圖所示:
注:我們添加的編譯項這時已經存在了,但是如果你選擇了它,在編譯時會出錯,因為我們還沒有對應編譯項的配置文件。
lunch命令可以帶參數和不帶參數,最終導出一些重要的環境變量,從而影響編譯系統的編譯結果。導出的變量如下(以lunch full-eng為例):
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
當我們輸入make命令後,就開始android系統的編譯了,所有的Makefile都通過build/core/main.mk這個文件組織在一起,它定義了一個默認goals:droid,當我們在TOP目錄下,敲make實際上就等同於我們執行make droid。
當make include所有的文件,完成對所有make文件的解析以後就會尋找生成droid的規則,依次生成它的依賴,直到所有滿足的模塊被編譯好,然後使用相應的工具打包成相應的img。其中,config.mk,envsetup.mk,product_config.mk文件是編譯用戶指定平台系統的關鍵文件。Android的編譯系統比較復雜,詳細的說明請參照前面給出博文內容。
下面列出在編譯過程中經常使用的一些命令:
source build/envsetup.sh:加載編譯命令,產生編譯選項
lunch或lunch xxx-yyy:打印編譯選項菜單或指定編譯選項,xxx表示產品,yyy表示編譯類型
make:根據lunch選項,編譯Android系統,最後產出為:system.img,ramdisk.img,userdate.img
m:和make命令一樣
mm:從當前目錄下開始向下編譯目標
mmm:指定一個目錄,僅編譯指定目錄下的目標
make snod:只將out/target/product/XXX/system/目錄下的內容打包生成system.img,不會檢查依賴關系
make bootimage:只將out/target/product/XXX/root/目錄下的內容打包生成ramdisk.img
Android的ListView是應用最廣的一個組件,功能強大,擴展性靈活(不局限於ListView本身一個類),前面的文章有介紹分組,拖拽,3D立體,游標,圓角
hello,大家好,本文主要介紹如何開始開發一個美觀、有情調、人見人愛的Android應用程序,已知我們在市面上有不少布局極其精美,在視覺上讓人愛不釋手的應用程序
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
知識點: 這次將繼續上一篇文章沒有講完的Menu的學習,上下文菜單(Context menu)和彈出菜單(Popup menu)。 上下文菜單 上下文菜單提供對U