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ò)此步驟儡首。
- 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
- 然而盲目相信官網(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)試的源碼有三種方法:
- 編譯所有源碼玛界,生成 idegen.jar
- 只下載某一部分代碼(下載別人分享的idegen.jar)
- 編譯 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)入源碼
- 導(dǎo)入前 IDE 需要設(shè)置大內(nèi)存,
在 ANDROID_STUDIO_HOME/bin/studio64.vmoptions 中設(shè)置
-Xms1280m
-Xmx1280m
- 修改 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 掉。
- 然后直接 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源碼”