標籤:

android 編譯命令

編譯模塊

Android中的一個應用程序可以單獨編譯,編譯後需要重新生成system.img。在Android目錄下運行$ . build/envsetup.sh 或者$ source 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.- printconfig: 當前build的配置情況.可以使用 --help查看用法。如:在修改了某一個模塊以後,可以使用 $ mmm <目錄> 來重新編譯所有在<目錄>中的所有模塊,使用 $ mm 編譯當前目錄中的所有模塊。編完之後,即修改了Android系統以後,可以使用 $ make snod 重新生成system.img

***************************************************************************************************************************************************1.編譯單個模塊,可以使用mmm工具其使用方法是:mmm <dir>,如編譯frameworks下的所有文件:先在android 源碼根目錄下執行: source build/envsetup.sh 再換到目標目錄下執行:mmm <framwork>或者:先執行: $. build/envsetup.sh && help接著:如下, m, mm, mmm.Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:- 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.例1:===========================================================================================================================================================jinli@jinli:~/AndroidStandardSource$ . build/envsetup.sh && choosecombo 1 1 2 3 && export ANDROID_JAVA_HOME=$JAVA_HOME && mmm hardware/libhardware/sensor/=============================================================================================================================================================例2:我們可以使用mmm來編譯指定目錄的模塊,如編譯聯繫人:mmm packages/apps/Contacts/編完之後生成兩個文件:out/target/product/generic/data/app/ContactsTests.apkout/target/product/generic/system/app/ Contacts.apk2.編譯出來的APK,但APK並不包含在system文件夾中,我們可以使用make snod 打包system文件夾,產生新的system.img。3. make sdk 命令:make PRODUCT-sdk-sdk4.應用程序還可以通過eclipse創建android 應用程序安裝包。5.運行在模擬器,上傳framework.jar到對應的運行環境目錄$ ./adb push {MYDONUT_OUT_PATH}/target/product/generic/system/framework/framework.jar /system/framework6. 通過命令,重啟設備,更新生效。$ ./adb shell# stop# start================================================================================android source 目錄下MAkefile內容:### DO NOT EDIT THIS FILE ###include build/core/main.mk### DO NOT EDIT THIS FILE ###build/core/main.mk包含build/core/config.mkbuild/core/config.mk在兩個地方查找BoardConfig.mkconfig.mk中與此相關的內容:#Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)# or under vendor/*/$(TARGET_DEVICE). Search in both places, but# make sure only one exists.make 默認的BoardConfigbuild/target/board/generic/BoardConfig.mk====================================================================================source build/envsetup.shmake TARGET_PRODUCT=sec_smdk6410 showcommands=======================================================================================構建Android 1.5系統映像並在模擬器中運行1、Host OS編譯環境準備sudo apt-get install flex bison gperf valgrind libsdl-dev libesd0-dev libwxgtk2.6-dev zlib1g-dev另外,編譯過程中還需要用到JDK 5.0(注意JDK6.0不被支持),請到Sun的官方網站下載後安裝。(10.04 & 9.10: sudo agt-get install gcc-4.3 g++-4.3)2、設置java環境把JDK5.0加進$PATH,如:$export PATH=$PATH:/home/william/jdk5.0/bin然後可以用java -version來確認java的版本3.Android源碼編譯出錯的解決辦法下載Android源碼前,如果在Ubuntu 9.10系統下,需要更換jdk的版本,要換成sun-java5-jdk,如果不更換,在編譯Android源碼的時候會出現錯誤。編譯Android源碼下載完源碼後,不能直接編譯,如果直接make,會出現錯誤:frameworks/policies/base/PolicyConfig.mk:22: *** No module defined for the given PRODUCT_POLICY (android.policy_phone). 解決辦法:在 Android源碼所在目錄中 進入build/tools/findleaves.sh中的第89行    這一句find "${@:0:$nargs}" $findargs -type f -name "$filename" -print |改為find "${@:1:$nargs-1}" $findargs -type f -name "$filename" -print |這個錯誤改過了之後,執行make,又發現錯誤:frameworks/base/tools/aidl/AST.cpp:10: error: "fprintf" was not declared in this scope解決辦法:下載gcc-4.3和 g++-4.3,替換最新的gcc-4.4和g++-4.4版本sudo apt-get install g++-4.3 gcc-4.3進入/usr/bin目錄 刪除目錄下對gcc-4.4 和 g++-4.4的軟鏈接rm gccrm g++建立如下鏈接ln -s gcc-4.3 gccln -s g++-4.3 g++4、關於編譯選項在build/core目錄下的envsetup.mk定義了target的體系結構和OS,默認為arm和linux,我們暫時不涉及移植,所以不需要修改。5、開始編譯做完上面的準備,在代碼樹的根目錄下敲make就可以了,編譯的過程大約需要持續1~2個小時,總計需要大約3.5G的可用空間。6、測試生成的image編譯完成以後如果想在模擬器中運行,除了kernel的映像文件以外,所需的其他3個映像文件分別是:(位於out/target/product/generic/目錄)ramdisk.img: 包含了在模擬器中啟動Android所需的文件系統system.img: 初始的Android系統映像,包含了程序和庫文件userdata.img: 初始的用戶數據映像文件模擬器會首先到指定的AVD所在的目錄查找是否有userdata映像存在,如果沒有的話就會基於初始的userdata.img來創建一個,載入這3個映像文件後,它會把system.img和userdata.img分別掛載載到ramdisk文件系統中的system和userdata目錄下。所有的用戶數據都會被保存在AVD目錄下的userdata-qemu.img中,初始的用戶數據映像文件並不會被修改。通過命令行參數啟動模擬器,載入我們編譯的系統映像的方法:emulator @1.5_L2 -system system.img -ramdisk ramdisk.img或者加上-kernel參數,用自己編出來的kernel來啟動。=========================================================================================================================================================android 編譯時可能出現gcc版本不匹配的問題,解決方法如下:下載gcc-4.3和 g++-4.3,替換最新的gcc-4.4和g++-4.4版本sudo apt-get install g++-4.3 gcc-4.3進入/usr/bin目錄 刪除目錄下對gcc-4.4 和 g++-4.4的軟鏈接rm gccrm g++建立如下鏈接ln -s gcc-4.3 gccln -s g++-4.3 g++執行make命令 ,編譯成功
推薦閱讀:

Eclipse編譯帶so庫或jar包的android應用
2011 阿拉伯之春【普羅編譯】
linux下編譯mosquitto出現的問題---「ares.h: No such file or directory」
【全文編譯】歐亞集團2016全球風險 (1)

TAG:編譯 |