01、Android Framework--系統編譯
Android系統編譯
系統架構
Android是Google公司推出的一款智慧手機平臺,該平臺本身是基於Linux核心的,下面是系統的架構圖:
從圖中可以看到,Andoid系統大體可以分為四層,從上往下依次是:
Linux核心層:包含Linux核心和一些驅動模組(比如USB驅動、Camera驅動、藍芽驅動等)。
Libraris層:動態庫(共享庫)、Android執行時庫,Dalvik虛擬機器等,可以稱為Native層。
Framework層:基本上由Java語言編寫,它是Android平臺上Java世界的基石。
Application層:與使用者直接互動的就是該層的應用程式,都是由Java語言開發的。
Java雖具有與平臺無關的特性,但Java和具體平臺之間的隔離是由JNI層來實現的,Java通過JNI層呼叫Linux系統的功能來完成相應的功能。
以下是所有要分析的模組,也遵循Android的系統架構:
搭建編譯環境
準備工作
硬體要求
64位的作業系統只能編譯2.3.x以上的版本,所以2.3.x以下的版本需要使用32位作業系統。
磁碟的空間保持在200GB以上,編譯會佔用大量的硬碟空間。
軟體要求
在AOSP開源中,主分支使用Ubuntu長期版本開發和測試的,因此推薦使用Ubuntu進行編譯,下面列出不同版本的Ubuntu能夠編譯哪些Android版本:
Android版本 | 編譯要求的最低Ubuntu版本 |
---|---|
Android 6.0至AOSP master | Ubuntu 14.04 |
Android 2.3.x至Android 5.x | Ubuntu 12.04 |
Android 1.5至Android 2.2.x | Ubuntu 10.04 |
除了作業系統外,JDK的版本也需要注意:
Android版本 | 編譯要求的JDK版本 |
---|---|
AOSP的Android主線 | OpenJDK 8 |
Android 5.x至android 6.0 | OpenJDK 7 |
Android 2.3.x至Android 4.4.x | Oracle JDK 6 |
Android 1.5至Android 2.2.x | Oracle JDK 5 |
搭建Android系統開發環境,我們這裡如下版本的工具:
虛擬機器:VMware-workstation-full-15.5.0
Linux系統:ubuntu-14.04.6-desktop-amd64(磁碟空間300G)
連線工具:FinalShell或xShell
Android系統:Android 4.4 API19 - KITKAT
JDK版本:jdk-6u45-linux-x64
安裝VMware虛擬機器並載入Ubuntu系統後,再來安裝相應的軟體。
如果安裝最新Android系統開發環境,使用如下配置:
虛擬機器:VMware-workstation-full-15.5.0
Linux系統:ubuntu-18.10-desktop-amd64(磁碟空間300G)
連線工具:FinalShell或xShell
Android系統:Android 10.0
JDK版本:OpenJDK8
VIM編輯器
安裝VIM編輯器命令如下:
sudo apt-get install vim-gtk
SSH安裝
一般Ubuntu都會預設安裝openssh-client,但是沒有安裝openssh-server。
安裝ssh伺服器
sudo apt install openssh-server
安裝ssh客戶端
sudo apt install openssh-client
配置ssh客戶端,去掉PasswordAuthentication yes前面的#號,儲存退出
sudo vim /etc/ssh/ssh_config
配置ssh伺服器,把PermitRootLogin prohibit-password改成PermitRootLogin yes,儲存退出。
sudo vim /etc/ssh/sshd_config
重啟ssh服務
sudo /etc/init.d/ssh restart
Root使用者設定
由於許可權問題建議開啟Root使用者,命令如下:
sudo passwd root
然後輸入兩次密碼即可完成Root使用者的設定。
JDK的安裝
由於這裡要使用Android 4.4的系統,所以JDK必須選擇1.6的版本,安裝的流程如下:
1) 在/usr/local目錄下建立java資料夾,並將下載好的jdk-6u45-linux-x64.bin上傳到java資料夾下:
sudo mkdir java
2)安裝上傳的JDK檔案
sudo chmod +x jdk-6u45-linux-x64.bin
sudo ./jdk-6u45-linux-x64.bin
3)設定jdk的環境變數,編輯profile檔案:
vim /etc/profile
在profile檔案的最後新增如下配置:
JAVA_HOME=/usr/local/java/jdk1.6.0_45
JRE_HOME=/usr/local/java/jdk1.6.0_45/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
然後更新環境變數的配置資訊
source /etc/profile
最後輸入如下指令來檢視JDK是否安裝和配置成功:
java -version
輸出結果如下:
Git的安裝
1) 檢查git是否安裝,輸入git version命令即可,如果沒有安裝則可以使用如下命令安裝:
sudo apt-get install git
使用apt-get安裝的軟體一般存放在臨時檔案以xxx.deb存在,如果想檢視軟體的安裝位置,可以使用如下命令:
dpkg -L git
2) 配置git的賬戶名和密碼資訊
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
3)建立倉庫資料夾,這裡建立android目錄,在目錄中放入README.md檔案,並進行初始化操作
cd ../../
sodu mkdir android
cd android
git init
4)現在倉庫就初始化完成,後續需要新增遠端倉庫地址、拉取程式碼或者pull和push的操作都比較簡單,常用命令如下:
git commit -m "init commit"
git remote add origin https://github.com/xxx.git
git push origin master
或者直接clone已經存在的倉庫
git clone https://github.com/xxx.git
原始碼下載
Repo是Google開發的用於管理Android版本庫的一個工具。repo並不是用來取代Git,而是用Python對Git進行了一定的封裝,簡化了對多個Git版本庫的管理。對應repo管理的任何一個版本庫,都需要使用Git命令進行操作。
首先安裝下載clientgit curl,如果已經存在可以不下載
sudo apt-get install curl git
下面的操作出現任何問題請參考:
Repo工具
下載 repo 工具:
mkdir ~/bin
export PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
如果google的地址下載失敗或無法下載,更改root下的repo的REPO_URL :
REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
Python下載
一般Linux系統,這裡是ubuntu系統會自帶python環境,如果版本Python版本低於3.5則需要調整預設版本。
whereis python # 檢視ubuntu系統中所有的python版本
因為我們需要的python版本為3.5,此時版本低於3.5的話,我們需要安裝3.5或高於3.5的版本。
如果我們的Python版本低於3.6,我們可以將安裝過程的第“2”個步驟,替換為:
curl https://storage.googleapis.com/git-repo-downloads/repo-1 > ~/bin/repo
chmod a+x ~/bin/repo
支援 Python 2.7 的舊版 Repo 啟動器。該啟動器不會無限期有效。
也可以重新安裝python3.6,如果下載過程中超時的話,更換下載的源地址來下載:進入/etc/apt 先備份sources.list,然後改成如下內容:
# 預設註釋了原始碼映象以提高 apt update 速度,如有需要可自行取消註釋
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty main main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-security main restricted universe multiverse
# 預釋出軟體源,不建議啟用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main restricted universe multiverse
使用如下命令來安裝新的python版本
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6
最後,通過命令來設定python新版本的優先順序即可
python --version
update-alternatives --list python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 3
替代成後我們可以選擇刪除或保留不需要的版本
update-alternatives --remove python /usr/bin/python3.4
rm -rf /data/logs
ln -s /temp/logs /data/logs
原始碼同步
在下載原始碼前,我們需要在如下網站選擇相應的Android版本
https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
選擇相應的版本後,輸入如下命令進行初始化:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
apt-get install phablet-tools
# 初始化操作,後面-b引數是相應的版本號
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-4.4.2_r1
repo的執行過程中會嘗試訪問官方的git源更新自己,如果想使用tuna的映象源進行更新,可以將如下內容複製到你的~/.bashrc
裡
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
如果出現repo has been initialized in xxx 說明成功了,此時直接同步即可:
repo sync
目前使用清華的源下載速度只能達到4-5m,使用科大的源大概在40-50m左右。具體可以參考下面的網站:
https://mirrors.ustc.edu.cn/help/aosp.html // 科大源
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ // 清華源
編譯和執行
編譯原始碼
1)新增需要用到的依賴
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
2)初始化編譯環境
source build/envsetup.sh
執行完成會出現如下圖示:
3)選擇編譯目標,就是選擇編譯出來的映象執行在什麼樣的裝置上
lunch
如下圖所示:
通過make指令進行程式碼編譯,通過-j引數設定參與編譯的執行緒數量來提高編譯速度:
make -j4
如果中途出現錯誤很可能是檔案同步不完全造成的,多同步幾次即可。然後進入漫長的等待......
至此,Android4.4系統編譯完成,接下來在模擬器上執行該系統。然後在桌面命令列中執行如下命令即可執行:
emulator
錯誤記錄
1、emulator: command not found
source build/envsetup.sh
lunch
2、SDL init failure, reason is: No available video device
不要在ssh命令列輸入,需要在XWindow桌面的命令列中輸入emulator即可
3、emulator: ERROR: No initial system image for this configuration!
問題原因是由於沒有編譯成功,重新編譯
閱讀原始碼
由於訪問國外的網站需要合理上網,這裡提供國內線上閱讀Android原始碼的網站:
編譯命令
Android編譯有一套自己的規則,主要利用mk檔案,主要包含三個命令用於編譯:make、mmm、mm。
make:不帶任何引數,用於編譯整個系統,編譯時間較長。也可以帶引數來編譯單個模組,比如make MediaProvider,由於會編譯該模組的依賴模組,所以比較耗時。(一般用於只知道模組名的情況下)
mmm packages/providers/MediaProvider:用於編譯指定目錄下的模板模組,不會編譯該模組的依賴模組。
mm:編譯當前目錄下的模組,只編譯當前模組,需要通過cd切換到當前目錄下。
一般編譯方式都使用增量編譯,只編譯發生變化的模板檔案,如果想編譯所有模板檔案則使用-B選項引數即可。
下面是一些常用模組的編譯命令列表:
目標模組 | make命令 | mmm命令 |
---|---|---|
init | make init | mmm system/core/init |
zygote | make app_process | mmm frameworks/base/cmds/app_process |
system_server | make services | mmm frameworks/base/services/java |
RefBase | make libutils | mmm frameworks/base/libs/utils |
Looper | make framework | mmm frameworks/base |
AudioTrack | make libmedia | mmm frameworks/base/media/libmedia |
AudioFliger | make libaudioflinger | mmm frameworks/base/libs/audioflinger |
AudioPolicyService | make libaudiopolicy | mmm hardware/msm7k/libaudio-qsd8k |
SurfaceFlinger | make libsurfaceflinger | mmm frameworks/base/libs/surfaceflinger |
Vold | make void | mmm system/vold/ |
Rild | make rild | mmm hardware/ril/rild/ |
Phone | make Phone | mmm packages/apps/Phone/ |
make命令編譯framework-res.apk和framework.jar兩個模組,它們編譯的結果在out/target/product/generic/system/framework下。
利用adb命令將這兩個檔案push到手機的system/framework命令下即可替換舊的檔案。(測試新模組前,需要殺掉所有使用該模組的程序)