首頁 > 軟體

Ubuntu 16.04下編譯Android 6.0原始碼

2020-06-16 17:14:26

作為一名合格的Android開發人員,怎麼能不會編譯android原始碼呢!一定要來一次說編譯就編譯的旅程,否則你的人生是不完整的!生氣好,那麼我們進入正題!

本次編譯環境採用Ubuntu 16.04 LTS,Android原始碼選擇Android6.0!官方建議採用Ubuntu 14.04版本,主要是我剛開始沒在意系統版本,然後就直接下載安裝16.04版本了,然後也懶得換了,所以就選擇了這個版本,下面我們進入正題。

一、搭建Ubuntu環境。

去Ubuntu官網下載系統映象,虛擬機器可以用VMware Fusion,當然也可以用virtual box等等,可以參考 http://www.linuxidc.com/Linux/2015-08/121807.htm

系統裝好之後就是設定java環境,本人親測,Oracle JDK8和open JDK9無法編譯,這兩個坑大家一定要注意....編譯的時候報錯提示使用open jdk 1.7.x....好,那麼java環境就是open jdk1.7了,這個坑大家就不要踩了...

openjdk1.7的安裝命令:

01. $ sudo add-apt-repository ppa:openjdk-r/ppa   
02. $ sudo apt-get update   
03. $ sudo apt-get install openjdk-7-jdk

不要忘了環境變數的設定,如果java -version可以檢視到當前的版本資訊,說明環境就設定好了。

二、下載系統原始碼

原始碼的下載網上有很多是說用git+repo方式下載的,但是很多請求都已經無法存取了...牆的強大是無法直視的,所以我選擇了放棄。

Android 6.0原始碼下載地址: http://www.linuxidc.com/Linux/2016-01/127285.htm

全部下載下來大概7個G左右,下載完了之後需要合併資原始檔,總共10個資原始檔,其中有個hash.txt是用來驗證md5資訊的,可以選擇忽略。將下載下來的這10個檔案放到統一資料夾裡,然後在命令列裡進入此資料夾,執行命令cat Android6_r1_*>android6.tgz

執行成功後你會發現當前資料夾裡已生成android6.tgz壓縮包,解壓後即可得到android6.0的原始碼。好,下面我們就進入原始碼編譯環節

三、編譯原始碼的依賴設定

ubuntu12/14/16所需要的依賴包都是不同的,版本不對應的話依賴包是安裝不成功的。

命令如下:

sudo apt-get install git-core gnupg flex bison gperf build-essential

zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386

lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache

libgl1-mesa-dev libxml2-utils xsltproc unzip m4

四、開始編譯

命令列裡進入原始碼目錄,然後執行以下命令:

$ source build/envsetup.sh 

$ lunch aosp_arm-eng 

$ make -j8 (這裡的數位是根據系統設定來的,比如2核2執行緒的就可以選擇j4,數位越高編譯越快,前提你的電腦硬體要支援。。。)

然後就進入漫長的原始碼編譯了...由於我在編譯的過程中遇到了很多坑,所以整天都在編譯。。。睡覺前大概是11點我選擇了最後一次嘗試。。。然後就睡覺了,醒來的時候發現終於編譯成功了,一行希望的綠色提示如下:

### makecompleted successfully (05:08:19 (hh:mm:ss))###

五、編譯過程中遇到的錯誤。這裡一定要看!

1

make:***[out/host/linux-x86/obj/lib/libart.so]Error 1,如下圖:

libart.so'serror

解決方法:

編譯之前建議先修改原始碼檔案裡的此檔案:art/build/Android.common_build.mk裡的內容

ART_HOST_CLANG := false
 ifneq ($(WITHOUT_HOST_CLANG),true)
  # By default, host builds use clang for better warnings.
  ART_HOST_CLANG := true
 endif


修改為

ART_HOST_CLANG := false
 ifeq ($(WITHOUT_HOST_CLANG),false)
  # By default, host builds use clang for better warnings.
  ART_HOST_CLANG := true
 endif

2

make: *** [out/target/common/docs/api-stubs-timestamp] 錯誤 45

解決辦法:

make clean

make update-api

make

3
編譯完成後直接emulator即可執行剛編譯成功的系統,但是我們退出當前命令列之後,再重新進來使用此命令會報找不到此命令的錯誤

解決方法:

進入原始碼目錄

source
 build/envsetup.sh

lunchaosp_arm-eng

然後就可以執行emulator了

六、總結

本次編譯總體來說還是順利的,一天的時間就搞定了,主要是我這網速快,下載系統映象和andorid原始碼都是兩三M每秒,書寫此文的目的在於記錄自己本次的經歷,也希望能給想研究系統編譯的人一點幫助!

Ubuntu 16.04 安裝 openjdk 1.7 

由於編譯Android原始碼需要openjdk1.7.X版本。ubuntu 16.04自帶openjdk為1.8.X版本。

sudo apt-get install openjdk-7-jre 或者sudo apt-get install openjdk-7-jdk

如果出現

沒有可用的軟體包 openjdk-7-jdk,但是它被其它的軟體包參照了。

這可能意味著這個缺失的軟體包可能已被廢棄, 或者只能在其他發布源中找到 

E: 軟體包 openjdk-7-jdk 沒有可安裝候選

可以按照一下操作安裝1.7.X版本

sudo add-apt-repository ppa:openjdk-r/ppa 
sudo apt-get update 
sudo apt-get install openjdk-7-jdk

如果安裝成功之後還是不能用可能不有多個版本,選的不對
sudo update-alternatives --config java
sudo update-alternatives --config javac
選出正確的版本

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-05/144071.htm


IT145.com E-mail:sddin#qq.com