前言 在自學framework的時候,最大的難題就是如何動手實踐修改framework並且看到實踐效果。但是Android系統是需要linux環境下編譯的,我們一般的個人電腦都是windows系統,所以為了學習framework重裝電腦為linux系統有點不太實際。個人也試過虛擬機,但是系統資源開銷 ...
前言
在自學framework的時候,最大的難題就是如何動手實踐修改framework並且看到實踐效果。但是Android系統是需要linux環境下編譯的,我們一般的個人電腦都是windows系統,所以為了學習framework重裝電腦為linux系統有點不太實際。個人也試過虛擬機,但是系統資源開銷太大了,而且也非常繁瑣。 最後發現了Windows系統下的WSL可以滿足編譯Android系統的需求,並且效果十分不錯,也比虛擬機更加高效。
參考官方文檔
https://source.android.google.cn/docs/setup/build/building?hl=zh-cn
硬體要求
電腦要求記憶體最少32G/ 硬碟空間600GB以上 (Aosp的代碼量龐大), 請註意,這裡說的32GB記憶體在wsl虛擬機里會打對折變成16GB,這剛好夠用。
Windows系統相關準備
1.首先要求windows10以上,並且有微軟商城。
2.設置電腦相關配置
3.在商城中搜索 linux 關鍵字, 選擇下載ubn-18.04.6版本
更新wsl內核
Linux 內核更新包會安裝最新版本的 WSL 2 Linux 內核,以便在Windows 操作系統映像中運行 WSL。(若要運行 Microsoft Store 中的 WSL並更頻警地推送更新請使用 wsl.exe --install 或 wsl.exe --update)
初始化linux系統
打開後創建賬號與密碼(這個密碼很重要是sudo許可權的密碼,請牢記)
遷移WSL到其他盤中
因為wsl是預設在c盤安裝的,但是後續我們還需要拉取aosp,c盤空間無法承載。這裡我們需要將wsl搬遷到其他硬碟中(個人是建議用一個1TB的移動硬碟,這樣你就可以不受限制的在各種設備上進行編譯)。
打開cmd命令行,如下步驟操作:
第一步,查看狀態並且停止
如果Running運行狀態,關掉它(註意如果你的wsl正在運行,先將wsl關閉在輸入下麵的命令)
wsl --shutdown
第二步,搬遷位置
wsl --export Ubuntu-18.04 Z:\Ubuntu_WSL_18046\Ubuntu.tar
第三步,註銷原來的wsl
wsl --unregister Ubuntu-18.04
第四步,重新導入新位置的wsl
wsl --import Ubuntu-18.04 Z:\Ubuntu_WSL_18046 Z:\Ubuntu_WSL_18046\Ubuntu.tar -->> 註意這裡有2個路徑
生成成功會在目錄下多一個虛擬磁碟ext4.vhdx 文件
第五步,重新設置預設名稱
Ubuntu1804 config --default-user zhou
編譯環境
首先更新全部的軟體
cd ~/ && sudo apt-get update
安裝git和python
sudo apt install git python
配置repo環境
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
cp repo ~/bin
配置repo環境變數
vim ~/.bashrc
#添加下麵兩行環境變數配置 !wq 保存退出
PATH=~/bin:$PATH
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
#環境變數生效
source ~/.bashrc
下載代碼
創建目錄並下載aosp代碼
mkdir aosp && cd aosp
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r36
repo sync -c
編譯Android 10
#安裝依賴工具鏈
sudo apt-get install libncurses5 libgl1-mesa-dev g++-multilib flex bison gperf build-essential tofrodos python-markdown libxml2-utils xsltproc dpkg-dev libsdl1.2-dev git-core gnupg flex bison gperf zip curl zlib1g-dev gcc-multilib libc6-dev-i386 x11proto-core-dev libx11-dev libgl1-mesa-dev libxml2-utils xsltproc unzip m4 ccache
#進入源代碼根目錄,編譯
source build/envsetup.sh
#選擇合適版本的模擬器,我電腦是x86-64 CPU,
#需要編譯一個流暢運行的x86-64架構模擬器系統,這裡最好編譯選擇24. aosp_x86_64-eng ,
#編譯arm架構的模擬器在WINDOW上運行會非常慢,不建議。
lunch 24
make -j10
通常編譯需要3小時,編譯成功如下圖:
編譯成功後在out/下生成相應的img,如下圖
如果你要編譯其他平臺
可以通過只輸入lunch 查看可以編譯的各個平臺
zhou@DESKTOP-9QKQBJG:~/aosp$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_blueline-userdebug
4. aosp_bonito-userdebug
5. aosp_car_arm-userdebug
6. aosp_car_arm64-userdebug
7. aosp_car_x86-userdebug
8. aosp_car_x86_64-userdebug
9. aosp_cf_arm64_phone-userdebug
10. aosp_cf_x86_64_phone-userdebug
11. aosp_cf_x86_auto-userdebug
12. aosp_cf_x86_phone-userdebug
13. aosp_cf_x86_tv-userdebug
14. aosp_coral-userdebug
15. aosp_crosshatch-userdebug
16. aosp_flame-userdebug
17. aosp_marlin-userdebug
18. aosp_sailfish-userdebug
19. aosp_sargo-userdebug
20. aosp_taimen-userdebug
21. aosp_walleye-userdebug
22. aosp_walleye_test-userdebug
23. aosp_x86-eng
24. aosp_x86_64-eng
25. beagle_x15-userdebug
26. car_x86_64-userdebug
27. fuchsia_arm64-eng
28. fuchsia_x86_64-eng
29. hikey-userdebug
30. hikey64_only-userdebug
31. hikey960-userdebug
32. hikey960_tv-userdebug
33. hikey_tv-userdebug
34. m_e_arm-userdebug
35. mini_emulator_arm64-userdebug
36. mini_emulator_x86-userdebug
37. mini_emulator_x86_64-userdebug
38. poplar-eng
39. poplar-user
40. poplar-userdebug
41. qemu_trusty_arm64-userdebug
42. uml-userdebug
啟動模擬器,驗證編譯成果
編譯完成系統後,我們需要一個模擬器去啟動驗證編譯完成的系統。這裡建議是直接使用wsl下aosp自帶的模擬器。有些人可能會疑惑wsl下的linux是純命令行的啊,怎麼能支持圖形下的模擬器呢?沒錯不用懷疑,wsl支持打開一個Android模擬器。
而且用aosp自帶的模擬器還有一些好處,首先可以不需要去將編譯後的龐大的代碼拷貝到windows上了,其次直接拷貝到windows不等於Android studio上的模擬器能啟動(而且經常錯誤啟動到avd創建的模擬器上)。
首先需要設置下源
zhou@DESKTOP-9QKQBJG:~/aosp$ source build/envsetup.sh
然後,繼續配置目標版本
zhou@DESKTOP-9QKQBJG:~/aosp$ lunch 24
接著,設置下要啟動的系統路徑
zhou@DESKTOP-9QKQBJG:~/aosp$ export ANDROID_PRODUCT_OUT=~/aosp/out/target/product/generic_x86_64/
然後啟動模擬器
zhou@DESKTOP-9QKQBJG:~/aosp$ emulator
請註意!直接執行emulator是預設熱啟動(熱啟動會讓一些修改看不到效果),如果你修改了framework重新編譯了,請使用emulator -wipe-data ,直接擦除data數據,讓模擬器重新冷啟動載入系統。
如果出現需要許可權:
zhou@DESKTOP-9QKQBJG:~/aosp$ emulator
emulator: WARNING: Couldn't find crash service executable /home/zhou/aosp/prebuilts/android-emulator/linux-x86_64/emulator64-crash-service
emulator: WARNING: system partition size adjusted to match image file (3083 MB > 800 MB)
emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
Please ensure KVM is properly installed and usable.
CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm)
給它許可權,然後在執行emulator
zhou@DESKTOP-9QKQBJG:~/aosp$ sudo chmod -R 777 /dev/kvm
啟動後的效果圖
AOSP常用編譯和查找命令
- m :等同於 make ,進行一次完整編譯。
- mm:在當前目錄下編譯所有模塊,但不包括依賴項。
- mmm [目錄]:編譯指定目錄下的所有模塊,但不包括依賴項。只編譯指定模塊:mmm [dir/:target1,target2]
- mma:在當前目錄下編譯所有模塊,包括依賴項。
- mmma [目錄]:編譯指定目錄下的所有模塊,包括依賴項。
- make clean:刪除整個 out/ 目錄。
- make clobber:用於清除編譯緩存。
- make snod:當重新編譯部分模塊完成後,快速生成img文件。
- cgrep:對C/C++文件執行 grep (只搜尋C/C++文件類型,也包括.h類型)。
- jgrep:只對Java文件執行 grep (只搜尋Java文件類型)。
- resgrep:只匹配 /res 目錄下的 xml 文件。
- sepgrep:只查找sepolicy文件。
替換ext4.vhdx的方式(存疑)
ext4.vhdx就是linux的虛擬硬碟,我們下載完成aosp後,在其他電腦上如果需要實現系統編譯,在下載一次aosp的海量代碼,不太現實,可以通過替換ext4的方式實現
將舊的ext4.vhdx文件copy到新的里,避免許可權問題,因為舊的ext4.vhdx是上一個系統創建的,新的系統有時候會無法訪問,這裡我試過兩種方式,都是可行的,只要不是剪切重命名貌似都可以
- 使用copy命令,或者在文件管理器里複製粘貼進行覆蓋
copy D:\Ubuntu-18.04-wsl-old\ext4.vhdx D:\Ubuntu-18.04-wsl\ext4.vhdx
編譯中可能會出現問題
記憶體不足或者swap空間不足
記憶體不足解決思路一
有可能真的是你的電腦記憶體不足夠提供編譯時所需的記憶體(最少16G只是建議,但是有可能16G都是不夠使用的),這裡建議直接增加記憶體條
記憶體不足解決思路二
配置記憶體
export MAVEN OPTS="-Xms8192m -Xmx8192m"
swap空間不足解決思路--增加空間
創建swap文件
安裝操作系統分區時需創建swap分區
安裝的時候如果沒有創建分區,需要手動創建。
1. 查看記憶體情況
命令是free -h (h顯示的是G, m 顯示的是M) 或者free -m
2. 創建swap 分區
dd if=/dev/zero of=/tmp/swapfile1 bs=1024 count=10240000
其中 if=/dev/zero: 輸入/dev/zero文件。/dev/zero主要的用處是用來創建一個指定長度用於初始化的空文件。就像使用臨時交換文件.
of=/tmp/swapfile1: 輸出到/tmp.swapfile1文件
bs=1024: 定義塊大小為1024bytes,預設單位是bytes
count=10240000,總數大小為10240000個bs即10240000kb,換算的話是10G。
3. 指定分區類型為swap
mkswap /tmp/swapfile1
4. 設置swap 分區有效
swapon /tmp/swapfile1
5. 設置擴展的swap分區為自動掛載
vim /etc/fstab 進去之後自動掛載分區命令 編輯這個 /tmp/swapfile1 swap swap defaults 0 0也就是設置為這個命令之後保存就可以。
6. 測試添加是否成功
使用命令 free -h, 如果看到swap 分區中記憶體增加了,就表示成功啦。
如果剛纔創建的想要關閉,刪除創建的文件的話,就是用命令 swapoff /tmp/swapfile1, 就表示關閉這個分區了,然後刪除的命令是 rm /tmp/swapfile1 。
python版本問題
如下問題是缺少python2.7版本
解決sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 10
end
本文來自博客園,作者:觀心靜 ,轉載請註明原文鏈接:https://www.cnblogs.com/guanxinjing/p/17815468.html
本文版權歸作者和博客園共有,歡迎轉載,但必須給出原文鏈接,並保留此段聲明,否則保留追究法律責任的權利。