~~~my~~~ 正確的編譯android sdk: cd myandroid . ./build/envsetup.sh lunch sdk-eng make sdk //或者: make PRODUCT-sdk-sdk 這樣就會在out/host/linux-x86/sdk/目錄下生成跟google 發布的sdk包一樣的目錄,就可以使用自己的sdk開發包了。 make snod //生成system.img make sdk showcommands //顯示編譯時的詳細信息 運行模擬器: . build/envsetup.sh lunch 1 或者 lunch sdk-eng //加載運行環境 export PATH=/home/vnify/software/jdk1.5.0_04/bin/:$PATH //設置java,我的默認為1.6 export ANDROID_SDK_ROOT=./out/host/linux-x86/sdk/android-sdk_eng.vnify_linux-x86/ emulator -avd wvga800 -skin WVGA800 //運行指定的虛擬設備和皮膚 調試: ddms & ~~~my~~~ 1、Git的安裝在Ubuntu 8.04上安裝git只要設定了正確的更新源,然后使用apt-get就可以了,有什么依賴問題,就讓它自己解決吧。其中cURL是一個利用URL語法在命令行下工作的文件傳輸工具,會在后面安裝Repo的時候用到。 sudo apt-get install git-core curl 2、安裝Repo 首先確保在當前用戶的主目錄下創建一個/bin目錄(如果沒有的話),然后把它(~/bin)加到PATH環境變量中接下來通過cURL來下載Repo腳本,保存到~/bin/repo文件中 curl http://android.git./repo >~/bin/repo 別忘了給repo可執行權限 chmod a+x ~/bin/repo 3、初始化版本庫如果是想把Android當前主線上最新版本的所有的sourcecode拿下來,我們需要repo的幫助。先建立一個目錄,比如~/android,進去以后用repo init命令即可。 repo init -u git://android.git./platform/manifest.git 這個過程會持續很長的時間(至少可以好好睡一覺),具體要多少時間就取決于網絡條件了最后會看到 repo initialized in /android這樣的提示,就說明本地的版本庫已經初始化完畢,并且包含了當前最新的sourcecode。 如果想拿某個branch而不是主線上的代碼,我們需要用-b參數制定branch名字,比如: repo init -u git://android.git./platform/manifest.git -b cupcake 另一種情況是,我們只需要某一個project的代碼,比如kernel/common,就不需要repo了,直接用Git即可。 git clone git://android.git./kernel/common.git 這也需要不少的時間,因為它會把整個Linux Kernel的代碼復制下來。 如果需要某個branch的代碼,用git checkout即可。比如我們剛剛拿了kernel/common.get的代碼,那就先進入到common目錄,然后用下面的命令: git checkout origin/android-goldfish-2.6.27 -b goldfish 這樣我們就在本地建立了一個名為goldfish的android-goldfish-2.6.27分支,代碼則已經與android-goldgish-2.6.27同步。我們可以通過git branch來列出本地的所有分支。 4、同步版本庫使用rerpo sync命令,我們把整個Android代碼樹做同步到本地,同樣,我們可以用類似 repo sync project1 project2 … 這樣的命令來同步某幾個項目 如果是同步Android中的單個項目,只要在項目目錄下執行簡單的 git pull 即可。 5、通過GitWeb下載代碼另外,如果只是需要主線上某個項目的代碼,也可以通過GitWeb下載,在shortlog利用關鍵字來搜索特定的版本,或者找幾個比較新的tag來下載還是很容易的。 ----------------------------------- android編譯全過程 2009-11-05 15:00 本 文主要參考官方文檔(http://source./download)和網上相關資料(http: //blog.csdn.net/HKjinzhao/archive/2009/03/18/4002326.aspx,http: //www.williamhua.com/2009/04/30/how-to-build-android-15-kernel-image/)。網 上的資料對于andorid的最新代碼有的已經過時,或者有錯誤,這份文檔本人親自實驗,保證可行。另本人沒有使用eclipse的習慣,所以并沒有做 eclipse的相關配置。 編譯環境:ubuntu9.10,widnows平臺目前不被支持。 1)安裝必要的軟件環境 $ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev 官方推薦的就是上面這些,如果在編譯過程中發現某些命令找不到,就apt-get它。可能需要的包還有: $ sudo apt-get install make $ sudo apt-get install gcc $ sudo apt-get install g++ $ sudo apt-get install libc6-dev $ sudo apt-get install patch $ sudo apt-get install texinfo $ sudo apt-get install zlib1g-dev $ sudo apt-get install valgrind $ sudo apt-get install python2.5(或者更高版本)需要注意的是,官方文檔說如果用sun-java6-jdk可出問題,得要用sun-java5- jdk。經測試發現,如果僅僅make(make不包括make sdk),用sun-java6-jdk是沒有問題的。而make sdk,就會有問題,嚴格來說是在make doc出問題,它需要的javadoc版本為1.5。因此,我們安裝完sun-java6-jdk后最好再安裝sun-java5-jdk,或者只安裝sun-java5-jdk。這里sun-java6- jdk和sun-java5-jdk都安裝,并只修改javadoc.1.gz和javadoc。因為只有這兩個是make sdk用到的。這樣的話,除了javadoc工具是用1.5版本,其它均用1.6版本: $ sudo apt-get install sun-java6-jdk 修改javadoc的link $ cd /etc/alternatives $ sudo rm javadoc.1.gz $ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz $ sudo rm javadoc $ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc 2)設置環境變量 $ emacs ~/.bashrc 在.bashrc中新增或整合PATH變量,如下: #java 程序開發/運行的一些環境變量 JAVA_HOME=/usr/lib/jvm/java-6-sun JRE_HOME=${JAVA_HOME}/jre export ANDROID_JAVA_HOME=$JAVA_HOME export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin export JAVA_HOME; export JRE_HOME; export CLASSPATH; HOME_BIN=~/bin/ export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN}; 保存后,同步更新: source ~/.bashrc 3)安裝repo(用來更新android源碼)創建~/bin目錄,用來存放repo程序,如下: $ cd ~ $ mkdir bin 并加到環境變量PATH中,在第2步中已經加入下載repo腳本并使其可執行: $ curl http://android.git./repo >~/bin/repo $ chmod a+x ~/bin/repo 4)初始化repo repo是android對git的一個封裝,簡化了一些git的操作。創建工程目錄: $ mkdir android $ cd android repo初始化 $ repo init -u git://android.git./platform/manifest.git 在此過程中需要輸入名字和email地址。初始化成功后,會顯示: repo initialized in /android 在~/android下會有一個.repo的隱藏目錄。 5)同步源代碼 $ repo sync 這一步要很久很久 6)編譯android源碼,并得到~/android/out目錄 $ cd ~/andoird $ make PRODUCT-sdk-sdk 這一過程很久或者: . ./build/envsetup.sh lunch sdk-eng make sdk 7)在模擬器上運行編譯好的android 編譯好android之后,emulator在~/android/out/host/linux-x86/bin 下,ramdisk.img,system.img和userdata.img則在~/android/out/target/product /generic下 $ cd ~/android/out/host/linux-x86/bin 增加環境變量 $ emacs ~/.bashrc 在.bashrc中新增環境變量,如下 #java 程序開發/運行的一些環境變量 export ANDROID_PRODUCT_OUT=~/android/out/target/product/generic ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT}; 最后,同步這些變化: $ source ~/.bashrc $ cd ~/android/out/target/product/generic $ emulator -system system.img -data userdata.img -ramdisk ramdisk.img 最后進入android桌面,就說明成功了。 8)編譯模塊 android中的一個應用程序可以單獨編譯,編譯后要重新生成system.img 在源碼目錄下執行 $ . build/envsetup.sh (.后面有空格)就多出一些命令: - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. - cgrep: Greps on all local C/C++ files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - godir: Go to the directory containing a file. 可以加—help查看用法我們可以使用mmm來編譯指定目錄的模塊,如編譯聯系人: $ mmm packages/apps/Contacts/ 編完之后生成兩個文件: out/target/product/generic/data/app/ContactsTests.apk out/target/product/generic/system/app/Contacts.apk 可以使用 $ make snod 重新生成system.img,再運行模擬器 9)編譯SDK 直接執行make是不包括make sdk的。make sdk用來生成SDK,這樣,我們就可以用與源碼同步的SDK來開發android了。 a)修改/frameworks/base/include/utils/Asset.h ‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改為 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’ 原因是eclipse編譯工程需要大于1.3M的buffer; b)編譯ADT。由于本人不使用eclipse,所以沒有進行這步; c)執行make sdk。注意,這里需要的javadoc版本為1.5,所以你需要在步驟1中同時安裝sun-java5-jdk $ make sdk 編譯很慢。編譯后生成的SDK存放在out/host/linux-x86/sdk/,此目錄下有android-sdk_eng.xxx_linux- x86.zip和android-sdk_eng.xxx_linux-x86目錄。android-sdk_eng.xxx_linux-x86就是 SDK目錄實際上,當用mmm命令編譯模塊時,一樣會把SDK的輸出文件清除,因此,最好把android-sdk_eng.xxx_linux-x86移出來此后的應用開發,就在該SDK上進行,所以把7)對于~/.bashrc的修改注釋掉,增加如下一行: export PATH=${PATH}:~/android/out/host/linux-x86/sdk/android-sdk_eng.xxx_linux-x86/tools 注意要把xxx換成真實的路徑; # make PRODUCT-sdk-sdk d)關于環境變量、android工具的選擇目前的android工具有: A、我們從網上下載的SDK,如果你下載過的話( tools下有許多android工具,lib/images下有img映像) B、我們用make sdk編譯出來的SDK( tools下也有許多android工具,lib/images下有img映像) C、我們用make編譯出來的out目錄( tools下也有許多android工具,lib/images下有img映像)那么我們應該用那些工具和img呢?首先,我們一般不會用A選項的工具和img,因為一般來說它比較舊,也源碼不同步。其次,也不會用C選項的工具和img,因為這些工具和img沒有經過 SDK的歸類處理,會有工具和配置找不到的情況;事實上,make sdk產生的很多工具和img,在make編譯出來out目錄的時候,已經編譯產生了,make sdk只是做了copy而已。 e)安裝、配置ADT 略過; f)創建Android Virtual Device 編譯出來的SDK是沒有AVD(Android Virtual Device)的,我們可以通過android工具查看: $ android list 創建AVD: $ android create avd -t 1 -n myavd 可以android –help來查看上面命令選項的用法。創建中有一些選項,默認就行了再執行android list,可以看到AVD存放的位置以后每次運行emulator都要加-avd myavd或@myavd選項: $ emulator -avd myavd 10)編譯linux內核映像 a)準備交叉編譯工具鏈 android代碼樹中有一個prebuilt項目,包含了我們編譯內核所需的交叉編譯工具。 b)設定環境變量 $ emacs ~/.bashrc 增加如下兩行: export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin export ARCH=arm 保存后,同步變化: $ source ~/.bashrc c)獲得合適的內核源代碼 $ cd ~/android 獲得內核源代碼倉庫 $ git clone git://android.git./kernel/common.git kernel $ cd kernel $ git branch 顯示 * android-2.6.27 說明你現在在android-2.6.27這個分支上,也是kernel/common.git的默認主分支。顯示所有head分支: $ git branch -a 顯示 * android-2.6.27 remotes/origin/HEAD -> origin/android-2.6.27 remotes/origin/android-2.6.25 remotes/origin/android-2.6.27 remotes/origin/android-2.6.29 remotes/origin/android-goldfish-2.6.27 remotes/origin/android-goldfish-2.6.29 我們選取最新的android-goldfish-2.6.29,其中goldfish是android的模擬器模擬的CPU。 $ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29 $ git branch 顯示 android-2.6.27 * android-goldfish-2.6.29 我們已經工作在android-goldfish-2.6.29分支上了。 d)設定交叉編譯參數打開kernel目錄下的Makefile文件,把CROSS_COMPILE指向剛才下載的prebuilt中的arm-eabi編譯器 CROSS_COMPILE ?= arm-eabi- 把 LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ $(call ld-option, -Wl$(comma)–build-id,)) 這一行注釋掉,并且添加一個空的LDFLAGS_BUILD_ID定義,如下: LDFLAGS_BUILD_ID = e)編譯內核映像 $ cd ~/android/kernel $ make goldfish_defconfig $ make f)測試生成的內核映像 $ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage ----------------------------------- Android tools ======= adb ======= #運行monkey程序,進行隨機輸入測試 $ adb shell monkey -v -p com.android.email 500 #查看system's log buffers $ adb logcat #Viewing stdout and stderr $ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start #view a log buffer containing radio and telephony messages $ adb logcat -b radio # radio, events, main is default #Filtering Log Output $ adb logcat ActivityManager:I MyApp:D *:S ======= emulator ======= #運行模擬器 $ emulator -system system.img.orig -data userdata.img -ramdisk ramdisk.img @my_avd $ emulator @my_avd #運行模擬器,并顯示Linux kernel啟動時的message $ emulator -show-kernel @my_avd #enable root shell on current terminal $ emulator -shell @my_avd # -wipe-data delete the emulator's user-data partition emulator -wipe-data @my_avd emulator -partition-size 256 -system D:\rom\system.img -data d:\rom\userdata.img -kernel d:\rom\kernel-qemu -ramdisk d:\rom\ramdisk.img -sdcard D:\android\sdk\1.6\sd64.img -cpu-delay 0 -scale 160dpi -dpi-device 240 -skin WVGA800 -skindir D:\android\sdk\1.6\platforms\android-2.1\skins -memory 512 -prop dalvik.vm.heapsize=32m 具體解釋一下: -partition-size 可以設置分區的大小,是system和data兩個分區,一起設置 -cpu-delay 可以模擬速度慢的cpu -scale 可以縮小或擴大其顯示dpi -dpi-device 可以設置hdpi或者mdpi等 -skin必須配合-skindir使用 -memory是設置內存大小,缺省是96m,如果不設置大一些,大家都很看到不停地kill and start -prop dalvik.vm.heapsize=32m 這個是非常重要的設置,在我們的hdpi下,不設置成24m+就會系統無法啟動 ======= trace ======= # tracing // start tracing to "/sdcard/calc.trace", onCreate() Debug.startMethodTracing("calc"); // ... // stop tracing, onDestroy() Debug.stopMethodTracing(); adb pull /sdcard/calc.trace /tmp traceview /tmp/calc # 按F9啟動/停止trace記錄,在~/.android/avd/my_avd.avd/traces/目錄下可以找到trace文件 $ emulator -trace trace_log # 進入android源代碼目錄 $ cd $ANDROID_HOME $ source build/envsetup.sh # 運行envsetup.sh中的tracedmdump函數 $ tracedmdump ~/.android/avd/my_avd.avd/traces/trace_log 會在~/.android/avd/my_avd.avd/traces/trace_log下產生dmtrace和dmtrace.html文件 ======= apk ======= # 將apk/目錄下的所有文件打包成apk $ apkbuilder jfo.apk -rf apk/ # 或者使用aapt $ aapt p -F jfo2.apk apk/ # 打印APK包信息 $ aapt dump badging jfo.apk # add a file $ aapt a jfo.apk libcharset.so # remove a file $ aapt r jfo.apk libcharset.so ======= hierarchyviewer ======= # provides a visual representation of the layout's View hierarchy (the Layout View) $ hierarchyviewer ======= astyle ======= # 代碼格式化工具 astyle find ./ -name *.java -exec astyle --style=ansi {} \; |