Android 4.0.1 原始碼編譯

來源:互聯網
上載者:User

標籤:

在學習應用編程時,為了實現應用在後台對其它介面的控制,需要將應用的許可權提高到系統級。
但提高到系統級的方法,其中一個就是放在 Android 原始碼目錄中進行編譯;另一個方法已經試過,但安裝失敗。
開始一直想直接從 Google 的網站上擷取 Android 原始碼,但由於大陸對 Google 的封鎖,導致無法擷取到。大家都通過 VPN 來擷取,但一般 VPN 是需要費用的。
後來才將擷取 Android 原始碼的方向轉向別人下載好,打包傳到網上的。
先後從 XX 雲端硬碟下載了 3 個 Android 原始碼壓縮包,分別是:
repo.tar.gz 12.2GB
WORKING_DIRECTORY.tar 12.4GB 
android4.0.tar.gz 1.73GB
前兩個還沒有使用過,先使用 android4.0.tar.gz 進行了實驗。

在 Ubuntu 中先解壓 android4.0.tar.gz: tar -zxvf android4.0.tar.gz

安裝 jdk-6u45-linux-i586.bin,從 Oracle 網站上下載,需要在 Oracle 註冊。
擷取 jdk-6u45-linux-i586.bin 下載網址的辦法: google "jdk-6u45-linux" 得到的第一個搜尋結果: 
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html
注意: 不用使用 Ubuntu 提供的 open-jdk 的版本。

安裝過程:
(1) 賦予執行許可權,在 terminal 中輸入: chmod a+x jdk-6u45-linux-i586.bin
(2) 解壓,在 terminal 中輸入: ./jdk-6u45-linux-i586.bin
(3) 建立 jvm 目錄,在 terminal 中輸入: sudo mkdir /usr/lib/jvm
(4) 移動解壓檔案,在 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) 檢驗,在 terminal 中輸入:java -version
結果應顯示: 
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
這裡要根據自己的安裝路徑對以上內容進行修改!重啟系統後java的環境就安裝好了。
注: vim 操作指令,(1) Insert 按鍵;(2) : ; (3)! ; (4) w/q

開始編譯 Android 原始碼,進入目錄: ~/AndroidSource/android4.0,依次輸入如下指令:
#make installclean
#make clean
#source build/envsetup.sh
#lunch 選擇版本號碼: 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編譯

如果出錯如下錯誤,按對應方法解決:
(1) Ubuntu bison:找不到命令
sudo apt-get install g++
(2) Ubuntu g++:找不到命令 
sudo apt-get install bison
(3) /usr/bin/ld: cannot find -lz
詳細資料如下:
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] 錯誤 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
可以繼續編譯。

錯誤1:
編譯過程中出現一次提示: 進程被殺掉的錯誤,並終止的現象。
當時沒有記錄具體的錯誤,重新編譯就 OK 了。
------重新執行: make -j2

錯誤2:
t_intermediates/src -api out/target/common/obj/PACKAGING/public_api.txt -nodocs
make: *** 正在等待未完成的任務....
make: *** [out/target/common/docs/api-stubs-timestamp] 錯誤 45
解決方案(使用方法2): 
(1) 網上一種解決方案(但我的 extenal 目錄中沒有 clearsilver 目錄(有人說此方法適用於: Android 2.3))
是由於clearsilver在編譯時間如果檢測到使用Java JDK 6,就使用64位編譯。要避開此錯誤,需要修改下面四個檔案: 
external/clearsilver/cgi/Android.mk 
external/clearsilver/java-jni/Android.mk 
external/clearsilver/util/Android.mk 
external/clearsilver/cs/Android.mk 
把這四個Makefile中的下列語句注掉即可: 
# This forces a 64-bit build for Java6 
# Comment by Easwy 
# LOCAL_CFLAGS += -m64 
# LOCAL_LDFLAGS += -m64 
然後在external/clearsilver目錄中執行一下make clean,然後回到項目根目錄,繼續make即可。
(2) make clear/make update-api/make
(3) make: *** [out/target/common/docs/doc-comment-check-timestamp] 錯誤 45
解決方案:需要做個連結如下:
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

錯誤:
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] 錯誤 1
make: *** 正在刪除檔案“out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a”
原因: 空間不足導致編譯中斷

掛載一個 20G 的空分區,重新解壓 android4.0.tar.gz: tar -zxvf android4.0.tar.gz
make installclean
make clean
make update-api
source build/envsetup.sh
make -j2

錯誤:
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] 錯誤 1
原因: 沒有執行 lunch 

錯誤: 
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] 錯誤 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: *** 正在等待未完成的任務....
make: *** [out/host/linux-x86/obj/lib/libbcc.so] 錯誤 1

掛載一個 20G 的空分區後編譯  Android 4.0.1 的原始碼,仍然出現: No space left on device。所以一狠心,將現在用的 Ubuntu 虛擬機器刪除了,重建一個 80G 的虛擬機器。
使用 Ubuntu 10.04,安裝後不做任何升級。
以下是操作過程中對硬碟剩餘空間的記錄: 
(1) 80G 安裝 Ubuntu 後剩餘 69.7 GB
(2) 複製 android4.0.tar.gz 和 jdk-6u45-linux-i586.bin 後,解壓: tar -zxvf android4.0.tar.gz 後剩餘 61.4 GB
(3)準備好編譯環境後(刪除 android4.0.tar.gz 和 jdk-6u45-linux-i586.bin),剩餘空間 62.9 GB
開始編譯 Android 4.0.1 原始碼。
如果編譯過程中出現錯誤,只要編譯環境的配置是正確的,就不要試著去解決它。只需要簡單的重新編譯即可!編譯成功後,剩餘的空間是 51.1 GB。
編譯 Android 4.0.1 原始碼,至少需要 18.6G 的硬碟空間。


編譯成功結束時的 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

啟動編譯後的 Android 4.0.1 模擬器
[email protected]:~$ ls
android4.0  Documents  examples.desktop  Pictures  Templates
Desktop     Downloads  Music             Public    Videos
[email protected]:~$ cd android4.0/out/host/linux-x86/bin
按網上的說明,要進入 sdk 目錄。但此目錄不存在,會提示 bash: cd: sdk: No such file or directory
[email protected]:~/android4.0/out/host/linux-x86/bin$ ls
......
[email protected]:~/android4.0/out/host/linux-x86/bin$ ls em*
emulator  emulator-arm  emulator-ui  emulator-x86
[email protected]:~/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 ‘@<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

[email protected]:~/android4.0/out/host/linux-x86/bin$ ./emulator list targets
invalid command-line parameter: list.
Hint: use ‘@foo‘ to launch a virtual device named ‘foo‘.
please use -help for more information
[email protected]:~/android4.0/out/host/linux-x86/bin$ ls an*
android
[email protected]:~/android4.0/out/host/linux-x86/bin$ android list targets
android: command not found
[email protected]:~/android4.0/out/host/linux-x86/bin$ ./android list targets
SWT folder ‘/home/leozheng/android4.0/out/host/linux-x86/framework/x86‘ does not exist.
Please export ANDROID_SWT to point to the folder containing swt.jar for your platform.
[email protected]:~/android4.0/out/host/linux-x86/bin$ export PATH=~/android4.0/out/host/linux-x86/bin:$PATH
[email protected]:~/android4.0/out/host/linux-x86/bin$ export ANDROID_PRODUCT_OUT=~/android4.0/out/target/product/generic
[email protected]:~/android4.0/out/host/linux-x86/bin$ emulator
emulator: ERROR: Can‘t access ANDROID_PRODUCT_OUT as ‘/home/leozheng/android4.0/out/target/product/generic‘
You need to build the Android system before launching the emulator
[email protected]:~/android4.0/out/host/linux-x86/bin$ cd ..
[email protected]:~/android4.0/out/host/linux-x86$ cd ..
[email protected]:~/android4.0/out/host$ cd ..
[email protected]:~/android4.0/out$ ls
casecheck.txt  CaseCheck.txt  host  target  versions_checked.mk
[email protected]:~/android4.0/out$ cd target/
[email protected]:~/android4.0/out/target$ ls
common  product
[email protected]:~/android4.0/out/target$ cd product
[email protected]:~/android4.0/out/target/product$ ls
tuna
[email protected]:~/android4.0/out/target/product$ cd tuna
[email protected]:~/android4.0/out/target/product/tuna$ ls
android-info.txt     kernel                    recovery.img
boot.img             obj                       root
clean_steps.mk       previous_build_config.mk  symbols
data                 ramdisk.img               system
fake_packages        ramdisk-recovery.img      system.img
installed-files.txt  recovery                  userdata.img
[email protected]:~/android4.0/out/target/product/tuna$ export ANDROID_PRODUCT_OUT=~/android4.0/out/target/product/tuna
[email protected]:~/android4.0/out/target/product/tuna$ emulator
模擬器啟動成功,運行中...

如果提示:
emulator: WARNING: system partition size adjusted to match image file (152 MB > 66 MB)
emulator: WARNING: data partition size adjusted to match image file (135 MB > 66 MB)
emulator: emulator window was out of view and was recentered
如果在筆記本(1280*800解析度)上用,skin的顯示地區太大,鍵盤部分可能顯示不全,給使用帶來不便

以下網上記錄的別人編譯 Android V4.0.1 時遇到的問題與解決方案: 
(*1) usr/bin/ld: cannot find libncurses.so.5 cannot find -lGL
sudo apt-get install git-core gnupg flex bison gperfbuild-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libsx11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-devg++-multilib
解決方案:
sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so

(*2)
host SharedLib: lib64EGL_translator (out/host/linux-x86/obj/lib/lib64EGL_translator.so)
 /usr/bin/ld: cannot find -lGL
 collect2: ld returned 1 exit status
 make: *** [out/host/linux-x86/obj/lib/lib64EGL_translator.so] Error 1
 make: *** Waiting for unfinished jobs....
解決方案:
sudo apt-get install libglu1-mesa-dev 

NDK 安裝
http://developer.android.com/tools/sdk/ndk/index.html
ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk$ ./android-ndk-r10c-darwin-x86_64.bin

(*3) 
 host SharedLib: lib64EGL_translator (out/host/linux-x86/obj/lib/lib64EGL_translator.so)
 /usr/bin/ld: cannot find -lGL
 collect2: ld returned 1 exit status
 make: *** [out/host/linux-x86/obj/lib/lib64EGL_translator.so] Error 1
 make: *** Waiting for unfinished jobs....
解決方案 :
sudo apt-get install libglu1-mesa-dev 

(*4) 
host StaticLib: libGLcommon (out/host/linux-x86/obj/STATIC_LIBRARIES/libGLcommon
 _intermediates/libGLcommon.a)
 host SharedLib: libGLES_CM_translator (out/host/linux-x86/obj/lib/libGLES_CM_tra
 nslator.so)
 /usr/bin/ld: cannot find -lGL
 collect2: ld returned 1 exit status
 make: *** [out/host/linux-x86/obj/lib/libGLES_CM_translator.so] Error 1
解決方案: 
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 /usr/lib/libGL.so 

Android 4.0.1 原始碼編譯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.