AOSP Android 源碼

AOSP(Android Open Source Project)Android 開(kāi)源工程,是學(xué)習(xí) Android 源碼的大本營(yíng)。本章主要介紹三個(gè)部分:

  • 準(zhǔn)備編譯環(huán)境
  • 下載源碼
  • AndroidStudio 調(diào)試源碼

準(zhǔn)備編譯環(huán)境

可以直接參考 Android 源碼官網(wǎng) Requirement | Android Open Source Project,目前已完成中文版的翻譯箍铲。

安裝 OpenJDK

官網(wǎng)要求 Android 7.0 主分支需要使用 openJDK 8,

安裝Open JDK 8

sudo apt-get update
sudo apt-get install openjdk-8-jdk

如果主機(jī)還安裝了 Oracle JDK,需要將 OpenJDK 切換為默認(rèn) jdk 触机。

切換默認(rèn) JDK

sudo update-alternatives --config jave
sudo update-alternatives --config javac

安裝編譯源碼的依賴(lài)包

當(dāng)然,如果只要求看看源碼不需要編譯的朋友玷或,可以直接跳過(guò)此步驟儡首。

  1. Android 官網(wǎng)介紹 Ubuntu 14.04 需要的依賴(lài)包,如下:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zliblg-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
  1. 然而盲目相信官網(wǎng)就 Too young, too simple 了偏友,下面是 Ubuntu 16.04 實(shí)測(cè)需要的依賴(lài)包蔬胯。
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt-get install libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache

下載源碼

下載源碼主要分三個(gè)步驟:

  • 下載 Repo 工具
  • 下載源碼

下載 Git Repo 工具

根據(jù)總所周知的原因,不論是 Android 源碼還是 Google 提供的其他工具位他,在國(guó)內(nèi)訪(fǎng)問(wèn)的速度極慢氛濒。因此國(guó)內(nèi)各知名大學(xué)/公司提供了方便開(kāi)源軟件鏡像站。

下面為大家介紹的是清華大學(xué)開(kāi)源鏡像站棱诱。

Repo 介紹

Repo is a tool that we built on top of Git. Repo helps us manage the many Git repositories, does the uploads to our revision control system, and automates parts of the Android development workflow. Repo is not meant to replace Git, only to make it easier to work with Git in the context of Android. The repo command is an executable Python script that you can put anywhere in your path.

當(dāng)前 repo 主要用于同步 AOSP泼橘、chromium 及 chromium OS。

下載

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo

為了方便可以將其拷貝到 PATH 里迈勋。

更新

repo的運(yùn)行過(guò)程中會(huì)嘗試訪(fǎng)問(wèn)官方的git源更新自己炬灭,如果想使用tuna的鏡像源進(jìn)行更新,可以將如下內(nèi)容復(fù)制到你的 ~/.bashrc~/.profile 里靡菇。

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

重啟終端模擬器或 source 腳本文件重归,以使其生效。

下載源碼

使用每月更新的初始化包同步代碼

由于首次同步需要下載約 30GB 數(shù)據(jù)厦凤,過(guò)程中任何網(wǎng)絡(luò)故障都可能造成同步失敗鼻吮,我們強(qiáng)烈建議您使用初始化包進(jìn)行初始化。

下載 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar较鼓,下載完成后記得根據(jù) checksum.txt 的內(nèi)容校驗(yàn)一下椎木。

由于所有代碼都是從隱藏的 .repo 目錄中 checkout 出來(lái)的违柏,所以我們只保留了 .repo 目錄,下載后解壓 再 repo sync 一遍即可得到完整的目錄香椎。

使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下載初始化包
tar -xf aosp-latest.tar
cd AOSP   # 解壓得到的 AOSP 工程目錄
# 這時(shí) ls 的話(huà)什么也看不到漱竖,因?yàn)橹挥幸粋€(gè)隱藏的 .repo 目錄
repo sync # 正常同步一遍即可得到完整目錄
# 或 repo sync -l 僅checkout代碼

傳統(tǒng)初始化方法

  • 建立工作目錄
mkdir aosp
cd aosp
  • 初始化倉(cāng)庫(kù)
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
  • 如果需要某個(gè)特定的 Android 版本(列表):
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
  • 同步源碼數(shù)(以后只需執(zhí)行這條命令來(lái)同步)
repo sync

注意:由于原庫(kù)太大,同步過(guò)程中時(shí)常會(huì)遇到意外導(dǎo)致同步中斷畜伐。下面推薦一個(gè)下載腳本馍惹,幫助中斷發(fā)生后會(huì)自動(dòng)繼續(xù)同步。

#!/bin/bash
repo sync -j 4  
while [ $? = 1 ]; do  
    echo “======sync failed, re-sync again======”  
    sleep 3  
    repo sync  -j 4 
done

AndroidStudio 調(diào)試源碼

生成 Android Studio 導(dǎo)入文件

生成 AndroidStudio 能夠直接調(diào)試的源碼有三種方法:

  1. 編譯所有源碼玛界,生成 idegen.jar
  2. 只下載某一部分代碼(下載別人分享的idegen.jar)
  3. 編譯 idegen 生成屬于自己本地這套代碼的 idegen.jar

然后在執(zhí)行 idegen.sh 生成 android.ipr/android.iml万矾,最后導(dǎo)入 AndroidStudio 。

由于慎框,方法一編譯需要10多個(gè)小時(shí)良狈,耗費(fèi)大量的時(shí)間和硬件資源,所以只介紹后面兩種方法:

用 idegen 生成 Android Studio 導(dǎo)入用的配置文件

如果下載了完整的 AOSP鲤脏,

cd aosp
source build/envsetup.sh
make idegen  // 生成 idegen.jar

如果只下載了 frameworks/base 或其他部分代碼们颜,用別人的 idegen.jar 也行吕朵,需要將 idegen.jar 移動(dòng)到 ./out/host/linux-x86/framework/ 目錄下猎醇,沒(méi)有此目錄可用下面命令創(chuàng)建:

mkdir -p ./out/host/linux-x86/framework 

使用 idegen.jar 來(lái)生成配置文件

在 aosp 目錄下,執(zhí)行下面命令努溃,生成 ide 導(dǎo)入所需的 .ipr/.iml 文件

development/tools/igegen/idegen.sh

成功之后就會(huì)生成用于 Android Studio 導(dǎo)入的文件 android.iml/android.ipr 了硫嘶。

導(dǎo)入源碼

  1. 導(dǎo)入前 IDE 需要設(shè)置大內(nèi)存,

在 ANDROID_STUDIO_HOME/bin/studio64.vmoptions 中設(shè)置

-Xms1280m
-Xmx1280m
  1. 修改 android.iml梧税,排除不想導(dǎo)入的部分沦疾,加快導(dǎo)入速度。

就像下面摘取的android.iml文件1887行開(kāi)始的這些一樣(不導(dǎo)入的寫(xiě)成exclude):

<sourceFolder url="file://$MODULE_DIR$/./sdk/testapps/userLibTest/src" isTestSource="true"/>
<sourceFolder url="file://$MODULE_DIR$/./tools/external/fat32lib/src/main/java" isTestSource="false"/>
<excludeFolder url="file://$MODULE_DIR$/out/eclipse"/>
<excludeFolder url="file://$MODULE_DIR$/.repo"/>
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth"/>
<excludeFolder url="file://$MODULE_DIR$/external/chromium"/>
<excludeFolder url="file://$MODULE_DIR$/external/icu4c"/>
<excludeFolder url="file://$MODULE_DIR$/external/webkit"/>
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/host"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/product"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilt"/>

當(dāng)然第队,也可以通過(guò) Android Studio 的 Project Stucture 打開(kāi)左側(cè) Modules哮塞,然后將右側(cè) Sources 中一些目錄 Excluded 掉。

  1. 然后直接 Android Studio - 打開(kāi)存在的工程 - 選擇 aosp 文件夾下生成的那個(gè) android.ipr 文件導(dǎo)入就行了凳谦。

導(dǎo)入后配置 Android Studio

設(shè)置 AOSP 工程 JDK 跳轉(zhuǎn)到源碼文件忆畅,而非之前安裝的 openJDK

  • 設(shè)置工程目錄樣式為 Project
  • 選擇 Project Structure
  • project structure - SDKs - 新建JDK "No Libraries" - 刪除 classpath 和 sourcepath 下所有內(nèi)容
  • 設(shè)置 sdk 依賴(lài)為新建的 "1.8 (No Libraries)"

解決代碼調(diào)試時(shí)跳轉(zhuǎn)到 .class 而非 .java 文件

  • 打開(kāi) Project Structure - Modules - Dependencies
  • 選擇 <Module source> 之前的所有 .jar 包,移動(dòng)到依賴(lài)包的最后

設(shè)置 AOSP 為 Android Studio 工程尸执,以供 Debug 調(diào)試

  • 打開(kāi) Project Structure - Modules - ADK
  • 點(diǎn)擊 "+" 號(hào)家凯,選擇 Android-APK - 點(diǎn)擊ok就行了

參考內(nèi)容

[1] Android 開(kāi)源工程 官網(wǎng)
[2] 清華大學(xué)開(kāi)源鏡像站-AOSP
[3] 簡(jiǎn)書(shū)“老沈Rosen-下載AOSP Android源碼”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市如失,隨后出現(xiàn)的幾起案子绊诲,更是在濱河造成了極大的恐慌,老刑警劉巖褪贵,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂之,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)世舰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)橄镜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冯乘,你說(shuō)我怎么就攤上這事洽胶。” “怎么了裆馒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵姊氓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喷好,道長(zhǎng)翔横,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任梗搅,我火速辦了婚禮禾唁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘无切。我一直安慰自己荡短,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哆键。 她就那樣靜靜地躺著掘托,像睡著了一般。 火紅的嫁衣襯著肌膚如雪籍嘹。 梳的紋絲不亂的頭發(fā)上闪盔,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音辱士,去河邊找鬼泪掀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颂碘,可吹牛的內(nèi)容都是我干的异赫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凭涂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祝辣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起切油,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝙斜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后澎胡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孕荠,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娩鹉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稚伍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弯予。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖个曙,靈堂內(nèi)的尸體忽然破棺而出锈嫩,到底是詐尸還是另有隱情,我是刑警寧澤垦搬,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布呼寸,位于F島的核電站,受9級(jí)特大地震影響猴贰,放射性物質(zhì)發(fā)生泄漏对雪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一米绕、第九天 我趴在偏房一處隱蔽的房頂上張望瑟捣。 院中可真熱鬧,春花似錦栅干、人聲如沸迈套。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)交汤。三九已至雏赦,卻和暖如春劫笙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背星岗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工填大, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俏橘。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓允华,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親寥掐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靴寂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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