標籤:原始碼 linux 編譯android項目
此篇文章建立在之前的三篇文章的基礎之上(本次內容主要參考老羅的《android源碼情景分析一書》):
源碼編譯
核心編譯
adb串連模擬器
------------------------------------------------------------------------------------
之後,在android源碼環境中編寫了一個簡單的android程式HelloAndroid。
檔案結構如下:
~/android/packages/experimental/HelloAndroid
AndroidManifest.xml
Android.mk
src
com/hello
HelloAndroid.java
res
layout
main.xml
values
string.xml
drawable
icon.png
很簡單的最基本的結構,裡面的內容沒什麼好說,可能需要說明的就是Android.mk裡面的內容了。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := HelloAndroid
include $(BUILD_PACKAGE)
關於Android.mk是幹什麼的,以及這個指令碼的文法含義,大家可以參考這一篇部落格:http://blog.csdn.net/wh_19910525/article/details/7519919
當我們的程式寫好了之後,就要開始編譯了,開始的時候,mmm命令是停用,我們需要在當前終端中執行Android原始碼目錄下的build/envsetup.sh指令檔才可以使用.
$ source ./build/envsetup.sh
執行了之後,我們就可以使用mmm命令了。
$ mmm ./packages/experimental/HelloAndroid/
這個時候,我們的位置應該在android源碼的根目錄。
下面就記錄一些在這個過程中遇到的錯誤:
1.build/core/java.mk:9: *** (call my-dir): Target java module does not define any source or resource files.Stop.
這個問題可以看到應該是Android.mk提供的位置不對,導致編譯的時候,沒有找到這個檔案,仔細檢查了一下Android.mk的指令碼,發現在LOCAL_PATH := $這裡多了一個空格(call my-dir)的原因,去除掉重新編譯就可以了。
2.package/experimental/HelloAndroid/res/values/string.xml:1:error:Error parsing XML: no element found
package/experimental/HelloAndroid/res/layout/main.xml:8:error:Errorthis attribute must be localized.(at ‘text‘ with value ‘helloAndroid‘).
這個兩個其實是同一個問題,原因很簡單,就是在mian.xml的一個TextView裡面設定了text屬性,我沒有本地話,也就是說,沒有利用string中的資源,而是直接書寫的字串,大家用過Eclipse的都知道,這個在ide裡面會給出一個警告,在這個就編譯不成功過了。
然後在根據編譯過程中的錯誤提示,修複一些簡單問題,大概就是那個字元寫錯了之類,(表示,一直用ide來進行開發,突然完全手動去構建一個android工程,表示各種不會寫啊,看這樣子,用ide把人都給用傻了!~汗)。
之後出現這樣的提示就說明成功了:Install:out/target/product/generic/system/app/HelloAndroid.apk
接下來就是在模擬器中看看效果了先重建system.img位於out/target/product/generic中。
$ make snod
這個命令可以只重新打包Android系統鏡像檔案的system.img,但出現西面的只是就成功了。
Target system fs image: out/target/product/generic/system.img
前面我們在編譯源碼的成功了之後,在啟動模擬器的時候,設定了一些環境變數:
export PATH=$PATH:/usr/local/Android/Android2.3.7/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/usr/local/Android/Android_2.3.7/out/target/product/generic
emulator -kernel ./kernel/private_guo/kernel/arch/arm/boot/zImage
這個裡面ANDROID_PRODUCT_OUT是一個環境變數,啟動模擬器需要四個檔案,分別是zImage、system.img、userdata.img、ramdisk.img啟動,前一個是核心鏡像,我們則編譯核心的時候可以看到,結果就是一個zImage,後面三個是Android系統鏡像檔案。
ok,再次啟動模擬器吧。
傻眼了,報出一個錯誤:
emulator: ERROR: could not find required ramdisk image (ramdisk.img).
emulator: Did you build everything ?
這個錯誤很簡單易懂,就是我的ramdisk.img沒有了,當然模擬器就不能啟動了,於是乎,我跑過去看了一下,我的ramdisk.img果然是不在了,只有system.img和userdata.img了,這個我真的是不知道為什麼啊。沒有辦法,我只好重新make了一下,好在第二次會很快,一會就編譯好了。大家如果有誰知道這個問題的可以告訴我!
果然,等了一會之後,重新編譯出來之後,我的ramdisk.img又回來了,此問題先揭過,跑個模擬器起來看看。
可以看到程式已經在裡面了:
點擊進去看看效果:
恩,雖然過程有那麼點坎坷,但是好歹結果是出來了,至於ramdisk.img丟失的問題,需要再深入研究研究啊。
在linux環境下利用mmm命令編譯android項目錯誤記錄