轉載請保留出處:http://www.cnblogs.com/wi100sh/p/4337907.html
折騰了好幾天,今天終於編譯通過,用了4個多小時,太不容易了。如下圖所示:
軟件環境
虛擬機:VisualBox
操作系統:Ubuntu14.04 64位
android源碼:android-4.4.4_r1
在這過程中遇到各種問題,通過apt-get install 安裝相應的庫可以解決一部分。編譯2-3個小時的時候遇到一個棘手的問題,
“make: *** [out/target/product/mako/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so] 錯誤 1”
google和baidu都沒有找到解決方法。查看網友成功編譯android4.4源碼的文章,里面的提到的步驟自己都操作一下,終於可以編譯成功了,下面列出了自己操作的步驟:
1. 如果使用虛擬機的話,特別提醒一下,一定要將虛擬機的大小開到100G以上
2. 下載並安裝jdk6
注意,版本一定要是jdk6,其他版本都會有問題。
網上流傳的方法大都是apt-get install來安裝jdk,實際操作證明這樣是不行的,下面給出個下載jdk6的地址
https://jdk6.java.net/download.html 在這里根據自己機器配置情況選擇自解壓文件(self-extracting)就好了
上面下載得到jdk-6u38-ea-bin-b04-linux-i586-31_oct_2012.bin文件,改變屬性使其擁有可執行權限。
./jdk-6u38-ea-bin-b04-linux-i586-31_oct_2012.bin即可安裝,該jdk是32位的。
3. vim ~/.bashrc 在最后添加
PATH=$PATH:/usr/local/java/jdk1.6.0_38/bin
CLASSPATH=.:/usr/local/java/jdk1.6.0_38/lib
JAVA_HOME=/usr/local/java/jdk1.6.0_38
然后執行source ~/.bashrc 使配置生效
4. 設置Ubuntu下默認的jdk
因為ubnuntu中有默認安裝的openjdk,但我們編譯Android源碼是需要jdk6的,所以需要設置默認成jdk6
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.6.0_38/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.6.0_38/bin/javac 300
update-alternatives --config java
5. 測試jdk環境變量是否正確配置
VBox:~$ java -version
java version "1.6.0_38-ea"
Java(TM) SE Runtime Environment (build 1.6.0_38-ea-b04)
Java HotSpot(TM) Server VM (build 20.13-b02, mixed mode)
若出現上述信息,則說明jdk環境變量已經配置成功
6. 預先要安裝的其他軟件
說明下,為保證編譯過程中不老是缺少某些軟件而中斷,所以一定要做好准備工作,不打任何一場無准備的仗。
網上很多前輩都已經給出來了不少要提前安裝好的軟件,下面把它們集中整理出來。
sudo apt-get install build-essential make gcc g++ libc6-dev patch \
texinfo libncurses-dev flex bison git-core gperf libsdl-dev libesd0-dev \
libwxgtk2.6-dev build-essential zip curl ncurses-dev zlib1g-dev valgrind
上面這個命令,我沒有執行,安裝了下面提到的幾個包。
sudo apt-get install libgtk2.0-0:i386
sudo apt-get install libpangox-1.0-0:i386
sudo apt-get install libpangoxft-1.0-0:i386
sudo apt-get install libidn11:i386
sudo apt-get install gstreamer0.10-pulseaudio:i386
sudo apt-get install gstreamer0.10-plugins-base:i386
sudo apt-get install gstreamer0.10-plugins-good:i386
sudo apt-get install gstreamer0.10-ffmpeg:i386(該軟件我沒有安裝成功,最后也沒出什么問題)
再加個說明:上面的軟件中最后幾個以i386是因為一個錯誤(具體什么錯誤現在實在記不起來了),錯誤原因就是需要安裝ia32-libs的軟件包64位Linux(Ubuntu)上編譯Android源碼時還需要一個32位Linux的包,所以需要這個ia32-libs的支持包,但這個ia32-libs的軟件包在網上根本沒有找到,也沒發現實際可用的解決方案,但從Ubuntu官網上來看,這個ia32-libs其實就是若干軟件包的合集,所以下載安裝其中的那么幾個軟件包就可以達到我們的目的。
7. 為了提高編譯的效率,我們最好先設置一下編譯器的高速緩存從而加快編譯速度,使用下面的命令
prebuilts/misc/linux-x86/ccache/ccache -M 50G
注意事項:
① 前提是已經在 .bashrc文件中添加:export USE_CCACHE = 1
② ccache是一個可執行文件
③ -M 50G 兩個參數表示設置50G大小的空間作為緩存,這個數值可以根據自己時間硬盤空間大小繼續調整
ccache是一個編譯器ccache用於C和C++。可以讓構建更加快速。
可以使用如下操作來查看使用的ccache大小:
$watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s
若使用Ice Cream Sandwich(4.0.x)或更老的版本,需要用prebuilts來代替prebuilts/misc
8. 正式編譯Android源碼
做了那么多的准備工作,現在終於可以做正事了。根據Android官網的說法,編譯Android源碼執行下面三個命令即可
① source build/envsetup.sh
② lunch 此時要選擇一個編譯平台
運行 lunch 命令選擇好編譯目標后,會出現如下提示信息,告訴我們編譯的源碼一些相關信息
③ make -jn
這里的n注意取值,網上一般說法是CPU核數的兩倍,還有一說是CPU核數加1。到底哪個更准確我也沒有驗證。
但要值得提醒的是,雖然n用一個大的值會使編譯速度加快,但如果n取值過大,編譯是會報錯的。
如果實在不確定n應該用什么值,那就直接用make命令吧。
編譯完成之后在源碼目錄的out/target/product/generic/生成對應固件等文件,如下圖所示,我們可以運行模擬器或者刷機。
out/target/generic目錄包含了最終要使用的目標文件。
out/target/generic/system目錄是system.img解壓后的目錄。android系統中大都數程序都在system目錄中,包括apk應用程序(out/target/generic/system/app)。
out/target/generic/root目錄是ramdisk.img解壓后的目錄。
out/target/generic/data目錄是userdata.img解壓后的目錄。
9. 配置環境,准備emulator
編譯好android之后,emulator所在的目錄:~/android/out/host/linux-x86/bin
ramdisk.img,system.img和userdata.img所在的目錄:~/android/out/target/product /generic
kernel-qemu-armv7所在的目錄:~/android-4.4.4_r1/prebuilts/qemu-kernel/arm
(1)編譯成功后運行emulator提示No command 'emulator'
解決方法:
$ vi ~/.bashrc
在文件的最后添加如下指令
export ANDROID_PRODUCT_OUT=~/android-4.4.4_r1/out/target/product/generic //android-4.4.4_r1改成你自己的文件路徑
ANDROID_PRODUCT_OUT_BIN=~/android-4.4.4_r1/out/host/linux-x86/bin //android-4.4.4_r1改成你自己的文件路徑
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN};
$ source ~/.bashrc 使配置生效
(2)接下來出現如下錯誤
emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found.
If you are an Android SDK user, please use '@<name>' or '-avd <name>'
to start a given virtual device (see -help-avd for details).
Otherwise, follow the instructions in -help-disk-images to start the emulator
解決方法:
vi ~/.bashrc
在文件的最后添加如下指令
export ANDROID_BUILD_TOP=~/android-4.4.4_r1
$ source ~/.bashrc 使配置生效
(3)再次執行下面的命令,運行emulator成功。
VBox:~/android-4.4.4_r1/out/target/product/generic$ emulator -system system.img -data userdata.img -ramdisk ramdisk.img
轉載請保留出處:http://www.cnblogs.com/wi100sh/p/4337907.html