使用Android Studio導(dǎo)入Android系統(tǒng)源碼

以下是轉(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舷胜,一起剝皮案震驚了整個(gè)濱河市娩践,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烹骨,老刑警劉巖翻伺,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異展氓,居然都是意外死亡穆趴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門遇汞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)未妹,“玉大人簿废,你說(shuō)我怎么就攤上這事÷缢” “怎么了族檬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)化戳。 經(jīng)常有香客問(wèn)我单料,道長(zhǎng),這世上最難降的妖魔是什么点楼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任扫尖,我火速辦了婚禮,結(jié)果婚禮上掠廓,老公的妹妹穿的比我還像新娘换怖。我一直安慰自己,他們只是感情好蟀瞧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布沉颂。 她就那樣靜靜地躺著,像睡著了一般悦污。 火紅的嫁衣襯著肌膚如雪铸屉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天切端,我揣著相機(jī)與錄音彻坛,去河邊找鬼。 笑死帆赢,一個(gè)胖子當(dāng)著我的面吹牛小压,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椰于,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怠益,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乘综!你這毒婦竟也來(lái)了脱茉?” 一聲冷哼從身側(cè)響起悔雹,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘫镇,失蹤者是張志新(化名)和其女友劉穎线脚,沒(méi)想到半個(gè)月后祝迂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翰萨,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刹缝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年笛谦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抱虐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饥脑,死狀恐怖恳邀,靈堂內(nèi)的尸體忽然破棺而出懦冰,到底是詐尸還是另有隱情,我是刑警寧澤谣沸,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布刷钢,位于F島的核電站,受9級(jí)特大地震影響乳附,放射性物質(zhì)發(fā)生泄漏内地。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一赋除、第九天 我趴在偏房一處隱蔽的房頂上張望阱缓。 院中可真熱鬧,春花似錦举农、人聲如沸茬祷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至秸妥,卻和暖如春滚停,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粥惧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工键畴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人突雪。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓起惕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咏删。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惹想,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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