(時間: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
-
官網介紹說,7.0到主分支用open jdk8,俺就裝open jdk8
在Terminal輸入命令行
sudo apt-get update
sudo apt-get install openjdk-8-jdk
- 如果你還還裝了oracle jdk,需要將open jdk切換為默認jdk。
sudo update-alternatives --config java
sudo update-alternatives --config javac
安裝編譯需要的依賴包(就看看代碼不編譯的朋友,直接跳過,直接看下代碼方式(二)或(三))
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
一行一行輸入就行。
有些依賴包安裝失敗的解決辦法
-
無法獲取安裝包
圖中顯示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
進行強制安裝,問題解決
-
安裝包與已經安裝的包沖突
再次遇到不能安裝依賴庫的問題,不過這次不是獲取不到包,而是與已經安裝的包沖突,卸載那個包就行了
如圖,說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
- 確保在你的home下面又bin目錄,并且把bin目錄添加到PATH環境變量中。
mkdir ~/bin
PATH=~/bin:$PATH
- 下載repo工具,并確保工具可以被執行
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
初始化repo客戶端
- 創建一個文件夾來放源碼文件,然后進入該文件夾,名字隨便取
mkdir WORKING_DIRECTORY //我寫了mkdir aosp,初始化repo客戶端的操作都保持在這個目錄下
cd WORKING_DIRECTORY
- 下載認證(不認證的話,下著下著就斷開,谷歌用來防止惡意下載的)
- 注冊谷歌賬戶Google account,一般都有吧。。。。
- 設置git默認用戶名和郵箱,名字就是谷歌賬戶名(有個帖子說名字隨便,谷歌官網也沒說到底是不是谷歌賬戶名),郵箱就必須是谷歌賬戶Gmail.com的郵箱了。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
- 用強制認證的方式進行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文件夾,有就成功了。
開始下載源碼
- 直接repo sync會失敗,由于你懂得原因,需要breakwa1l,建議自己買個服務器自己上SS,然后在Terminal里的命令行是不會通過SS聯網的,使用SS + ProxyChains的組合可以讓命令行里執行的命令也走SS,具體ProxyChains各位怎么安裝使用,自己搜吧。
proxychains repo sync //proxychains保證repo sync命令走SS,可以訪問谷歌服務器
但是還是會因為各種原因導致下載終端,簡單執行上面這個命令不可行,看下面一步。
- 用這個博文里的腳本自動下載,(下面的我直接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并安裝
- 確保在你的home下面又bin目錄,并且把bin目錄添加到PATH環境變量中。
mkdir ~/bin
PATH=~/bin:$PATH
- 從清華鏡像下載repo工具,并確保工具可以被執行
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
- 讓repo工具自己通過清華鏡像更新“repo工具本身”,好TM拗口。。
- repo的運行過程中會嘗試訪問官方的git源更新自己,如果想使用tuna的鏡像源進行更新,可以將如下內容復制到你的~/.bashrc文件里面。
- 新手:如何打開這個文件?
答:在HOME文件夾下,CTRL+H顯示隱藏文件,搜索.bashrc就行。打開后復制下面的地址并保存文件。
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
下載源碼
- 如果是搞開發的估計會用最新的代碼,那么直接下載最新的壓縮包
下載初始化包并解壓(相當于直接把下載方式(一)
中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 //正常同步
- 如果像我這種小白,只想看看某個版本代碼
從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的配置文件
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 />
下載源碼的方式(三),直接下載國內網友打包好的單獨源碼文件
為啥
- aosp文件夾下的.repo文件是倉庫
- 除了.repo文件夾以外的文件才是真正需要的源碼文件
- .repo超級大
- 別人打包的都是下載完成后刪除.repo的壓縮包,我把android-7.1.1_r46所有代碼壓縮了一下,9個G左右,還沒上傳,但網上有很多,各位自己搜搜看。雖然9個G比
下載方式(二)
的初始化包的24G要小很多,但是呢,百度網盤太坑爹,速度很慢,在我這兒反而下清華鏡像的24G初始化包更快。 - 找到一個哥們分享的從1.6到7.1.1的所有源碼壓縮包 http://pan.baidu.com/s/1ngsZs
關于repo的一些技巧:
- 從自己已經下載的AOSP切換到國內清華源
- 如果repo sync失敗該怎么做 Android Sync 同步 源碼問題解決方案
總步驟三:編譯源碼(其實并不需要編譯)并導入Android Studio
文章開頭貼出的N個博客都說道了下面三種方式。
- (編譯得10多個小時,神經病啊,不干,只說下面兩種)編譯所有源碼 --- 生成idegen.jar --- 執行idegen.sh生成android.ipr/android.iml --- Android sutdio導入
- 只下載某一部分代碼 --- 下載別人分享的idegen.jar --- 執行idegen.sh生成android.ipr/android.iml --- Android sutdio導入
- 編譯idegen生成屬于自己本地這套代碼的idegen.jar --- 執行idegen.sh生成android.ipr/android.iml --- Android sutdio導入
用idegen生成Android Studio導入用的配置文件
- 如果你自己下啦完整的AOSP,那么cd aosp 進入源碼根目錄,然后執行下面的命令
source build/envsetup.sh
make idegen //生成idegen.jar
- 如果只下載啦
frameworks/base
或其他部分代碼,用別人的idegen.jar也行
也可以下載idegen.jar移動到/out/host/linux-x86/framework/
目錄下,沒有目錄用下面命令
mkdir -p ./out/host/linux-x86/framework
- 使用idegen.jar來生成配置文件
在aosp目錄下,執行下面命令,生成ide導入所需的.ipr/.iml文件
development/tools/idegen/idegen.sh
成功之后就會產生兩個用于IDE(Android Studio)導入的文件,如下圖所示
- 導入前,IDE需要設置大內存
在ANDROID_STUDIO_HOME/bin/studio64.vmoptions
中設置
-Xms1280m
-Xmx1280m
- 修改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掉。
-
然后就直接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 怎么解決
直接按照其給定的解決方法來解決就行。