Ubuntu(16.0.4)上編譯android8.1源碼(資料最全版本)


首先,安裝linux系統,我們需要一個虛擬機,然后再把linux系統安裝到虛擬機上。才完成一個能正常運行和工作的環境。
為什么選擇ubuntu版本的linux系統?
總所周知,Linux有非常多的發行版本,從性質上划分,大體分為由商業公司維護的商業版本與由開源社區維護的免費發行版本。
不同Linux版本系統選擇:
Debian:一般來說Debian作為適合於服務器的操作系統,它比Ubuntu要穩定得多。開源資料少

Ubuntu:Ubuntu是一個以桌面應用為主的Linux操作系統 (因此linux系統,是支持桌面操作的)

它的圖形界面固然漂亮,但這也決定了它最佳的應用領域是桌面操作系統而非服務器操作系統。最受歡迎,適合桌面操作

CentOS:你會發現非常多的商業公司部署在生產環境上的服務器都是使用的CentOS系統。主要用在公司服務器上。

**總結:**如果裝在自己電腦中而不是服務器的話,就要選擇桌面操作的ubuntu系統。如果安裝到服務器,需要選擇centos版本的linux系統

必備軟件

Repo:android源碼同步工具
Ubuntu系統:16.0.4,默認安裝了Python2.7和3.5
python:版本大於3.6及以上,注意:2.7版本的python一定要保留,源碼編譯需要用2.7版本的python
android系統:自己選擇android版本 android-8.1.0_r1 參考附錄資料
jack-server:源碼編譯過程會自動啟動jack-server服務器。手動啟動(jack-admin start-server)

 

 

配置文件:
1,/etc/profile :全局配置文件路徑,配置了openjdk路徑,python路徑
2, ~/.bashrc 同上(當前用戶配置文件路徑,配置全局,就不用配置當前用戶了) export REPO_URL=‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/’
3,.repo/manifests.git/config :android源碼下載路徑配置文件,用於提高repo sync 源碼同步速度
4, /etc/apt/sources.list : 可以添加一些國內鏡像地址 ,用於提高apt-get install 安裝軟件包的速度
5,etc/hosts :域名映射地址。暫時不需要改動
jack-server服務器
sourcecode/prebuilts/sdk/tools/jack-admin文件 :配置jack-server
git配置文件:
~/.gitconfig 里面就是配置過的git 郵箱和用戶名信息
**

硬件:

**
虛擬機內存:運行內存最好超過8G(13G左右,條件可以16G都行),磁盤內存至少250G,然后分配給jack-server內存8G左右用於編譯android 系統,13G考慮因素:正常打開虛擬機,保證虛擬機運行內存大概是2G左右。然后分配8G給jack-server編譯。
增加jack-server內存:
修改源碼目錄下的 prebuild/sdk/tools/jack-admin文件

JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME” # 改成下面這行,增加java堆大小。

JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx8000M -cp $LAUNCHER_JAR $LAUNCHER_NAME”
4096編譯失敗了,改成7000M試下,內存大小可以自己調整

正式篇章

ubuntu系統Android源碼編譯流程
1,安裝虛擬機 (本地虛擬機文件:G:\VMware-workstation-full-12.1.0-3272444.exe)
2,在虛擬機安裝ubuntu系統(16.0.4,默認安裝了Python2.7和3.5) 路徑:G:\ubuntu-16.04.6-desktop-amd64.iso
3,在系統上安裝OpenJDK環境 (源碼編譯:OpenJDK支持,但JDK不支持)
首先移除ubuntu自帶的openJDK,命令:sudo apt-get purge openjdk*
如果ubuntu系統版本是Ubuntu16.0.4 及以上,則可以直接命令安裝:
sudo apt-get update
sudo apt-get install openjdk-8-jdk
安裝后,輸入命令java -version 查看是否安裝成功。
然后配置環境變量:1,先確認安裝的OpenJDK路徑(sudo update-alternatives --config java)2;確認環境變量是否配置。如果是全局環境變量:vim /etc/profile; 配置完成后,source /etc/profile 使環境變量生效
4,安裝各種包
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
5,安裝repo 和下載Android源碼
安裝repo,參考下面的 linux–Repo的介紹與安裝和Android源碼下載
源碼下載: 需要借助repo工具,google用repo工具實現git類似的功能,具體如下:
…/bin/repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r1 //指定下載分支
…/bin/repo sync //repo放在bin目錄下,相當於git clone下載源碼,可以-j4 開啟線程同步
6,編譯源碼
初始化環境,命令:執行envsetup.sh 這個腳本
source build/envsetup.sh
然后選擇編譯的目標模式,有3種可選,分別是
user :用戶模式,限制最多,如果編譯作為上市產品,那么就用這種模式,此模式就像是是正常的手機ROM那樣,沒有root權限,默認關閉了各種打印
userdebug :提供了root權限,也可以進行debug,適合內測。
eng 基本上開放了全部權限,而且還帶了一些額外的debug工具,開發階段當然選擇此模式了。一般選擇eng編譯模式
lunch ,設置編譯的平台。一般選擇:aosp_arm64-eng (或lunch aosp_arm-eng:32位操作系統)
然后設定編譯線程數量且真正開始編譯,這里的-j4參數,這里是整個系統編譯

 

 

make -j4
系統編譯完成后,我們才能單獨編譯某個模塊,也可以直接啟動模擬器,檢查系統編譯后的效果

mm 或mmm packages/apps/Launcher2/
7,啟動模擬器
系統編譯完成后,就啟動虛擬機,在虛擬機上安裝的就是剛編譯的系統了。
source build/envsetup.sh
lunch (選擇剛才你設置的目標版本,比如這里了我選擇的是2)
emulator

linux–Repo的介紹與安裝和Android源碼下載

1、在用戶目錄(/home/zhenglin/)下創建 AndroidSource 文件夾 mkdir AndroidSource ,然后進入AndroidSource 目錄,在該目錄下創建bin文件夾 mkdir bin
2、配置為臨時環境變量(參考:設置環境變量的三種方法) PATH=/home/zhenglin/AndroidSource/bin:$PATH
3、下載repo,git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo 得到一個git-clone的文件夾
4、將git-repo中的repo文件復制到 1 創建的bin目錄中 然后就可以刪除git-repo這個文件夾了
5、對repo增加權限 chmod a+x ~/AndroidSource/bin/repo 目的可以用repo命令
6、在/home/zhenglin/AndroidSource 目錄下mkdir sourceCode ,然后在sourceCode目錄下 輸入如下命令
repo init -u xxxxxxxxx -b xxxx
下載源碼文件:
//# 末尾加了–depth=1會快很多 因為這樣他不會把歷史的代碼記錄給從頭到尾克隆過來(只克隆最新一次提交記錄),但是不建議這樣
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-8.1.0_r1 --depth=1
下載源碼的地址:

google地址:repo init -u https://android.googlesource.com/platform/manifest -b android-8.0.0_r34 --depth=1 谷歌下載地址國內下載非常慢而且還可能連接失敗
國內鏡像地址:
1,repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-4.0.1_r1
下載源碼過程,有些文件可能會下載失敗。可以單獨對某些模塊 直接更新。例如:更新package/apps/Launcher2.直接輸入repo sync package/apps/Launcher2 。repo sync 后面直接帶路徑,表示同步這個路徑下的模塊
備注:如果第二步環境變量沒起作用,將repo改為 …/bin/repo
7、開始同步,-j 設置多個線程同步,不會有影響
repo sync -j20 在這一步 可以看到源碼在下載了。第一次repo sync會下載所有源碼。如果不是第一次,則會斷點續傳,下載過的不再重新下載,
源碼下載成功會提示:
repo sync has finished successfully.

SDK編譯

SDK的編譯和模塊編譯非常相似,其命令如下:

首先是初始化編譯環境: source build/envsetup.sh

接下來是設定編譯目標 :lunch sdk-eng

最后通過以下命令編譯SDK : make sdk

 

 

編譯完成,在out/host/linux-x86/sdk,看到sdk文件了。
編譯后文件生成目錄:
android.jar:/out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar
linux環境系統文件:./out/host/linux-x86/sdk/sdk/android-sdk_eng.root_linux-x86.zip

模塊編譯

除了通過make命令編譯可以整個android源碼外,還可以用mm,mmm命令。

1,首先要在源碼根目錄下初始化編譯環境(source build/evensetup.sh),例如我的源碼根目錄:home/zhenglin/AndroidSource/sourceCode/

1
  目的:將envsetup.sh里的所有用到的命令加載到環境變量里去

2,然后選擇編譯目標(lunch 8或者lunch aosp_arm64-eng),

3,再進入對應的模塊代碼下輸入mm命令 或者mmm 模塊路徑

系統編譯


第一次下載完成后,一定要直接編譯整個系統
在源碼根目錄,make -j4 注意:make -j8指定線程過多,可能導致編譯失敗

Python3.8.1更新升級

1,下載python(附件中),可以直接下載到電腦中,然后拖動到虛擬機上,(目錄:home/zhenglin/)然后解壓。
2,解壓:tar zxvf Python-3.8.1.tgz 得到 Python-3.8.1文件夾,然后進入該目錄: cd Python-3.8.1
3,創建安裝目錄,mkdir /usr/local/python3.8/
4,配置安裝路徑:./configure --prefix=/usr/local/python3.8
4,安裝:make
5,編譯: make install
6,安裝完成后,運行make clean:刪除臨時的無效文件。
7,建立Python3的軟鏈接
安裝完成后,建立軟連接。如果/usr/bin/python3連接已經存在了,則刪掉python3,然后再輸入如下命令:
ln -s /usr/local/python3.8/bin/python3 /usr/bin/python3
ln -s /usr/local/python3.8/bin/pip3 /usr/bin/pip3
注意:bin后面是python3。自己沒注意一直寫bin/python3.8
8,檢驗:輸入python3檢查python版本是否更新,輸入pip3看是否正常
輸入python,確認python的指向。如果不是最新安裝的,需要切換python連接。
切換python:

設置優先級, 數值越大, 優先級越高。優先級高 ,系統會自動選擇優先級高的python

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150

9,python環境變量配置
將安裝的python路徑:/usr/local/python3.8/bin加入PATH(在/etc/profile文件下 添加)
最后,輸入python3和python驗證版本是否更新,將python和python3的軟鏈接都最終指向最終升級后的python版本。

編譯過程遇到的問題:

問題1:python文件報錯,
[ 0% 1/89331] build out/target/common/obj/all-event-log-tags.txt
FAILED: out/target/common/obj/all-event-log-tags.txt
/bin/bash -c “build/tools/merge-event-log-tags.py -o out/target/common/obj/all-event-log-tags.txt
frameworks/base/core/java/android/app/admin/SecurityLogTags.logtags frameworks/base/core/java/android/content/EventLogTags.logtags
frameworks/base/core/java/android/net/EventLogTags.logtags frameworks/base/core/java/android/speech/tts/EventLogTags.logtags
frameworks/base/core/java/android/webkit/EventLogTags.logtags frameworks/base/core/java/com/android/internal/logging/EventLogTags.logtags
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/EventLogTags.logtags frameworks/base/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
frameworks/base/services/core/java/com/android/server/EventLogTags.logtags frameworks/base/services/core/java/com/android/server/am/EventLogTags.logtags
frameworks/ex/common/java/com/android/common/GoogleLogTags.logtags frameworks/native/services/surfaceflinger/EventLog/EventLogTags.logtags
frameworks/opt/telephony/src/java/com/android/internal/telephony/EventLogTags.logtags packages/apps/QuickSearchBox/src/com/android/quicksearchbox/EventLogTags.logtags
packages/apps/Settings/src/com/android/settings/EventLogTags.logtags packages/apps/TimeZoneUpdater/src/main/com/android/timezone/updater/EventLogTags.logtags
packages/providers/CalendarProvider/src/com/android/providers/calendar/EventLogTags.logtags packages/providers/ContactsProvider/src/com/android/providers/contacts/EventLogTags.logtags
packages/services/Telephony/src/com/android/phone/EventLogTags.logtags system/bt/main/…/EventLogTags.logtags system/core/liblog/event.logtags
system/core/libsysutils/EventLogTags.logtags system/core/logcat/event.logtags system/core/logd/event.logtags system/core/storaged/EventLogTags.log
tags”
File “build/tools/merge-event-log-tags.py”, line 51
except getopt.GetoptError, err:
^
SyntaxError: invalid syntax
[ 0% 6/89331] Ensuring Jack server is installed and started
Jack server already installed in “/root/.jack-server”
Server is already running
ninja: build stopped: subcommand failed.
15:18:11 ninja failed with: exit status 1
原因:python解析器出錯,源碼編譯用python2,不能用python3編譯源碼 (下載源碼:要用python3.6以上,才能下載源碼成功)
解決方案:將python改成ubuntu系統自帶的python2.7,不能用python3.6以上的編譯。
查看python的軟連接:
查看python的軟連接:
cd /usr/bin/
ll |grep python
可以看到python python2 python3等軟連接指向。
然后,修改popython2 python3的優先級。保證python指向優先級高的
如下,將popython2的優先級提高,從而讓python指向python2

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 150
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100

問題2:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 151: ordinal not in range(128)
錯誤原因:google用python3工具同步源碼。而我虛擬機的python版本沒有升級到3.6版本以上導致。
解決方案:安裝python3.6以上的版本。然后設置python3為默認版本才能同步源碼。
注意:python2.7系統自帶的版本不建議刪除,因為有些系統命令還是會用

問題3:Only an OpenJDK based JDK is supported:
意思:只有基於JDK的OpenJdk是支持源碼編譯的。所以需要安裝OpenJDK

問題4:/usr/bin/python 軟連接被刪除?
解決方案:copy -r /usr/bin/python2 /usr/bin/python ,目的就是將python2軟連接拷貝一份,重新命名為python。

如何配置軟連接?
用如下命令, ln -s /usr/local/python3/bin/python3 /usr/bin/python3
解釋:/usr/local/python3/bin/python3:代表的是真正的地址; /usr/bin/python3:代表的軟連接 我們直接用的命令也是直接用軟連接

問題5:編譯過程報錯信息:Build crash: ckati failed with: signal: killed
解決方案:增加虛擬機內存大小,至少8G

問題6:編譯時出現out of memory錯誤解決辦法
https://blog.csdn.net/u011784994/article/details/80990890
修改源碼目錄下的 prebuild/sdk/tools/jack-admin文件

JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME” # 改成下面這行,增加java堆大小。

JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx8000M -cp $LAUNCHER_JAR $LAUNCHER_NAME”
4096編譯失敗了,改成7000M試下,內存大小可以自己調整

問題7:Communication error with Jack server (56). Try ‘jack-diagnose’
ninja: build stopped: subcommand failed.
21:21:29 ninja failed with: exit status 1
build/core/main.mk:21: recipe for target ‘run_soong_ui’ failed
make: *** [run_soong_ui] Error 1
原因: prebuild/sdk/tools/jack-admin jack-server服務器沒有啟動。
解決方案:prebuild/sdk/tools/jack-admin start-server

問題8:FAILED: out/target/common/docs/api-stubs-timestamp
/bin/bash out/target/common/docs/api-stubs-timestamp.rsp
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c3f00000, 86507520, 0) failed; error=‘無法分配內存’ (errno=12)

 

There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 86507520 bytes for committing reserved memory. # An error report file with more information is saved as: # /home/zhenglin/AndroidSource/sourceCode/hs_err_pid6208.log

ninja: build stopped: subcommand failed.
21:44:24 ninja failed with: exit status 1
build/core/main.mk:21: recipe for target ‘run_soong_ui’ failed
make: *** [run_soong_ui] Error 1

直接將虛擬機RAM內存提高到13G,之前out of memory 也是和這個有關。虛擬機內存不足。
所以導致編譯多次失敗。

問題9:系統編譯過程中可能一次編譯會失敗。
可以重新 make -j8 編譯,它不會重復編譯

問題10:
FAILED: out/soong/.bootstrap/bin/soong_build out/soong/build.ninja
Outputs: out/soong/build.ninja
Error: exited with code: 1
Command: out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
Output:
fatal error: runtime: out of memory
原因:虛擬機運行內存不足導致。查看free -h 運行內存
解決方案:需要重啟虛擬機,或者手動kill占用內存的程序。

問題11:
development/build/sdk-linux-x86.atree:36: couldn’t locate source file: lib64/libaapt2_jni.so
development/build/sdk.atree:50: couldn’t locate source file: bin/dmtracedump
development/build/sdk.atree:51: couldn’t locate source file: bin/etc1tool
development/build/sdk.atree:81: couldn’t locate source file: bin/split-select
development/build/sdk.atree:86: couldn’t locate source file: bin/bcc_compat
development/build/sdk.atree:134: couldn’t locate source file: bin/apksigner
development/build/sdk.atree:135: couldn’t locate source file: framework/apksigner.jar
development/build/sdk.atree:138: couldn’t locate source file: bin/dx
development/build/sdk.atree:139: couldn’t locate source file: framework/dx.jar
development/build/sdk.atree:212: couldn’t locate source file: framework/layoutlib-legacy.jar
development/build/sdk.atree:456: couldn’t locate source file: system/app/EmulatorSmokeTests/EmulatorSmokeTests.apk
ninja: build stopped: subcommand failed.
01:15:15 ninja failed with: exit status 1
01:15:15 Unable to parse ninja entry “\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0011162\t13613\t0\tsetup-jack-server\t190b1380f220d49a”: strconv.Atoi: parsing “\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0011162”: invalid syntax

failed to build some targets (01:31 (mm:ss))

解析:
編譯失敗:
couldn’t locate source file:這個導致編譯失敗
Unable to parse ninja entry:報錯不會導致sdk編譯失敗。

couldn’t locate source file:都是無法在如下目錄找到
~/AndroidSource/sourceCode/out/host/linux-x86/
1,把所有找不到的文件或文件夾 拷貝到對應的目錄下,如果沒有就手動創建一個放到對應目錄下。然后再編譯

python 中 出現 invalid syntax
1、在使用篩選時使用等號:例如data[‘car’]==2data[‘car’]==2寫成data[‘car’]=2
2、換行時沒有使用換行符,直接回車換行

hangzhou =
zhewan_score_original[zhewan_score_original.城市 == ‘杭州市’]
File “”, line 1
hangzhou =
^
SyntaxError: invalid syntax
#正確
hangzhou =
zhewan_score_original[zhewan_score_original.城市 == ‘杭州市’]
換行:兩行是同一個聲明。句子太長換行,需要添加符號\

 

 

使用studio查看源碼的時候,如果不生成.ipr .iml文件,查看的Java文件是無法索引到其他的文件的,需要一個一個的搜索,很不方便,而.ipr .iml文件就可以解決這部分問題,
而且它還可以控制你需要查看源碼的內容,比如你不需要查看cpp庫,你就可以在.ipr文件中去除對應的文件夾,使你的studio可以更快的打開。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM