Android 源碼系列文章:
Mac 10.12 快速下載 Android 源碼
Mac 10.12 編譯 Android 源碼
使用 IntelliJ 查看 Android 源碼
使用 IntelliJ Debug Android 源碼
下載源碼
下載源碼有兩個渠道
1.google 官方渠道 https://source.android.com/source/downloading.html
2.清華的 AOSP 鏡像 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
使用 google 的渠道需要科學(xué)上網(wǎng), 如果科學(xué)上網(wǎng)網(wǎng)速穩(wěn)定且不錯的話還是建議使用上面那個.
我下面介紹的下載源碼的方法不會向往常一下動輒 30G - 50G 的源碼
我使用的 google 官方渠道, 一晚上就把源碼下載完了
下面關(guān)于科學(xué)上網(wǎng)的問題不在討論, 本博客使用的是 google 官方渠道
在下載源碼之前還需要做一些準(zhǔn)備
repo工具下載及安裝
在 termianl 中執(zhí)行如下命令
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
簡單來聊聊 repo 這個工具repo. 我的理解 repo 其實(shí)就是一個 python 腳本.
Android 系統(tǒng)源碼肯定是由很多個子項(xiàng)目來構(gòu)成, 每個子項(xiàng)目都有一個自己的 git 倉庫
那么每次Android 開發(fā)新的版本的時候, 需要開一個新的分支, 所以這些子項(xiàng)目也需要跟著去開這些分支.
如果一個一個手動去弄可能很麻煩. 所有 repo 就誕生了,
repo 就是一個腳本文件, 通過調(diào)用一些列的 git 命令, 使得開發(fā)者更好的管理那些子項(xiàng)目
建立源碼文件
mac 端和 linux 上不同, 一般的 mac 上的分區(qū)都是不區(qū)分大小寫的.
但是 Android 源碼需要在區(qū)分大小寫的磁盤上編譯, 所以我們得分出一個獨(dú)立的磁盤鏡像來存放 android 源碼
使用 Mac 自帶的[磁盤工具] 來創(chuàng)建一個新的磁盤鏡像, 如下圖
注意上圖中紅框框住的部分很重要
創(chuàng)建完之后, 直接到存儲木中直接雙擊, 即可掛載該鏡像.
掛載后,會在 Finder 的做出多一個鏡像設(shè)備
或者可以使用一下命令掛載鏡像
hdiutil attach /Users/chenzhiyong/AndroidSourceCode.sparseimage -mountpoint /Volumes/AndroidSourceCode;
接下來我們跳轉(zhuǎn)到我們的鏡像目錄中創(chuàng)建一個文件夾(名字自定義),這次我下載的源碼是 android-6.0.1_r77, 所以文件夾名字也是如此.
開始下載源碼
使用 termianl 跳轉(zhuǎn)到我們剛剛創(chuàng)建的文件夾下面
執(zhí)行如下命令:
repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r77
關(guān)于 -b 后面分支名稱請查閱官方文檔 https://source.android.com/source/build-numbers.html#source-code-tags-and-builds
命令執(zhí)行完成后, 會在當(dāng)前目錄下生成一個 .repo 的文件夾,
上圖中我還框住了 mainfest.xml 文件, 這個文件很重要, 可以打開看看, 里面配置了400 多個 project, 這些 project 的代碼就是我即將要下載的.
仔細(xì)觀察會發(fā)現(xiàn) .repo 目錄下的 manifest.xml 文件其實(shí)是一個快捷方式, 真正的文件在mainfest文件夾中, 如下圖
為了能夠更加快捷的下載源碼, 接下來我們需要修改 default.xml 中的內(nèi)容了.
如果仔細(xì)看過該文件的內(nèi)容的話, 會發(fā)現(xiàn)其實(shí)有部分 project 標(biāo)簽下是有配置 clone-depth="1"
這個配置的意思是, 在 git clone 源碼的時候只 clone 最新的這一層, 不 clone 歷史的文件記錄這些, 加上這個配置就能很快的 clone 源碼了.
所以意接下來我們就是需要為每個 project 標(biāo)簽都加上 clone-depth="1"
的配置.
當(dāng)然不可能手動來加了, 不然會很累的, 為此我寫了個簡單的 python 腳本代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
file_object = open('default.xml')
change_content = ''
while 1:
line = file_object.readline()
if not line.__contains__('clone-depth'):
try:
endpos = line.index("/>")
line = line[0:endpos] + ' clone-depth="1"' + line[endpos: line.__len__()]
pass
except Exception, e:
pass
change_content += line
if not line:
break
pass # do something
print change_content
我們不需要再 源碼目錄下修改這些文件, 在其他地方創(chuàng)建一個 default.xml 文件, 把 .Repo中的 default.xml 中的 含有 project 標(biāo)簽的內(nèi)容復(fù)制到 剛剛創(chuàng)建的文件中
接下來執(zhí)行 python 腳本就就可以在命令行下面看到修改好的 project 標(biāo)簽, 我們把這些標(biāo)簽替換掉.Repo中的 default.xml project 標(biāo)簽即可
修改完default.xml文件后, 就可以開通下載源碼了, 為了斷線后或者出現(xiàn)異常情況后依然能夠下載源碼, 在網(wǎng)上找到了如下腳本:
#!/bin/bash
#FileName syn.sh
repo sync
while [ $? = 1 ]; do
echo "================sync failed, re-sync again ====="
sleep 3
repo sync
done
我們把該腳本文件放到剛剛創(chuàng)建的源碼目錄下面(android-6.0.1_r77), 執(zhí)行該腳本即可開始下載源碼了
不出意外的話,一晚上基本能夠同步完
這樣同步完的代碼是不能切換到 Android 其他分支的. 只能使用當(dāng)前我們下下來的分支, 這也是這樣下載的缺點(diǎn). 不過還是看自己, 如果需要頻繁切換 android 分支, 還是不要修改 default.xml 文件中的內(nèi)容了
現(xiàn)在完 android 源碼后, 請看下一篇編譯 Android 源碼