以下是轉(zhuǎn)載文章喂链,出自https://blog.csdn.net/turtlejj/article/details/83857897,感謝作者
使用Android Studio導(dǎo)入系統(tǒng)源碼
??????? 在這里我們默認(rèn)大家已經(jīng)下載好了Android系統(tǒng)的源代碼妥泉,關(guān)于如何下載椭微,網(wǎng)上有很多詳盡的教程,我這里就不再過(guò)多的贅述涛漂,不會(huì)的同學(xué)可以自行百度赏表。
??????? PS: 使用Android Studio導(dǎo)入系統(tǒng)源代碼需要對(duì)代碼進(jìn)行一定的編譯操作,如果有些同學(xué)使用的是Windows系統(tǒng)匈仗,可以嘗試在Cygwin下進(jìn)行編譯瓢剿,或者將在Linux下編譯生成的三個(gè)產(chǎn)物拷貝到Windows的源代碼根目錄下,也可以起到一樣的效果悠轩。
??????? 進(jìn)入正題间狂,在下載好代碼之后,我們需要對(duì)代碼進(jìn)行編譯操作火架,對(duì)于目前比較新的Android 8.0以及9.0版本鉴象,我這里推薦使用Ubuntu 16.04的版本進(jìn)行編譯,編譯過(guò)程中一般不會(huì)遇到什么問(wèn)題 (使用Ubuntu 18.04的話何鸡,可能會(huì)遇到一些坑纺弊,我在《Ubuntu 18.04 編譯安卓系統(tǒng)源碼 及 adb連接手機(jī)遇到的問(wèn)題詳解》里列舉了所有我遇到的問(wèn)題以及解決方法,有需要的同學(xué)可以參考)骡男。
??????? 這里需要執(zhí)行以下四條命令:
??????? 1. "source build/envsetup.sh" (source可以用 . 代替淆游,即". build/envsetup.sh")
??????? 2. "lunch",并選擇要編譯的項(xiàng)目
??????? 3. "make idegen -j4" (這里的 -j4 表示用4線程來(lái)編譯,可以不加)
??????? 4. "sudo development/tools/idegen/idegen.sh" (我的電腦需要管理員權(quán)限才能執(zhí)行成功犹菱,所以我一般會(huì)在前面加上"sudo")
??????? 下面進(jìn)行分布講解:
??????? 1. 進(jìn)入系統(tǒng)源碼的根目錄(即可以看到frameworks拾稳、kernel等等文件夾的那一級(jí)目錄),執(zhí)行". build/envsetup.sh"命令:
xxxxxx@xxxxxx-Ubuntu:~/code/android$ . build/envsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/qcom/common/vendorsetup.sh
including vendor/qcom/proprietary/common/vendorsetup.sh
including sdk/bash_completion/adb.bash
??????? 2. 而后腊脱,繼續(xù)執(zhí)行"lunch"命令访得,并選擇你想要編譯的那個(gè)項(xiàng)目,這里我選了2陕凹,即編譯 aosp_arm64-eng:
xxxxxx@xxxxxx-Ubuntu:~/code/android$ lunch
You're building on Linux
Lunch menu... pick a combo:
? ? 1. aosp_arm-eng
? ? 2. aosp_arm64-eng
? ? 3. aosp_mips-eng
? ? 4. aosp_mips64-eng
? ? 5. aosp_x86-eng
? ? 6. aosp_x86_64-eng
Which would you like? [aosp_arm-eng] 2
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=8.1.0
TARGET_PRODUCT=aosp
TARGET_BUILD_VARIANT=arm64-eng
TARGET_BUILD_TYPE=release
TARGET_PLATFORM_VERSION=OPM1
TARGET_BUILD_APPS=
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=kryo300
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv7-a-neon
TARGET_2ND_CPU_VARIANT=cortex-a9
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.15.0-38-generic-x86_64-with-Ubuntu-18.04-bionic
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=OPM1.171019.026
OUT_DIR=out
AUX_OS_VARIANT_LIST=
============================================
??????? 3. 前面兩步是對(duì)編譯環(huán)境進(jìn)行配置悍抑,接下來(lái)執(zhí)行"make idegen -j4",并等待(屏幕會(huì)輸出很多l(xiāng)og捆姜,這里只貼出最后部分):
xxxxxx@xxxxxx-Ubuntu:~/code/android$ make idegen -j4
......
[100% 765/765] Install: out/host/linux-x86/framework/idegen.jar
#### make completed successfully (03:16 (mm:ss)) ####
??????? 4. 看到以上輸出以后传趾,執(zhí)行"sudo development/tools/idegen/idegen.sh",并繼續(xù)等待泥技,這個(gè)過(guò)程可能比較長(zhǎng)浆兰,不要著急
xxxxxx@xxxxxx-Ubuntu:~/code/android$ sudo development/tools/idegen/idegen.sh
[sudo] xxxxxx 的密碼:
Read excludes: 9ms
Traversed tree: 127108ms
??????? 完成以上四個(gè)步驟之后,會(huì)發(fā)現(xiàn)在源碼根目錄下出現(xiàn)了三個(gè)新的文件(也有可能是兩個(gè))
??????? 1. android.iml (記錄項(xiàng)目所包含的module珊豹、依賴關(guān)系簸呈、SDK版本等等,類似一個(gè)XML文件)
??????? 2. android.ipr (工程的具體配置店茶,代碼以及依賴的lib等信息蜕便,類似于Visual Studio的sln文件)
??????? 3. android.iws (主要包含一些個(gè)人的配置信息,也有可能在執(zhí)行上述操作后沒(méi)有生成贩幻,這個(gè)沒(méi)關(guān)系轿腺,在打開(kāi)過(guò)一次項(xiàng)目之后就會(huì)自動(dòng)生成了)
??????? "android.iml"和"android.ipr"一般是"只讀"的屬性,我們這里建議大家丛楚,把這兩個(gè)文件改成可讀可寫(xiě)族壳,否則,在更改一些項(xiàng)目配置的時(shí)候可能會(huì)出現(xiàn)無(wú)法保存的情況趣些,執(zhí)行如下兩條命令即可仿荆。
sudo chmod 777 android.iml
sudo chmod 777 android.ipr
??????? 如果你的電腦性能足夠好(內(nèi)存大于16G,代碼下載在SSD上)坏平,那么可以直接打開(kāi)Android Studio拢操,點(diǎn)擊"Open an existing Android Studio project"選項(xiàng),找到并選中剛剛生成的"android.ipr"文件舶替,點(diǎn)擊OK令境,就可以開(kāi)始導(dǎo)入項(xiàng)目了。 第一次導(dǎo)入顾瞪,這個(gè)過(guò)程可能會(huì)持續(xù)很久展父,幾十分鐘或者超過(guò)一個(gè)小時(shí)返劲。不過(guò)成功之后,以后再打開(kāi)項(xiàng)目就會(huì)快很多了栖茉。
??????? 如果電腦性能一般的話,我建議孵延,可以在導(dǎo)入項(xiàng)目前吕漂,手動(dòng)對(duì)"android.iml"文件進(jìn)行一下修改,可以使我們導(dǎo)入的時(shí)間盡可能的縮短一些尘应。
??????? 首先惶凝,要保證"android.iml"文件已經(jīng)添加了"可寫(xiě)入"的屬性(上文中已經(jīng)介紹了如何修改文件屬性)。
??????? 接下來(lái)犬钢,使用文本編輯器打開(kāi)"android.iml"文件苍鲜,并執(zhí)行以下修改(僅代表我的個(gè)人習(xí)慣,也可以根據(jù)同學(xué)們的喜好自己調(diào)整):
??????? 1. 搜索關(guān)鍵字"orderEntry"玷犹,我一般會(huì)將所有帶有這個(gè)關(guān)鍵字的標(biāo)簽項(xiàng)全部刪除混滔,僅保留以下三行,大概如下
......
? ? </content>
? ? <orderEntry type="sourceFolder" forTests="false" />
? ? <orderEntry type="inheritedJdk" />
? ? <orderEntryProperties />
? </component>
</module>
??????? 2. 搜索”excludeFolder“關(guān)鍵字歹颓,對(duì)這里進(jìn)行一些修改坯屿,將我們不需要看的代碼Exclude掉。通過(guò)這個(gè)步驟巍扛,能極大地提升第一次加載項(xiàng)目的速度领跛。
??????? 等項(xiàng)目加載完成后,我們還可以通過(guò)Android Studio對(duì)Exclude的Module進(jìn)行調(diào)整撤奸,所以也不用害怕這里Exclude掉了有用的代碼吠昭,或少Exclude了一部分代碼,在項(xiàng)目加載完以后再進(jìn)行調(diào)整就行了胧瓜。
??????? 以下是我的配置矢棚,大家可以參考(由于我比較關(guān)注Framework以及Telephony相關(guān)的代碼,所以重點(diǎn)保留了這兩部分贷痪,而其他一些如kernel幻妓、bootloader的代碼,我就Exclude掉了劫拢,同學(xué)們也可以根據(jù)自己的需求來(lái)進(jìn)行修改)肉津。
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/art" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/compatibility" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/developers/samples" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device/google" />
<excludeFolder url="file://$MODULE_DIR$/device/sample" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/flashing-files" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
<excludeFolder url="file://$MODULE_DIR$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/shortcut-fe" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
??????? 完成之后,按照上面說(shuō)的步驟舱沧,使用Android Studio選中"android.ipr"打開(kāi)項(xiàng)目即可妹沙。
優(yōu)化Android Studio的配置
??????? 在打開(kāi)系統(tǒng)源代碼后,我們還可以對(duì)Android Studio進(jìn)行一些配置熟吏,使得我們可以更好的進(jìn)行代碼閱讀距糖。
??? 1. Exclude不需要的代碼目錄
??????? 點(diǎn)擊"File -> Project Structure..."玄窝,中間的窗口選擇"android"(首字母小寫(xiě)的那一個(gè)),在彈出的窗口中左邊欄中選擇"Modules"悍引,而后在右邊的窗口中選擇"Sources"恩脂。在這里我們可以看到項(xiàng)目的所有代碼目錄,我們可以選中不需要的module趣斤,并點(diǎn)擊上面的"Excluded"按鈕俩块,當(dāng)被選中的目錄變?yōu)槌壬幢硎就瓿蒃xclude操作浓领;如果想要取消對(duì)某代碼目錄的Exclude操作玉凯,選中該目錄,再次點(diǎn)擊"Excluded"按鈕联贩,等待目錄變?yōu)樗{(lán)色即可漫仆。
??? 2. 選擇項(xiàng)目的SDK版本
??????? 點(diǎn)擊"File -> Project Structure...",中間的窗口選擇"android"(首字母小寫(xiě)的那一個(gè))泪幌,在彈出的窗口中左邊欄中選擇"Modules"盲厌,而后在右邊的窗口中選擇"Dependencies"。在下拉菜單中選擇系統(tǒng)源代碼相應(yīng)的SDK版本(如:8.0的代碼就選擇API 26座菠,9.0的版本就選擇API 28)狸眼。
??????? 如果在下拉菜單中沒(méi)有找到相應(yīng)的SDK版本,就打開(kāi)Android Studio自帶的SDK Manager下載即可浴滴。
??????? PS: 這步非常關(guān)鍵拓萌,如果這里不選擇Android API,而是使用JDK 1.8之類的話升略,無(wú)法進(jìn)行系統(tǒng)源碼的單步調(diào)試微王。
??? 3. 指定項(xiàng)目的minSdkVersion
??????? 在閱讀源代碼的時(shí)候,經(jīng)常會(huì)看到類似的這種錯(cuò)誤"Field requires API level xx (current min is 1): android.xx.xx"品嚣,這是由于我們只對(duì)項(xiàng)目指定了targetSdkVersion炕倘,但沒(méi)有指定minSdkVersion。
??????? 解決辦法如下:
??????? 點(diǎn)擊"File -> Project Structure..."翰撑,在彈出的窗口中左邊欄中選擇"Modules"罩旋,中間的窗口選擇"Android"(首字母大寫(xiě)的那一個(gè)),而后在右邊的窗口中選擇"Structure"眶诈。如下圖所示涨醋,將這三行配置改為你自己的代碼目錄即可(不一定非要使用這個(gè)AndroidManifest.xml文件以及res和assets目錄,你可以選擇你喜歡的任意一個(gè))逝撬,完成后點(diǎn)擊Apply或者OK浴骂。
??????? 接下來(lái),找到剛剛選擇的那個(gè)AndroidManifest.xml宪潮,打開(kāi)并在manifest標(biāo)簽下的任意一行添加如下代碼并保存即可
<uses-sdk android:minSdkVersion="26" />
???????? 這里的數(shù)字根據(jù)你源代碼的版本來(lái)填寫(xiě)溯警,比如你導(dǎo)入的是8.0的源代碼趣苏,就寫(xiě)26;9.0的源代碼就寫(xiě)28梯轻,以此類推食磕。由于是系統(tǒng)源代碼,所以minSdkVersion與前面第2步中設(shè)置的Android API版本保持一致即可喳挑。
??? 4. 增加打開(kāi)代碼文件的數(shù)量以及對(duì)代碼標(biāo)簽頁(yè)顯示的優(yōu)化
??????? Android Studio默認(rèn)只能打開(kāi)10個(gè)代碼文件芬为,且文件打開(kāi)多了以后顯示不開(kāi)的文件還會(huì)被隱藏,需要點(diǎn)擊最右邊的箭頭才能查看蟀悦。而最致命的是,如果不小心修改了某個(gè)文件氧敢,在標(biāo)簽頁(yè)上日戈,不會(huì)有任何的提示。
??????? 其實(shí)孙乖,我們可以通過(guò)修改設(shè)置改變這種情況浙炼,從而使得我們更好的閱讀代碼。
??????? 點(diǎn)擊"File -> Settings..."唯袄,在彈出的窗口中左邊欄中選擇"Editor -> General -> Editor Tabs"弯屈,而后在右邊的窗口中修改三個(gè)選項(xiàng):
??????? 1. 取消勾選"Show tabs in single row"??? ->?? 使得文件可以在多行進(jìn)行顯示,而不會(huì)被隱藏
??????? 2. 勾選"Mark modified tabs with asterisk"??? ->??? 在標(biāo)簽欄中恋拷,對(duì)被修改但尚未保存的文件加上一個(gè)星號(hào)進(jìn)行提示
??????? 3. 將"Tab limit"后面的數(shù)字修改為你希望最多同時(shí)打開(kāi)文件的數(shù)量资厉,比如"20"
??????? 修改后效果如下:
??????? 以上的修改,都是我在閱讀Android源代碼時(shí)遇到的不便蔬顾,因而總結(jié)出來(lái)的解決方法宴偿,希望能對(duì)大家有所幫助。
————————————————
版權(quán)聲明:本文為CSDN博主「二二的二姐夫」的原創(chuàng)文章诀豁,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議窄刘,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/turtlejj/article/details/83857897