Android13源碼下載和編譯過程詳解

前言

作為Android開發(fā)者人人都應(yīng)該有一份自己Android源碼,這樣我們就可以隨時對自己有疑惑的地方通過親手調(diào)試來加強理解

一 源碼下載

1.1 配置要求

官方推薦配置請參考:AOSP使用入門文檔,重點有如下幾項:

1.1.1 硬件配置要求

  1. 至少需要 250 GB 可用磁盤空間测僵;如果要進行構(gòu)建督怜,則還需要 150 GB。如果要進行多次構(gòu)建,則需要更多空間枣购。
  2. 磁盤至少 250GB剥汤,實測建議至少 512G。

1.1.2 軟件要求

推薦使用 Ubuntu 18.04 (Bionic Beaver)允睹、 Docker运准、Linux。
2021年6月22日起缭受,不再支持 Windows 或 MacOS 上構(gòu)建胁澳。
2020年1月1日起,不再支持 python2贯涎,請使用 python3听哭。

1.2 下載環(huán)境搭建

1.2.1 依賴安裝

請使用如下命令安裝相關(guān)依賴:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

執(zhí)行結(jié)果如下

longzhiye@longzhiye-laptop:~$ sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
正在讀取軟件包列表... 完成
正在分析軟件包的依賴關(guān)系樹       
正在讀取狀態(tài)信息... 完成       
......
升級了 0 個軟件包,新安裝了 114 個軟件包塘雳,要卸載 0 個軟件包陆盘,有 5 個軟件包未被升級。
需要下載 58.6 MB 的歸檔败明。
解壓縮后會消耗 262 MB 的額外空間隘马。
您希望繼續(xù)執(zhí)行嗎? [Y/n] y
......
python3 已經(jīng)是最新版 (3.6.7-1~18.04)妻顶。
python3 已設(shè)置為手動安裝酸员。
下列軟件包是自動安裝的并且現(xiàn)在不需要了:
  gir1.2-goa-1.0 gir1.2-snapd-1
使用'sudo apt autoremove'來卸載它(它們)蜒车。
升級了 0 個軟件包,新安裝了 0 個軟件包幔嗦,要卸載 0 個軟件包酿愧,有 5 個軟件包未被升級。

1.2.2 git配置

請使用如下命令對git進行配置:

git config --global user.name 'xxx'
git config --global user.email 'xxx@xxx.com'

執(zhí)行結(jié)果如下

longzhiye@longzhiye-laptop:~$ git config --global user.name 'longzhiye' 
longzhiye@longzhiye-laptop:~$ git config --global user.email 'longzhiye163@163.com'

1.2.3 repo配置

由于某墻的原因,這里我們采用國內(nèi)的鏡像源進行下載.
目前,可用的鏡像源一般是科大和清華的,具體使用差不多,這里我選擇清華大學(xué)鏡像進行說明.(參考:科大源,清華源)邀泉,請使用如下命令更新repo并進行配置:

mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod +x ~/bin/repo

執(zhí)行結(jié)果如下

longzhiye@longzhiye-laptop:~$ mkdir ~/bin
longzhiye@longzhiye-laptop:~$ PATH=~/bin:$PATH
longzhiye@longzhiye-laptop:~$ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 45805  100 45805    0     0   117k      0 --:--:-- --:--:-- --:--:--  117k
longzhiye@longzhiye-laptop:~$ chmod +x ~/bin/repo

1.3 源碼下載

1.3.1 明確下載版本

請通過瀏覽器訪問:分支列表嬉挡,來選取需要的版本。
網(wǎng)頁顯示如下:

1.3.2 替換為清華源

請使用如下命令將源替換為清華源:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

執(zhí)行結(jié)果如下

longzhiye@longzhiye-laptop:~$ export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

1.3.3 初始化倉庫并指定分支

請使用如下命令初始化倉庫并指定分支汇恤,此處以android-13.0.0_r40分支為例庞钢。

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r40

執(zhí)行結(jié)果如下:

longzhiye@longzhiye-laptop:~/mount/project$ mkdir androidt    // 建立下載位置
longzhiye@longzhiye-laptop:~/mount/project$ cd androidt/
longzhiye@longzhiye-laptop:~/mount/project/androidt$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r40
Downloading Repo source from https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/
remote: Enumerating objects: 4495, done.
remote: Counting objects: 100% (4495/4495), done.
remote: Compressing objects: 100% (2144/2144), done.
remote: Total 8060 (delta 3993), reused 2351 (delta 2351), pack-reused 3565
接收對象中: 100% (8060/8060), 3.81 MiB | 1016.00 KiB/s, 完成.
處理 delta 中: 100% (5177/5177), 完成.
repo: Updating release signing keys to keyset ver 2.3

Your identity is: longzhiye <longzhiye163@163.com>
If you want to change this, please re-run 'repo init' with --config-name

Testing colorized output (for 'repo diff', 'repo status'):
  black    red      green    yellow   blue     magenta   cyan     white 
  bold     dim      ul       reverse 
Enable color display in this user account (y/N)? y

repo has been initialized in /home/longzhiye/mount/project/androidt
longzhiye@longzhiye-laptop:~/mount/project/androidt$ ls -al
總用量 12
drwxrwxr-x 3 longzhiye longzhiye 4096 5月  20 00:48 .
drwxrwxrwx 3 root      root      4096 5月  20 00:44 ..
drwxrwxr-x 5 longzhiye longzhiye 4096 5月  20 00:48 .repo

1.3.4 同步全部源碼

初始化倉庫之后,就可以開始正式同步代碼到本地了,命令如下:

repo sync -c -j8

此處為了加快速度使用了-c參數(shù),表示只同步當(dāng)前分支因谎,-j8表示使用8個線程今天同步代碼基括,使用多少個線程請根據(jù)自己的機器配置自行修改。
(提示:一定要確定代碼完全同步了,不然在下面編譯過程出現(xiàn)的錯誤會讓你痛不欲生,不確定的童鞋可以多用repo sync同步幾次)

執(zhí)行結(jié)果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ repo sync -c -j8
Fetching: 100% (1135/1135), done in 4h51m48.506s
正在檢出文件: 100% (1972/1972), 完成.
正在檢出文件: 100% (1787/1787), 完成.
......
正在檢出文件: 100% (724/724), 完成.orm/system/keymaster正在檢出文件:  73% (534/724)   
Checking out: 100% (1135/1135), done in 44m21.860s
repo sync has finished successfully.

源碼同步時間比較長财岔,此時Android13源碼已經(jīng)同步完成风皿。

二 Android源碼編譯

2.1 編譯環(huán)境搭建

使用如下命令安裝JDK:

sudo apt-get install openjdk-11-jdk

安裝完成后可以使用如下命令查看是否按照成功:

longzhiye@longzhiye-laptop:javac -version
javac 11.0.17

2.2 全編譯

2.2.1 初始化編譯環(huán)境

執(zhí)行如下命令進行編譯環(huán)境初始化:

source build/envsetup.sh
或者:
. build/envsetup.sh

執(zhí)行結(jié)果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ source build/envsetup.sh

2.2.2 選擇構(gòu)建目標(biāo)

執(zhí)行l(wèi)unch命令執(zhí)行結(jié)果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ lunch

You're building on Linux

Lunch menu .. Here are the common combinations:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_barbet-userdebug
     4. aosp_bluejay-userdebug
     5. aosp_bluejay_car-userdebug
     6. aosp_bramble-userdebug
     7. aosp_bramble_car-userdebug
     8. aosp_car_arm-userdebug
     9. aosp_car_arm64-userdebug
     10. aosp_car_x86-userdebug
     11. aosp_car_x86_64-userdebug
     12. aosp_cf_arm64_auto-userdebug
     13. aosp_cf_arm64_phone-userdebug
     14. aosp_cf_x86_64_foldable-userdebug
     15. aosp_cf_x86_64_pc-userdebug
     16. aosp_cf_x86_64_phone-userdebug
     17. aosp_cf_x86_64_tv-userdebug
     18. aosp_cf_x86_auto-userdebug
     19. aosp_cf_x86_phone-userdebug
     20. aosp_cf_x86_tv-userdebug
     21. aosp_cheetah-userdebug
     22. aosp_cloudripper-userdebug
     23. aosp_coral-userdebug
     24. aosp_coral_car-userdebug
     25. aosp_flame-userdebug
     26. aosp_flame_car-userdebug
     27. aosp_oriole-userdebug
     28. aosp_oriole_car-userdebug
     29. aosp_panther-userdebug
     30. aosp_raven-userdebug
     31. aosp_raven_car-userdebug
     32. aosp_ravenclaw-userdebug
     33. aosp_redfin-userdebug
     34. aosp_redfin_car-userdebug
     35. aosp_redfin_vf-userdebug
     36. aosp_slider-userdebug
     37. aosp_sunfish-userdebug
     38. aosp_sunfish_car-userdebug
     39. aosp_trout_arm64-userdebug
     40. aosp_trout_x86-userdebug
     41. aosp_whitefin-userdebug
     42. aosp_x86-eng
     43. aosp_x86_64-eng
     44. arm_krait-eng
     45. arm_v7_v8-eng
     46. armv8-eng
     47. armv8_cortex_a55-eng
     48. armv8_kryo385-eng
     49. beagle_x15-userdebug
     50. beagle_x15_auto-userdebug
     51. car_ui_portrait-userdebug
     52. car_x86_64-userdebug
     53. db845c-userdebug
     54. gsi_car_arm64-userdebug
     55. gsi_car_x86_64-userdebug
     56. hikey-userdebug
     57. hikey64_only-userdebug
     58. hikey960-userdebug
     59. hikey960_tv-userdebug
     60. hikey_tv-userdebug
     61. poplar-eng
     62. poplar-user
     63. poplar-userdebug
     64. qemu_trusty_arm64-userdebug
     65. rb5-userdebug
     66. sdk_car_arm-userdebug
     67. sdk_car_arm64-userdebug
     68. sdk_car_portrait_x86_64-userdebug
     69. sdk_car_x86-userdebug
     70. sdk_car_x86_64-userdebug
     71. sdk_pc_x86_64-userdebug
     72. silvermont-eng
     73. uml-userdebug
     74. yukawa-userdebug
     75. yukawa_sei510-userdebug

Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): aosp_arm64-eng

Hint: next time you can simply run 'lunch aosp_arm64-eng'

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=13
TARGET_PRODUCT=aosp_arm64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.4.0-148-generic-x86_64-Ubuntu-18.04.6-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=TQ2A.230405.003.B2
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=device/generic/goldfish device/generic/goldfish-opengl hardware/google/camera hardware/google/camera/devices/EmulatedCamera
============================================

中間會有選擇需要構(gòu)建的目標(biāo),此處以aosp_arm64-eng為例

2.2.3 編譯固件

通過make指令進行代碼編譯,該指令通過-j參數(shù)來設(shè)置參與編譯的線程數(shù)量,以提高編譯速度.比如這里我們設(shè)置8個線程同時編譯使鹅。需要注意的是,參與編譯的線程并不是越多越好,通常是根據(jù)你機器cup的核心來確定:core2,即當(dāng)前cpu的核心的2倍.比如,我現(xiàn)在的筆記本是雙核四線程的,因此根據(jù)公式,最快速的編譯可以make -j8.
(通過
cat /proc/cpuinfo*查看相關(guān)cpu信息)

make -j8

執(zhí)行結(jié)果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ make -j8
07:04:26 ************************************************************
07:04:26 You are building on a machine with 15.5GB of RAM
07:04:26 
07:04:26 The minimum required amount of free memory is around 16GB,
07:04:26 and even with that, some configurations may not work.
07:04:26 
07:04:26 If you run into segfaults or other errors, try reducing your
07:04:26 -j value.
07:04:26 ************************************************************
build/make/core/soong_config.mk:209: warning: BOARD_PLAT_PUBLIC_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS instead.
build/make/core/soong_config.mk:210: warning: BOARD_PLAT_PRIVATE_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS instead.
============================================
PLATFORM_VERSION_CODENAME=REL
......
[ 99% 120038/120059] //frameworks/base/packages/SystemUI:SystemUI-core javac
注: 某些輸入文件使用或覆蓋了已過時的 API揪阶。
注: 有關(guān)詳細信息, 請使用 -Xlint:deprecation 重新編譯。
注: 某些輸入文件使用了未經(jīng)檢查或不安全的操作患朱。
注: 有關(guān)詳細信息, 請使用 -Xlint:unchecked 重新編譯鲁僚。
[ 99% 120044/120059] //frameworks/base/packages/SystemUI:SystemUI r8
Warning: Missing class android.compat.annotation.UnsupportedAppUsage (referenced from: void com.android.systemui.people.widget.PeopleBackupHelper.writeNewStateDescription(android.os.ParcelFileDescriptor))
[100% 120059/120059] Target vbmeta image: out/target/product/generic/vbmeta.img

#### build completed successfully (05:56:23 (hh:mm:ss)) ####

如果一切順利的化,在幾個小時之后,便可以編譯完成.看到### make completed successfully (00:48:15(hh:mm:ss)) ###表示你編譯成功了.。Google 使用 72 核機器裁厅,內(nèi)置 RAM 為 64 GB冰沙,完整構(gòu)建過程大約需要 40 分鐘(增量構(gòu)建只需幾分鐘時間,具體取決于修改了哪些文件)执虹。相比之下拓挥,RAM 數(shù)量相近的 6 核機器執(zhí)行完整構(gòu)建過程需要 3 個小時。

二 運行模擬器

在編譯完成之后,就可以通過以下命令運行Android虛擬機了,命令如下:

source build/envsetup.sh
lunch   // 選擇剛才你設(shè)置的目標(biāo)版本,比如這里了我選擇的是2
emulator

執(zhí)行結(jié)果如下:

longzhiye@longzhiye-laptop:~/mount/project/androidt$ source build/envsetup.sh
longzhiye@longzhiye-laptop:~/mount/project/androidt$ lunch
longzhiye@longzhiye-laptop:~/mount/project/androidt$ emulator

不出意外,在等待一會之后,你會看到運行界面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袋励,一起剝皮案震驚了整個濱河市侥啤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茬故,老刑警劉巖盖灸,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磺芭,居然都是意外死亡赁炎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門钾腺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徙垫,“玉大人讥裤,你說我怎么就攤上這事∫霰ǎ” “怎么了己英?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逗抑。 經(jīng)常有香客問我剧辐,道長,這世上最難降的妖魔是什么邮府? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮溉奕,結(jié)果婚禮上褂傀,老公的妹妹穿的比我還像新娘。我一直安慰自己加勤,他們只是感情好仙辟,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳄梅,像睡著了一般叠国。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戴尸,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天粟焊,我揣著相機與錄音,去河邊找鬼孙蒙。 笑死项棠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挎峦。 我是一名探鬼主播香追,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坦胶!你這毒婦竟也來了透典?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤顿苇,失蹤者是張志新(化名)和其女友劉穎峭咒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖圈,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡讹语,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜂科。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顽决。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡短条,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出才菠,到底是詐尸還是另有隱情茸时,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布赋访,位于F島的核電站可都,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚓耽。R本人自食惡果不足惜渠牲,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望步悠。 院中可真熱鬧签杈,春花似錦、人聲如沸鼎兽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谚咬。三九已至鹦付,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間择卦,已是汗流浹背敲长。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留互捌,地道東北人潘明。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像秕噪,于是被迫代替她去往敵國和親钳降。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容