在linux環境下利用mmm命令編譯android項目錯誤記錄

來源:互聯網
上載者:User

標籤:原始碼   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項目錯誤記錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.