前言
做Android應用好多年,一直對AOSP無所知,都不知道什么東西,目前車載那么火,就想介入進去,開始嘗試去編譯一下系統源碼,然后去看了一下Android官網,目前最新的版本還不支持mac和window,只支持ubuntu,去整了個硬盤準備刷個系統,可能是Macmini原因,一直沒能成功,很尷尬,最后整了虛擬機。
整個過程挺麻煩的,我下載是Android13最新的源碼,因為源碼需要翻墻,我用清華的鏡像,下載倒是挺快,沒有像別人說的兩三天,但也有半天,編譯也用了半天,過程有很多很多坑,記錄下來給大家分享一下,一起學習。
一、構建環境搭建
1.1、準備工作
VMWare:https://www.vmware.com/products/fusion/fusion-evaluation.html
Ubuntu鏡像:http://mirrors.aliyun.com/ubuntu-releases/
1.2、VMWare安裝Ubuntu
1.2.1、我的電腦是Mac,所以下載的是VMWare Fusion虛擬機,Android官網建議ubuntu版本選擇18.0.4,給的內存大小盡量給大一些,我是16G,給了12G,磁盤大小給了500G
1.2.2、如果是Mac的話,給了一個新的硬盤,格式化的話選擇區分大小寫,不然Androidstudo去跑源碼會莫名的報錯
1.3、下載git與Python3
1.3.1、git安裝與下載
安裝git:
sudo apt install git
安裝依賴工具:
sudo apt install git-core libssl-dev libffi-dev gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev libz-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
設置git身份,添加自己的郵箱和姓名:
git config --global user.email "zhangxiaoxiao@qq.com"
git config --global user.name "zhangxiaoxiao"
1.3.2、Python3的安裝與切換
下載Python3:
sudo apt install python3
配置update-alternatives,用于切換當前使用的python版本,需要設置軟鏈:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7(python2安裝地址) 2(權重號)
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7(python3的安裝地址) 3(權重號)
切換Python版本:
sudo update-alternatives --config python
二、源碼下載與編譯
AOSP(Android Open Source Project)是Google開放的Android 開源項目,中文官網為:https://source.android.google.cn/ AOSP通俗來講就是一個Android系統源碼項目,通過它可以定制 Android 操作系統,國內手機廠商都是在此基礎上開發的定制系統。因為要墻,如果無法連接Google服務器獲取AOSP源碼,可以從 清華大學鏡像站或者 中科大鏡像。我用的是中科的例子
2.1、下載 repo 工具
創建bin,并加入到PATH中:
mkdir ~/bin
PATH=~/bin:$PATH
安裝curl庫:
sudo apt-get install curl
下載repo并設置權限
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可訪問,可以用下面的:
## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
2.2、下載源碼
然后建立一個工作目錄(名字任意)
mkdir aosp
cd aosp
初始化倉庫:
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示無法連接到 gerrit.googlesource.com,可以編輯 ~/bin/repo,把 REPO_URL 一行替換成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
如果需要某個特定的 Android 版本(Android 版本列表 ):
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24
同步源碼樹(以后只需執行這條命令來同步):
repo sync
等待漫長的好幾個小時,終于完成,成功會有這樣提示
2.3、安裝構建環境
安裝 jdk8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
安裝依賴:
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
sudo apt-get install libssl-dev
安裝 sudo apt-get install libesd0-dev 會報 Unable to locate package libesd0-dev 這個錯,解決辦法
sudo gedit /etc/apt/sources.list //在行尾添加如下兩行的內容
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
2.4、編譯
使用envsetup.sh腳本初始化環境:
source build/envsetup.sh
選擇用lunch構建哪個目標,根據設備選擇需要的目標,該設備可以是google官方提供的,根據google提供的驅動地址下載:https://developers.google.cn/android/drivers或者可以用電腦模擬器“sdk_phone_x86_64”,我這邊沒有設備使用的是電腦模擬器
lunch sdk_phone_x86_64
構建代碼
m j8(8等于核數*2)
其他指令說明
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
- clean - m clean 會刪除此配置的所有輸出和中間文件。此內容與 rm -rf out/ 相同
其中mmm指令就是用來編譯指定目錄.通常來說,每個目錄只包含一個模塊.比如這里我們要編譯Setting 模塊,執行指令:
mmm packages/apps/Settings/
啟動模擬器
emulator
模擬器關閉時候,其實在后臺還存在,需要自行關閉
pkill qemu
三、自定義ROM真機刷機
USB 調試配置:(設備USB能連上電腦虛擬機則不用管,如果不是用虛擬機能連上電腦也忽略)https://developer.android.google.cn/studio/run/device.html#setting-up
驅動下載:https://developers.google.cn/android/drivers#angleropr6.170623.019
下載完對應的驅動,并將壓縮包放入已經下載好的源碼根目錄,解壓后得到兩個腳本文件,從源代碼樹的根目錄運行附帶的自解壓腳本,然后確認您同意附帶的許可協議的條款。二進制文件及其對應的 makefile 將會安裝在源代碼樹的 vendor/ 層次結構中
# 我的目錄/home/zhangxiaoxiao/aosp
extract-qcom-barbet.sh
extract-google_devices-barbet.sh
為了確保新安裝的二進制文件在解壓后能被有效采用,請使用以下命令刪除所有之前 build 的已有輸出:
make clobber
進入Bootloader模式:(解BL鎖)
adb reboot bootloader
查看連接設備:
fastboot devices
刷機:
fastboot flashall -w
四、過程報錯收集
無法安裝libesd0-dev
解決辦法:
sudo vim /etc/apt/sources.list //在行尾添加如下兩行的內容
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
更新軟件源并重新安裝:
sudo apt-get update && sudo apt-get install libesd0-dev
內存不夠,新版本要求16G,可能是你開的線程太多了。比如make -j8 這種。還有一種原因是可能沒有設置swap交換區,就是把磁盤空間當作臨時內存,注意的點是,設置完成需要重啟虛擬機或電腦。
//查看內存大小
free -m
//創建交換分區的文件:增加16G大小的交換分區,則命令寫法如下,其中的 count 等于想要的塊大小
dd if=/dev/zero of=/home/swapfile bs=1M count=16384
//設置交換分區文件,建立swap的文件系統
mkswap /home/swapfile
//立即啟用交換分區文件
swapon /home/swapfile
//如果要使系統開機時自啟用,要在文件/etc/fstab中添加一行
/home/swapfile swap swap defaults 0 0
KVM的虛擬化需要硬件支持報錯
//報錯信息
INFO | Android emulator version 31.3.9.0 (build_id 9070145) (CL:N/A)
INFO | Storing crashdata in: /tmp/android-zhangxiaoxiao/emu-crash.db, detection is enabled
INFO | Duplicate loglines will be removed, if you wish to see each indiviudal line launch with the -log-nofilter flag.
ERROR | x86_64 emulation currently requires hardware acceleration!
CPU acceleration status: KVM requires a CPU that supports vmx or svm
//安裝kvm解決辦法參考如下
https://help.ubuntu.com/community/KVM/Installation
//模擬器參考
https://blog.csdn.net/mvp_Dawn/article/details/107678057
make完不能直接emulator啟動電腦模擬器,會報錯,lunch aosp_x86-eng這個版本不行,Android12改掉了會報錯
ERROR | Failed to create Vulkan instance.
qemu-system-x86_64: Could not open '/home/zhangxiaoxiao/aosp/out/target/product/generic_x86_64/userdata-qemu.img': No such file or directory
//解決辦法
lunch sdk_phone_x86_64
感謝
http://www.lxweimin.com/p/6dee223ac93e
https://blog.csdn.net/kfyzjd2008/article/details/124267159
http://www.lxweimin.com/p/53941de91c77
https://www.pudn.com/news/62599ce6be9ad24cfab6def3.html
https://www.cnblogs.com/caoxinyu/p/10568480.html