WSL進(jìn)行aosp下載編譯

安裝WSL

現(xiàn)在,可以在 PowerShell 或 Windows 命令提示符中輸入此命令,然后重啟計(jì)算機(jī)來安裝WSL所需的全部?jī)?nèi)容,默認(rèn)版本是 WSL 2, Linux是Ubuntu的

wsl --install

下載源碼前的準(zhǔn)備工作

設(shè)置aosp源碼所在路徑為大小寫敏感

image-20211020215101184.png

設(shè)置D:\androidSource的所有用戶為“完全控制”權(quán)限

image-20211020215246998.png

下載源碼

安裝repo工具

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

repo的運(yùn)行過程中會(huì)嘗試訪問官方的git源更新自己,一般無法正常訪問,如果想使用tuna的鏡像源進(jìn)行更新,要將如下內(nèi)容復(fù)制到你的~/.bashrc里

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

然后重啟終端模擬器,重啟后還需要再次執(zhí)行PATH=~/bin:$PATH,否則找不到repo

下載每月更新的初始化包

直接使用迅雷下載,地址https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,這個(gè)文件很大,我下載的時(shí)候已經(jīng)達(dá)到123GB了,因此要準(zhǔn)備比較大的空間,下載完成后進(jìn)行以下命令

cd AOSP   # 解壓得到的 AOSP 工程目錄
# 這時(shí) ls 的話什么也看不到,因?yàn)橹挥幸粋€(gè)隱藏的 .repo 目錄
repo sync # 正常同步一遍即可得到完整目錄

repo sync 完成后,會(huì)顯示下圖

image-20211018171609600.png

選擇對(duì)應(yīng)的分支并拉出代碼

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-11.0.0_r17
repo sync

repo sync -j1 --fail-fast:在遇到第一個(gè)錯(cuò)誤的時(shí)候退出

如果不知道有哪些分支可以切換,

可以進(jìn)入該google官網(wǎng)代號(hào)標(biāo)記和細(xì)分版本查看:

https://source.android.com/setup/start/build-numbers

也可以輸入以下命令,查看可切換分支

cd .repo/manifests
git branch -a | cut -d / -f 3

repo sync遇到的問題:

問題一

fatal: unable to access 'http://aosp.tuna.tsinghua.edu.cn/platform/manifest/': server certificate verification failed. CAfile: none CRLfile: none

解決方法:

禁用git的SSL驗(yàn)證

git config --global http.sslverify false
git config --global https.sslverify false

問題二

error: .repo/manifests/: contains uncommitted changes

解決方法:

cd .repo/manifests
git config core.filemode false

Git不僅能夠管理文件的版本,而且能夠管理對(duì)文件的訪問權(quán)限,在本地工作目錄只改變文件的訪問權(quán)限,也是對(duì)git庫(kù)中管理的文件的修改,執(zhí)行g(shù)it status可以看到文件的變化,Git對(duì)文件的訪問權(quán)限的管理與配置選項(xiàng)core.filemode有關(guān),core.filemode選項(xiàng)默認(rèn)true,即區(qū)分文件的執(zhí)行權(quán)限

查看filemode選項(xiàng) git config --get core.filemode 或 git config core.filemode

設(shè)置filemode選項(xiàng) git config core.filemode true

問題三

沒有改動(dòng)代碼,也有可能出現(xiàn)此問題,因?yàn)橛锌赡苁莃uild的時(shí)候進(jìn)行的修改

packages/apps/Traceur/: discarding 808 commits error: packages/apps/Traceur/: platform/packages/apps/Traceur checkout dfa65bdd6454b97fc184a55c949deb391f976540 error: Cannot checkout platform/packages/apps/Traceur packages/providers/TelephonyProvider/: discarding 834 commits error: packages/providers/TelephonyProvider/: platform/packages/providers/TelephonyProvider checkout 8e526a25a711c3d446b027df71bf8a096b243b8f error: Cannot checkout platform/packages/providers/TelephonyProvider error: Your local changes to the following files would be overwritten by checkout: Android.mk AndroidManifest.xml jni/Android.bp jni/GifTranscoder.cpp proguard.flags res/drawable-hdpi/ic_music.png

解決方法:

//repo forall -c 是對(duì)所有g(shù)it倉(cāng)庫(kù)執(zhí)行后面的命令
repo forall -c git reset --hard

再重新選擇對(duì)應(yīng)的分支并拉出代碼:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-11.0.0_r17
repo sync

可以到.repo/manifests目錄下看當(dāng)前版本

cd .repo/manifests
git branch -a
image-20211103150256438.png

或者查看 .repo/manifests.git 目錄下的 config 文件,在 [branch "default"] 的 merge 那里,沒切換前是merge = refs/heads/master

cd .repo/manifests.git
cat config
image-20211103150824543.png

問題四

info: A new version of repo is available
warning: repo is not tracking a remote branch, so it will not receive updates
repo reset: error: Entry 'command.py' not uptodate. Cannot merge.
fatal: Could not reset index file to revision 'v2.17.1^0'.

解決方法:

//找到該文件目錄
find . -name command.py
//進(jìn)入到上一個(gè)命令找到的目錄下
cd .repo/repo
//更新文件
git pull
//回到aosp目錄
cd ../..

問題五

/usr/bin/env: ‘python’: No such file or directory

解決方法:

//查找python3的安裝位置,默認(rèn)會(huì)安裝python3
whereis python3
//為其創(chuàng)建符號(hào)連接
sudo ln -s /usr/bin/python3 /usr/bin/python

編譯準(zhǔn)備工作

安裝 jdk

sudo apt install openjdk-8-jdk

安裝依賴包

為了提高軟件包的安裝速度,可以更換軟件源為國(guó)內(nèi)的源,更換方式如下

更換Linux安裝源

實(shí)際上是修改一個(gè)文件,先到文件目錄下

cd /etc/apt

將該文件進(jìn)行備份,以免誤操作

cp sources.list sources.list.bak

修改文件內(nèi)容

vi /etc/apt/sources.list

在文件頂部增加以下任意一種鏡像源

##阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
##網(wǎng)易源
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
##清華源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
##中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

可以通過下面的地址獲取清華源的配置
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

更新源

sudo apt-get update

安裝依賴庫(kù)

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

安裝依賴庫(kù)遇到的問題

問題一

當(dāng)使用apt-get install 安裝32位支持庫(kù)的時(shí)候,提示無法找到對(duì)應(yīng)包

E: Unable to locate package libx11-dev:i386
E: Unable to locate package libreadline6-dev:i386

解決方法:

dpkg --add-architecture i386
apt-get update

問題二

執(zhí)行 sudo apt-get install libesd0-dev 時(shí)出現(xiàn)

E: Unable to locate package libesd0-dev

解決方法:

## 解決libesd0-dev無法安裝問題
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe

更新軟件源并重新安裝

開始編譯

source build/envsetup.sh
// 進(jìn)行清除操作,以避免之前進(jìn)行的build干擾到接下來的build
make clobber
// 選擇編譯開發(fā)工程師的版本,方便debug
lunch aosp_x86_64-eng
make -j6

編譯 make 遇到的問題

執(zhí)行 make -j6 是出現(xiàn)以下報(bào)錯(cuò):

問題一

Failed to listen for path logs: listen unix out/.path_interposer_log: bind: operation not supported

解決方法:
原因是因?yàn)槲业拇a在 /mnt/d/androidSource/aosp 中,還是在 windows 路徑中,導(dǎo)致無法啟動(dòng)編譯。會(huì)一直報(bào)系統(tǒng)不支持的錯(cuò)誤,可以到 /home/user 目錄下編譯,但空間可能不夠,因此需要把 Ubuntu 移到一個(gè)空間足夠大的盤下

查看已安裝的ubuntu版本
wsl -l --all -v
image-20211103223350187.png
導(dǎo)出分發(fā)版為tar文件到d盤
wsl --export Ubuntu D:\Ubuntu\wsl-ubuntu.tar
image-20211103223438982.png
注銷當(dāng)前分發(fā)版
wsl --unregister Ubuntu
image-20211103223511387.png
重新導(dǎo)入并安裝在D盤
wsl --import ubuntu D:\Ubuntu D:\Ubuntu\wsl-ubuntu.tar --version 2
設(shè)置默認(rèn)登陸用戶為安裝時(shí)用戶名
ubuntu config --default-user USERNAME
刪除wsl-ubuntu.tar
del d:\wsl-ubuntu.tar
擴(kuò)展虛擬磁盤空間

WSL2系統(tǒng)的虛擬磁盤空間,默認(rèn)是250G,android 11 代碼量很大,因此我擴(kuò)展為 600G,這一段是在PowerShell上輸入的,輸入的新值必須大于此原始值(以 MB 為單位)

PS C:\WINDOWS\system32> diskpart
Microsoft DiskPart 版本 10.0.19041.964
Copyright (C) Microsoft Corporation.
在計(jì)算機(jī)上: DESKTOP-IP7P9JS
DISKPART> select vdisk file="D:\Ubuntu\ext4.vhdx"
DiskPart 已成功選擇虛擬磁盤文件。
DISKPART> expand vdisk maximum="600000"
  100 百分比已完成
DiskPart 已成功擴(kuò)展虛擬磁盤文件。
DISKPART>

查看虛擬大小的值

DISKPART> detail vdisk

設(shè)備類型 ID: 0 (未知)
供應(yīng)商 ID: {00000000-0000-0000-0000-000000000000} (未知)
狀態(tài): 已添加
虛擬大小:  585 GB
物理大小: 2894 MB
文件名: D:\Ubuntu\ext4.vhdx
為子級(jí): 否
父文件名:
找不到關(guān)聯(lián)的磁盤號(hào)。

在 WSL 的 Ubuntu 里行以下命令,讓 WSL 知道它可擴(kuò)展其文件系統(tǒng)的大小

sudo mount -t devtmpfs none /dev
mount | grep ext4

第一個(gè)命令會(huì)輸出:mount: /dev: none already mounted on /dev. 可以不管這個(gè)

第二個(gè)命令輸出下面內(nèi)容,可以知道磁盤設(shè)備為 /dev/sdb:

/dev/sdb on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)

再輸入命令:

sudo resize2fs /dev/sdb

擴(kuò)展前的大小:

image-20211103232327481.png

擴(kuò)展后大小為


image-20211103233507288.png

問題二

FAILED: out/soong/build.ninja
out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
error: cts/hostsidetests/appsecurity/test-apps/CorruptApkTests/Android.bp:37:1: module "CtsCorruptApkTests_b79488511" variant "android_common": module source path "cts/hostsidetests/appsecurity/test-apps/CorruptApkTests/b79488511.apk" does not exist
20:23:41 soong bootstrap failed with: exit status 1

#### failed to build some targets (24 seconds) ####

解決方法:

//到報(bào)錯(cuò)目錄下
cd cts/hostsidetests/appsecurity/test-apps/CorruptApkTests
//給 Android.bp 和 Android.mk 改名
mv Android.bp Android.bp.ori
mv Android.mk Android.mk.ori

問題三

FAILED: out/target/product/generic_x86/obj/RENDERSCRIPT_BITCODE/libclcore.bc_intermediates/rs_cl.bc
/bin/bash -c "PWD=/proc/self/cwd prebuilts/clang/host/linux-x86/clang-3289846/bin/clang -Iframeworks/rs/script_api/include -Iexternal/clang/lib/Headers -MD -DRS_VERSION=24 -std=c99 -c -O3 -fno-builtin -emit-llvm -target renderscript32-linux-androideabi -fsigned-char -D__i386__ -Wno-deprecated -Werror  -Werror -Wall -Wextra -Iframeworks/rs/cpu_ref -DRS_DECLARE_EXPIRED_APIS  -x renderscript frameworks/rs/driver/runtime/rs_cl.c -o out/target/product/generic_x86/obj/RENDERSCRIPT_BITCODE/libclcore.bc_intermediates/rs_cl.bc"
prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
14:28:09 ninja failed with: exit status 1

解決方法,其他so依賴問題也是同樣處理方法:

//找到報(bào)錯(cuò)里的so文件
find / -name libncurses.so.5
//將so文件拷貝到/usr/lib下
cp prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot/usr/lib/libncurses.so.5 /usr/lib

最后成功


image-20211108222501054.png

運(yùn)行虛擬機(jī)

emulator

暫時(shí)不能在 WSL 中運(yùn)行 emulator,下面的不用看了。因?yàn)?WSL 本身就是一個(gè)模擬器,要在模擬器中運(yùn)行模擬器,WSL 目前還不支持

運(yùn)行虛擬機(jī) emulator 遇到的問題

問題一

emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
CPU acceleration status: KVM requires a CPU that supports vmx or svm
More info on configuring VM acceleration on Linux:
https://developer.android.com/studio/run/emulator-acceleration#vm-linux
General information on acceleration: https://developer.android.com/studio/run/emulator-acceleration.

解決方法:

//檢查 Linux 上當(dāng)前是否安裝了 KVM
kvm-ok
//如果沒有 kvm-ok 命令,安裝包含 kvm-ok 命令的 cpu-checker 軟件包
sudo apt-get install cpu-checker
//下面的命令輸出值 1 或更大值表示支持虛擬化。輸出值 0 表示您的 CPU 不支持硬件虛擬化
egrep -c '(vmx|svm)' /proc/cpuinfo

再次運(yùn)行 kvm-ok

kvm-ok

預(yù)期輸出:INFO: /dev/kvm exists KVM acceleration can be used,如果出現(xiàn)以下錯(cuò)誤,安裝KVM

Your CPU does not support KVM extensions 
KVM acceleration can NOT be used

安裝 KVM

Cosmic (18.10) 或更高版本:

sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils

Lucid (10.04) 或更高版本:

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

Karmic (9.10) 或更低版本:

sudo aptitude install kvm libvirt-bin ubuntu-vm-builder bridge-utils
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容