超實(shí)用!Android 4.0.1 源代碼編譯
在學(xué)習(xí)應(yīng)用編程時(shí),為了實(shí)現(xiàn)應(yīng)用在后臺(tái)對(duì)其它界面的控制,需要將應(yīng)用的權(quán)限提高到系統(tǒng)級(jí)。
但提高到系統(tǒng)級(jí)的方法,其中一個(gè)就是放在 Android 源代碼目錄中進(jìn)行編譯;另一個(gè)方法已經(jīng)試過,但安裝失敗。
開始一直想直接從 Google 的網(wǎng)站上獲取 Android 源代碼,但由于大陸對(duì) Google 的封鎖,導(dǎo)致無法獲取到。大家都通過 VPN 來獲取,但一般 VPN 是需要費(fèi)用的。
后來才將獲取 Android 源代碼的方向轉(zhuǎn)向別人下載好,打包傳到網(wǎng)上的。
先后從 XX 云盤下載了 3 個(gè) Android 源代碼壓縮包,分別是:
repo.tar.gz 12.2GB
WORKING_DIRECTORY.tar 12.4GB?
android4.0.tar.gz 1.73GB
前兩個(gè)還沒有使用過,先使用 android4.0.tar.gz 進(jìn)行了試驗(yàn)。
在 Ubuntu 中先解壓 android4.0.tar.gz: tar -zxvf android4.0.tar.gz
安裝 jdk-6u45-linux-i586.bin,從 Oracle 網(wǎng)站上下載,需要在 Oracle 注冊(cè)。
獲取 jdk-6u45-linux-i586.bin 下載網(wǎng)址的辦法: google "jdk-6u45-linux" 得到的第一個(gè)搜索結(jié)果:?
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html
注意: 不用使用 Ubuntu 提供的 open-jdk 的版本。
安裝過程:
(1) 賦予執(zhí)行權(quán)限,在 terminal 中輸入: chmod a+x jdk-6u45-linux-i586.bin
(2) 解壓,在 terminal 中輸入: ./jdk-6u45-linux-i586.bin
(3) 創(chuàng)建 jvm 目錄,在 terminal 中輸入: sudo mkdir /usr/lib/jvm
(4) 移動(dòng)解壓文件,在 terminal 中輸入: sudo mv ~/AndroidSource/android4.0/jdk1.6.0_45 /usr/lib/jvm/jdk1.6.0_45
(5) 啟用 jdk 6,在 terminal 中輸入:
sudo ln -s -b /usr/lib/jvm/jdk1.6.0_45/jre/bin/java /etc/alternatives/java
sudo ln -s -b /usr/lib/jvm/jdk1.6.0_45/jre/bin/java /usr/bin/java
(6) 檢驗(yàn),在 terminal 中輸入:java -version
結(jié)果應(yīng)顯示:?
java version "1.6.0_45"
(7) 編輯配置文件,在 terminal 中輸入: sudo vim /etc/profile
在文件末尾添加如下條目:?
JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45 ? ? ? ? ? ? ? ? ? ? ? ??
export JRE_HOME=/usr/lib/jvm/jdk1.6.0_45/jre ??
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH ??
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH?
#set java environment
這里要根據(jù)自己的安裝路徑對(duì)以上內(nèi)容進(jìn)行修改!重啟系統(tǒng)后java的環(huán)境就安裝好了。
注: vim 操作指令,(1) Insert 按鍵;(2) : ; (3)! ; (4) w/q
開始編譯 Android 源代碼,進(jìn)入目錄: ~/AndroidSource/android4.0,依次輸入如下指令:
#make installclean
#make clean
#source build/envsetup.sh
#lunch 選擇版本號(hào): lunch full-eng
? ? ?1. full-eng
? ? ?2. full_x86-eng
? ? ?3. vbox_x86-eng
? ? ?4. full_maguro-userdebug
? ? ?5. full_tuna-userdebug
? ? ?6. full_panda-eng
Which would you like ?[full-eng] 5
#make -j4 其中-j(n)表示用n核cpu編譯
如果出錯(cuò)如下錯(cuò)誤,按對(duì)應(yīng)方法解決:
(1) Ubuntu bison:找不到命令
sudo apt-get install g++
(2) Ubuntu g++:找不到命令?
sudo apt-get install bison
(3) /usr/bin/ld: cannot find -lz
詳細(xì)信息如下:
host C: libpng <= external/libpng/pngwtran.c
host C: libpng <= external/libpng/pngwutil.c
host StaticLib: libpng (out/host/linux-x86/obj/STATIC_LIBRARIES/libpng_intermediates/libpng.a)
host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] 錯(cuò)誤 1
解決方法: ? ?
更新了工具的安裝,如下:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils xsltproc
可以繼續(xù)編譯。
錯(cuò)誤1:
編譯過程中出現(xiàn)一次提示: 進(jìn)程被殺掉的錯(cuò)誤,并終止的現(xiàn)象。
當(dāng)時(shí)沒有記錄具體的錯(cuò)誤,重新編譯就 OK 了。
------重新執(zhí)行: make -j2
錯(cuò)誤2:
t_intermediates/src -api out/target/common/obj/PACKAGING/public_api.txt -nodocs
make: *** 正在等待未完成的任務(wù)....
make: *** [out/target/common/docs/api-stubs-timestamp] 錯(cuò)誤 45
解決方法(使用方法2):?
(1) 網(wǎng)上一種解決方法(但我的 extenal 目錄中沒有 clearsilver 目錄(有人說此方法適用于: Android 2.3))
是由于clearsilver在編譯時(shí)如果檢測(cè)到使用Java JDK 6,就使用64位編譯。要避開此錯(cuò)誤,需要修改下面四個(gè)文件:?
external/clearsilver/cgi/Android.mk?
external/clearsilver/java-jni/Android.mk?
external/clearsilver/util/Android.mk?
external/clearsilver/cs/Android.mk?
把這四個(gè)Makefile中的下列語句注掉即可:?
# This forces a 64-bit build for Java6?
# Comment by Easwy?
# LOCAL_CFLAGS += -m64?
# LOCAL_LDFLAGS += -m64?
然后在external/clearsilver目錄中執(zhí)行一下make clean,然后回到項(xiàng)目根目錄,繼續(xù)make即可。
(2) make clear/make update-api/make
(3) make: *** [out/target/common/docs/doc-comment-check-timestamp] 錯(cuò)誤 45
解決方法:需要做個(gè)鏈接如下:
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/jar /bin/jar
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/java /bin/java
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/javac /bin/javac
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/javah /bin/javah
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/javadoc /bin/javadoc
錯(cuò)誤:
prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-ar: out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a: No space left on device
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a] 錯(cuò)誤 1
make: *** 正在刪除文件“out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a”
原因: 空間不足導(dǎo)致編譯中斷
掛載一個(gè) 20G 的空分區(qū),重新解壓 android4.0.tar.gz: tar -zxvf android4.0.tar.gz
make installclean
make clean
make update-api
source build/envsetup.sh
make -j2
錯(cuò)誤:
nd/m_demangle/cplus-dem.c:2865: error: undefined reference to 'vgPlain_strcspn'
prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: out/target/product/generic/obj/STATIC_LIBRARIES/libcoregrind-arm-linux_intermediates/libcoregrind-arm-linux.a(cplus-dem.o): in function gnu_special:external/valgrind/main/coregrind/m_demangle/cplus-dem.c:2926: error: undefined reference to 'vgPlain_strpbrk'
collect2: ld returned 1 exit status
make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/cachegrind-arm-linux_intermediates/LINKED/cachegrind-arm-linux] 錯(cuò)誤 1
原因: 沒有執(zhí)行 lunch?
錯(cuò)誤:?
target StaticLib: libwebcore (out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a)
prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-ar: out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a: No space left on device
make: *** [out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a] 錯(cuò)誤 1
make: *** 正在刪除文件“out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a”
/usr/bin/ld: final link failed: No space left on device
collect2: ld returned 1 exit status
make: *** 正在等待未完成的任務(wù)....
make: *** [out/host/linux-x86/obj/lib/libbcc.so] 錯(cuò)誤 1
掛載一個(gè) 20G 的空分區(qū)后編譯 ?Android 4.0.1 的源代碼,仍然出現(xiàn): No space left on device。所以一狠心,將現(xiàn)在用的 Ubuntu 虛擬機(jī)刪除了,重建一個(gè) 80G 的虛擬機(jī)。
使用 Ubuntu 10.04,安裝后不做任何升級(jí)。
以下是操作過程中對(duì)硬盤剩余空間的記錄:?
(1) 80G 安裝 Ubuntu 后剩余 69.7 GB
(2) 復(fù)制 android4.0.tar.gz 和 jdk-6u45-linux-i586.bin 后,解壓: tar -zxvf android4.0.tar.gz 后剩余 61.4 GB
(3)準(zhǔn)備好編譯環(huán)境后(刪除 android4.0.tar.gz 和 jdk-6u45-linux-i586.bin),剩余空間 62.9 GB
開始編譯 Android 4.0.1 源代碼。
如果編譯過程中出現(xiàn)錯(cuò)誤,只要編譯環(huán)境的配置是正確的,就不要試著去解決它。只需要簡(jiǎn)單的重新編譯即可!編譯成功后,剩余的空間是 51.1 GB。
編譯 Android 4.0.1 源代碼,至少需要 18.6G 的硬盤空間。
編譯成功結(jié)束時(shí)的 LOG:?
Target system fs image: out/target/product/tuna/obj/PACKAGING/systemimage_intermediates/system.img
in mkuserimg.sh PATH=out/host/linux-x86/bin/:/usr/lib/jvm/java-6-sun/bin:/usr/lib/jvm/jdk1.6.0_45/bin:/usr/lib/jvm/jdk1.6.0_45/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/leozheng/android4.0/out/host/linux-x86/bin:/home/leozheng/android4.0/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin:/home/leozheng/android4.0/development/emulator/qtools:/home/leozheng/android4.0/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin:/home/leozheng/android4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
make_ext4fs -s -l 685768704 -a system out/target/product/tuna/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/tuna/system
Creating filesystem with parameters:
? ? Size: 685768704
? ? Block size: 4096
? ? Blocks per group: 32768
? ? Inodes per group: 6976
? ? Inode size: 256
? ? Journal blocks: 2616
? ? Label:?
? ? Blocks: 167424
? ? Block groups: 6
? ? Reserved block group size: 47
Created filesystem with 904/41856 inodes and 41089/167424 blocks
Install system fs image: out/target/product/tuna/system.img
out/target/product/tuna/system.img+out/target/product/tuna/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p total size is 159017016
啟動(dòng)編譯后的 Android 4.0.1 模擬器
leozheng@ubuntu:~$ ls
android4.0 ?Documents ?examples.desktop ?Pictures ?Templates
Desktop ? ? Downloads ?Music ? ? ? ? ? ? Public ? ?Videos
leozheng@ubuntu:~$ cd android4.0/out/host/linux-x86/bin
按網(wǎng)上的說明,要進(jìn)入 sdk 目錄。但此目錄不存在,會(huì)提示 bash: cd: sdk: No such file or directory
leozheng@ubuntu:~/android4.0/out/host/linux-x86/bin$ ls
......
leozheng@ubuntu:~/android4.0/out/host/linux-x86/bin$ ls em*
emulator ?emulator-arm ?emulator-ui ?emulator-x86
leozheng@ubuntu:~/android4.0/out/host/linux-x86/bin$ ./emulator
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 '@