下載AOSP android源碼(最小最快下載方式,跳過編譯直接導入Android Studio) Ubuntu 16.04

(時間:2017年/2月/20日 狀態:依然是菜鳥)
首先,謝謝這些大爺的博客幫助我這個菜鳥,貼出鏈接。
使用Android Studio導入源碼
利用 Android Studio 閱讀 Android 源碼
idegen:一個角落里的法器
下載閱讀android源碼筆記
如何使用Android Studio開發/調試Android源碼
Android Studio導入Android源碼
使用Android studio閱讀Android源碼
mac 上的android源碼下載編譯查看
Dev Env Note Url 7
Android Sync 同步 源碼問題解決方案
自己動手編譯Android源碼(超詳細)
[Android編譯(二)] 從谷歌官網下載android 6.0源碼、編譯并刷入nexus 6p手機](http://blog.csdn.net/fuchaosz/article/details/52473660)
Ubuntu 16.04 LTS 下編譯 CM 源碼
Tips of “repo sync” ofAndroid
Build LineageOS/CM/AOSP on Ubuntu
Ubuntu16.04編譯android6.0源代碼
Repo: Tips & TricksLearn about the repo tool , manifests and local manifests and 5 important tips !

基本上該試的都試過了,下面都是“取其精華去其糟粕”的結果。

總步驟簡介:

總步驟一(準備編譯環境)
總步驟二(下載源碼的三種方式)(只看frameworks/base源碼的,直接到第二種下載方式)
總步驟三(免編譯將源碼導入Android studio)

總步驟一:準備環境

英文好的大爺可以直接去安卓官網 Requirements | Android Open Source Project
我是在Ubuntu 16.04下進行的一些列操作。

安裝OPEN JDK、啟用默認jdk為open jdk

  1. 官網介紹說,7.0到主分支用open jdk8,俺就裝open jdk8



    在Terminal輸入命令行

sudo apt-get update
sudo apt-get install openjdk-8-jdk
  1. 如果你還還裝了oracle jdk,需要將open jdk切換為默認jdk。
sudo update-alternatives --config java
sudo update-alternatives --config javac

安裝編譯需要的依賴包(就看看代碼不編譯的朋友,直接跳過,直接看下代碼方式(二)或(三))

  1. 安卓官網只說了Ubuntu 14.04需要的依賴包,如下圖。
  2. 然而這個博客說盲目相信官網就too young too simple了,下面是Ubuntu 16.04需要的依賴包。
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

一行一行輸入就行。

有些依賴包安裝失敗的解決辦法

  1. 無法獲取安裝包



    圖中顯示libxml2-utils_2.9.4-1+deb.sury.org~xenial+2_amd64.deb 找不到,無法直接安裝。解決方法

  • 直接google搜索 libxml2-utils_2.9.4-1+deb.sury.org~xenial+2_amd64.deb 下載對應的deb文件
  • 使用命令
cd downloads  //進入deb包所在目錄
sudo dpkg -i --ignore-depends=libxml2-utils libxml2-utils_2.9.4-1+deb.sury.org-xenial+2_amd64.deb 

進行強制安裝,問題解決

  1. 安裝包與已經安裝的包沖突
    再次遇到不能安裝依賴庫的問題,不過這次不是獲取不到包,而是與已經安裝的包沖突,卸載那個包就行了


    如圖,說zconf.h已經在zlib1g-dev包里面了,安裝lib32z1-dev失敗

  • 卸載zlib1g-dev:i386
sudo apt remove  zlib1g-dev:i386
  • 重新執行安裝lib32z1-dev命令
cd downloads
sudo dpkg -i --ignore-depends=lib32z1-dev lib32z1-dev.deb 

總步驟二:下載源碼

下載源碼方式(一),官方方法,最慢,直接看方式(二)吧

repo是啥?

  • 就我目前的理解而言,就是簡化git操作的一個工具集合,因為aosp是個超大的項目,整個project下面又有N多個小project,如果只用git命令來操作,輸命令就夠煩的了,所以谷歌弄了個repo,估計一條repo命令執行了N多的git命令。

下載安裝repo

  1. 確保在你的home下面又bin目錄,并且把bin目錄添加到PATH環境變量中。
 mkdir ~/bin
 PATH=~/bin:$PATH
  1. 下載repo工具,并確保工具可以被執行
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

谷歌AOSP官網的Installing Repo

初始化repo客戶端

  1. 創建一個文件夾來放源碼文件,然后進入該文件夾,名字隨便取
mkdir WORKING_DIRECTORY //我寫了mkdir aosp,初始化repo客戶端的操作都保持在這個目錄下
cd WORKING_DIRECTORY
  1. 下載認證(不認證的話,下著下著就斷開,谷歌用來防止惡意下載的)
  2. 注冊谷歌賬戶Google account,一般都有吧。。。。
  3. 設置git默認用戶名和郵箱,名字就是谷歌賬戶名(有個帖子說名字隨便,谷歌官網也沒說到底是不是谷歌賬戶名),郵箱就必須是谷歌賬戶Gmail.com的郵箱了。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
  1. 用強制認證的方式進行repo init操作
    谷歌AOSP官網 Initializing a Repo client
- [the password generator](https://android.googlesource.com/new-password)  進入后登錄自己谷歌賬戶,生成密碼,我也不知道怎么解釋,照做就是了。進入后如下圖所示:

生成的三行代碼一次copy進Terminal執行就行了。

- 確定要下載的Android版本

從官網看Source Code Tags and Builds看自己想下哪個版本,Branch一欄就是需要用到的版本號了。

- 以強制認證的方式訪問并初始化repo

這個URL比正常的URL多了一個/a,官網非強制認證的URL是這樣的:https://android.googlesource.com/platform/manifest
下面是我們要用到的,其中的-b代表branch,就是上一步你自己調的最順眼的版本號。我挑了個android-7.1.1_r46

repo init -u https://android.googlesource.com/a/platform/manifest -b android-7.1.1_r46

如果初始化成功,在aosp文件夾下,CTRL+H顯示隱藏文件應該有.repo文件夾,有就成功了。

開始下載源碼

  1. 直接repo sync會失敗,由于你懂得原因,需要breakwa1l,建議自己買個服務器自己上SS,然后在Terminal里的命令行是不會通過SS聯網的,使用SS + ProxyChains的組合可以讓命令行里執行的命令也走SS,具體ProxyChains各位怎么安裝使用,自己搜吧。
proxychains repo sync //proxychains保證repo sync命令走SS,可以訪問谷歌服務器

但是還是會因為各種原因導致下載終端,簡單執行上面這個命令不可行,看下面一步。

  1. 這個博文里的腳本自動下載,(下面的我直接COPY他的博文的)
    由于下載過程中還會遇到各種各樣的問題,所以我們需要創建一個自動下載腳本,確保出錯了之后會自動執行repo sync,在aosp文件夾下創建一個腳本down.sh,(自己在aosp文件夾創建down.sh文件,然后用編輯器打開,copy代碼進去保存就行)代碼如下:
#!/bin/bash
repo sync  -j8 
while [ $? = 1 ]; do  
        echo “======sync failed, re-sync again======”  
        sleep 3  
        repo sync  -j8
done 

因為要FANQIANG,在repo sync前加上proxychains,改成如下所示

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

然后命令行執行,就是開始剛創建的腳本了,等吧,5-6個小時總會下完的。(注意:Terminal要在aosp文件夾下)

chmod a+x down.sh
./down.sh

這個方式下載太磨時間了,別用了。


<br /><br />

下載源碼的方式(二),清華 / 科大方案,速度爆表

從清華服務器下載repo并安裝

清華repo鏡像

  1. 確保在你的home下面又bin目錄,并且把bin目錄添加到PATH環境變量中。
 mkdir ~/bin
 PATH=~/bin:$PATH
  1. 從清華鏡像下載repo工具,并確保工具可以被執行
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
  1. 讓repo工具自己通過清華鏡像更新“repo工具本身”,好TM拗口。。
  • repo的運行過程中會嘗試訪問官方的git源更新自己,如果想使用tuna的鏡像源進行更新,可以將如下內容復制到你的~/.bashrc文件里面。
  • 新手:如何打開這個文件?
    答:在HOME文件夾下,CTRL+H顯示隱藏文件,搜索.bashrc就行。打開后復制下面的地址并保存文件。
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

下載源碼

  1. 如果是搞開發的估計會用最新的代碼,那么直接下載最新的壓縮包
    下載初始化包并解壓(相當于直接把下載方式(一)中repo sync操作下載的文件打成壓縮包直接從國內地址下載了,速度超快,我這兒速度有4m/s)
  • 清華鏡像下載地址: https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
  • 下載后解壓就行,解壓出來文件夾名稱是aosp,只有一個.repo文件夾,就是倉庫,代碼都在里面
  • 導出代碼
    cd aosp
    repo sync -l  // -l就是只導出代碼到本地,不通過網絡更新代碼
    repo sync -n  // -n就是只通過網絡更新代碼啦
    repo sync //正常同步
    
  1. 如果像我這種小白,只想看看某個版本代碼
  • aosp官網的源碼列表選則自己要下的版本號,我依然選擇:android-7.1.1_r46

  • 新建一個文件夾aosp,然后進入

    cd aosp 
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r46 
    
  • 如果只是想看frameworks/base的代碼
    雖然是國內鏡像,但依然會出錯停止,所以我們還是需要創建一個自動下載腳本,確保出錯了之后會自動執行repo sync,在aosp文件夾下創建一個腳本down.sh,(自己在aosp文件夾創建down.sh文件,然后用編輯器打開,copy代碼進去保存就行)代碼如下,這個-j 8可以自己改,你的CPU總線程數*2:

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

把上面的的兩行repo sync -j 8替換成下面的語句

repo sync platform/development platform/frameworks/base platform/packages/apps/Calculator -j 8
  • repo sync命令后面可以指定要同步的project,上面這行命令就是指定啦3個project
    打開.repo/manifest.xml,可以看到project的名字和路徑,我們要看的frameworks/base下的代碼的project名字如圖所示,那就在repo sync后面指定就好啦。


    這個development必須要下載,用于生成導入android studio的配置文件
    如果要看packages/apps目錄下的內置app的源碼,也可以選擇下載,上面我們下載的是Calculator,你想下載哪個就指定哪一個就可以啦

  • 想要同步整個AOSP,sync后不用指定project

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

    然后命令行執行,就開始下載啦。(注意:Terminal要在aosp文件夾下)

    chmod a+x down.sh
    ./down.sh
    

<br /><br />

下載源碼的方式(三),直接下載國內網友打包好的單獨源碼文件

為啥

  1. aosp文件夾下的.repo文件是倉庫
  2. 除了.repo文件夾以外的文件才是真正需要的源碼文件
  3. .repo超級大
  4. 別人打包的都是下載完成后刪除.repo的壓縮包,我把android-7.1.1_r46所有代碼壓縮了一下,9個G左右,還沒上傳,但網上有很多,各位自己搜搜看。雖然9個G比下載方式(二)的初始化包的24G要小很多,但是呢,百度網盤太坑爹,速度很慢,在我這兒反而下清華鏡像的24G初始化包更快。
  5. 找到一個哥們分享的從1.6到7.1.1的所有源碼壓縮包 http://pan.baidu.com/s/1ngsZs

關于repo的一些技巧:

  1. 從自己已經下載的AOSP切換到國內清華源
  2. 如果repo sync失敗該怎么做 Android Sync 同步 源碼問題解決方案

總步驟三:編譯源碼(其實并不需要編譯)并導入Android Studio

文章開頭貼出的N個博客都說道了下面三種方式。

  1. (編譯得10多個小時,神經病啊,不干,只說下面兩種)編譯所有源碼 --- 生成idegen.jar --- 執行idegen.sh生成android.ipr/android.iml --- Android sutdio導入
  2. 只下載某一部分代碼 --- 下載別人分享的idegen.jar --- 執行idegen.sh生成android.ipr/android.iml --- Android sutdio導入
  3. 編譯idegen生成屬于自己本地這套代碼的idegen.jar --- 執行idegen.sh生成android.ipr/android.iml --- Android sutdio導入

用idegen生成Android Studio導入用的配置文件

  1. 如果你自己下啦完整的AOSP,那么cd aosp 進入源碼根目錄,然后執行下面的命令
source build/envsetup.sh 
make idegen  //生成idegen.jar
  1. 如果只下載啦frameworks/base或其他部分代碼,用別人的idegen.jar也行
    也可以下載idegen.jar移動到/out/host/linux-x86/framework/目錄下,沒有目錄用下面命令
mkdir -p ./out/host/linux-x86/framework 
idegen.jar 目錄
  1. 使用idegen.jar來生成配置文件
    在aosp目錄下,執行下面命令,生成ide導入所需的.ipr/.iml文件
development/tools/idegen/idegen.sh 

成功之后就會產生兩個用于IDE(Android Studio)導入的文件,如下圖所示


  1. 導入前,IDE需要設置大內存
    ANDROID_STUDIO_HOME/bin/studio64.vmoptions
    中設置
-Xms1280m
-Xmx1280m
  1. 修改android.iml,排除不想導入的部分,加快導入速度
    (將自己不用的代碼去掉)
    就像下面摘取的android.iml文件1887行開始的這些一樣(不導入的寫成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"/>

也可以通過Android Studio的Project Stucture 打開左側Modules,然后將右側Sources中一些目錄Excluded掉。

  1. 然后就直接Android studio ---- 打開存在的工程 --- 選擇aosp文件夾下生成的那個Android.ipr文件導入就行了。


導入后 配置Android Studio

設置AOSP工程的JDK跳轉到當前AOSP源碼文件中已經存在的.java文件,而非我們之前安裝的JDK。

為啥?
下載的aosp源碼中已經包含了用到的所有jdk.java文件,不需要依賴我們安裝的openjdk

  • 設置工程目錄樣式為Project


  • 選擇Project Structure


  • project structure --- SDKs --- 左上角“+”號新建JDK --- 取個名字叫1.8(No Libraries) --- 刪除Classpath和Sourcepath下的所有東西(右邊“-”號刪除)

  • 設置sdk依賴新建的“1.8(No Libraries)”



解決代碼調試時跳轉到.class文件而非源碼中的.java文件
  • 打開Project Structure---Modules---Dependencies


  • 選擇第一個.jar包,然后下拉倒最下面,按SHIFT選擇到<Module source>之前,點擊右側的下移圖標



    點兩次,把最下面兩個(分別對應源碼文件和沒有指向本地JDK的SDK)依賴移動到最上面點擊OK,然后代碼調試就會先找源碼中的.java了,而非下面的一堆.jar。



    (大部分博客都說刪除其他的依賴,只剩下上圖中的前兩個,但是我這么做后,源碼文件打開會看到一片紅,R文件找不到等等,所以我的做法是不刪除任何jar包,直接把<Module source>和API Platform移動到其他jar包之前,讓studio先從源碼文件夾找.java文件)

讓Android studio把當前工程看成Android工程,讓aosp工程可以進行DEBUG調試,同樣在Project Structure中設置

點擊“+”號,選擇Android-APK --- 點擊ok就行了


External file changes sync may be slow 怎么解決

直接按照其給定的解決方法來解決就行。


至此,AOSP源碼就導入完畢了,你可以開始打斷點看源碼了!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容