1. 程式人生 > 實用技巧 >pixel XL原始碼編譯

pixel XL原始碼編譯

配置

  • 作業系統 :虛擬機器 ubuntu 16.04
  • 記憶體 :11G
  • 硬碟 :150G
  • CPU :4核

編譯過程

1. 原始碼分支獲取

根據收集型號下載對應的版本,通過以下網站獲取pixel XL android 10原始碼標記 android-10.0.0_r17

https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

2.下載android原始碼

repo

sudo apt-get install git-core
sudo apt-get install git-core curl
mkdir ~/bin/
cd ~/bin

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
gedit ~/.bashrc

在~/.bashrc裡新增

#國內映象
export REPO_URL='https://aosp.tuna.tsinghua.edu.cn/git-repo'

3. 同步程式碼

3.1 第一種方式

cd ~/work/sources/android-10.0.0_r17
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r17
repo sync -c --no-tags --prune -f -j4  //執行緒根據cpu核數決定 一般為cpu核數x2,此處採用4執行緒
-c, --current-branch fetch only current branch from server.
這個選項指定只獲取執行 repo init 時 -b 選項所指定的分支,不會獲取遠端伺服器的分支資訊。
例如伺服器上新增了其他分支,使用 -c 選項同步後,在本地 git 倉庫執行 git branch -r 命令看不到伺服器新增的分支名。如果不加 -c 選項,那麼同步的時候,會列印 [new branch] 這樣的資訊,使用 git branch -r 命令可檢視到伺服器新增的分支。

–no-tags don’t fetch tags.
該選項指定不獲取伺服器上的tag資訊。

–prune delete refs that no longer exist on the remote.
如果遠端伺服器已經刪除了某個分支,在 repo sync 時加上 --prune 選項,可以讓本地倉庫刪除對這個分支的跟蹤引用。

-j JOBS, --jobs=JOBS projects to fetch simultaneously (default 2).
指定啟用多少個執行緒來同步。
例如上面的 -j 4 指定用4個執行緒來同步。如果沒有提供該選項,預設是用2個執行緒。

-f:即使某個專案同步失敗,也繼續同步其他專案。

總的來說,在 repo sync -c --no-tags --prune -j 4 命令中,使用 -c 和 --no-tags 選項可以減少需要同步的內容,從而減少要佔用的原生代碼空間,也可以減少一些同步時間。
使用 -j 選項來指定啟用多執行緒進行同步,可以加快執行速度,也就減少了同步時間。
使用 --prune 選項去掉已刪除分支的跟蹤引用,一般不會用到,這個選項可加可不加。

3.1 第二種方式(未嘗試此方法不知道是否可行)

下載原始碼的初始化包(加速原始碼下載) 大約60G

wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar

解壓縮,解壓縮完成之後會多出來~/aosp目錄
切進去

tar xzvf aosp-latest.tar

cd aosp

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r17
repo sync -c --no-tags --prune -f -j4  //執行緒根據cpu核數決定 一般為cpu核數x2,此處採用4執行緒

4. 驅動下載

https://developers.google.com/android/drivers#sailfishqp1a.190711.020

下載google_devices-sailfish-qp1a.191005.007.a3-a1615a0f.tgz

qcom-sailfish-qp1a.191005.007.a3-191228fe.tgz
兩個壓縮包,191005.007.a3為當時最新版本驅動

下載完成後解壓會獲得兩個.sh指令碼檔案,執行兩個指令碼後會生成vendor資料夾,將vendor資料夾拷貝到原始碼根目錄

5. 編譯環境

sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
  libgl1-mesa-dev libxml2-utils xsltproc unzip
  
  sudo apt-get install openjdk-8-jdk

6. 編譯指令碼準備

進去原始碼根目錄下

source ./build/envsetup.sh 
lunch aosp_sailfish-userdebug //也可以命令列lunch回車稍等片刻輸入 然後輸入15即可

//調整一個Java引數,要不然會出現Java OOM錯誤
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"

注: 我們可以在aosp/build/tools/buildinfo.sh vendor_buildinfo.sh 這兩個檔案中直接修改手機品牌的名字,廠家等資訊

7. 開始編譯

make -j6   //執行緒視配置而定

//編譯的結果在 ~/aosp/out/target/product/marlin 資料夾中
//比較重要的幾個是:

boot.img
recovery.img
ramdisk.img
system.img
userdata.img

8. 刷機

回到原始碼根目錄下輸入

fastboot flashall -w

注 lanch命令為我們設定好了ANDROID_PRODUCT_OUT變數的值為編譯檔案目錄確保它的值和編譯後鏡像輸出目錄的路徑值一致。如果不一致的話,重新設定ANDROID_PRODUCT_OUT的值與編譯後鏡像輸出目錄路徑值一致。

其他

fastboot

一、Fastboot

1.1 Recovery模式(卡刷)

在系統進行定製時,編譯系統會編譯出一份ZIP的壓縮包,裡面是一些系統分割槽映象,提供給客戶進行手動升級、恢復系統。需要提前將壓縮包內建SDcard,在Recovery模式進行。

進入Recovery方法:將手機完全關機後,按住音量鍵下(上)+電源鍵,進入BootLoader介面。用音量加減來控制游標,電源鍵來進行確認(有的機器只能用音量下鍵進行選擇,上鍵是確認鍵)。說明:有的機器可能沒有預裝Recovery。

1.2 Recovery模式(線刷)

在安卓手機中Fastboot是一種比Recovery更底層的刷機模式。使用USB資料線連線手機的一種刷機模式。這就是所謂的線刷,與Recovery模式相比Fastboot需要掌握一些燒機命令,對於某些系統卡刷來說,線刷更可靠,安全。

二、Android系統分割槽介紹

bootloader——系統開機引導類似電腦BIOS,這塊刷錯手機就會變成磚

radio——通訊模組、基帶、WIFI、Bluetooth等銜接硬體的驅動軟體

recovery——系統故障時負責恢復

boot——Linux嵌入式系統核心

system——系統檔案、應用

cache——系統執行時產生的快取

userdata——使用者使用APP產生的快取資料

ninja快速編譯framewrk

./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_sailfish.ninja services
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_sailfish.ninja framework
adb push out/target/product/sailfish/system/framework/oat/arm64/services.odex system/framework/oat/arm64
adb push out/target/product/sailfish/system/framework/oat/arm64/services.vdex system/framework/oat/arm64
adb push out/target/product/sailfish/system/framework/services.jar system/framework
adb push out/target/product/sailfish/system/framework/services.jar.prof system/framework

修改framework原始碼並編譯

https://kswapd.cn/article/aosp-build-to-pixel/?share=facebook

模組編譯

除了通過make命令編譯可以整個android原始碼外,Google也為我們提供了相應的命令來支援單獨模組的編譯.

編譯環境初始化(即執行source build/envsetup.sh)之後,我們可以得到一些有用的指令,除了上邊用到的lunch,還有以下:

  - 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.

其中mmm指令就是用來編譯指定目錄.通常來說,每個目錄只包含一個模組.比如這裡我們要編譯Launcher2模組,執行指令:

mmm packages/apps/Launcher2/

稍等一會之後,如果提示:

make completed success fully

即表示編譯完成,此時在out/target/product/gereric/system/app就可以看到編譯的Launcher2.apk檔案了.

重新打包系統映象

編譯好指定模組後,如果我們想要將該模組對應的apk整合到系統映象中,需要藉助make snod指令重新打包系統映象,這樣我們新生成的system.img中就包含了剛才編譯的Launcher2模組了.重啟機器之後生效.

單獨安裝模組

我們在不斷的修改某些模組,總不能每次編譯完成後都要重新打包system.img,然後重啟手機吧?有沒有什麼簡單的方法呢?
在編譯完後,藉助adb install命令直接將生成的apk檔案安裝到裝置上即可,相比使用make snod,會節省很多事件.

拉取 kernel 程式碼並編譯

https://www.somedoc.net/www.somedoc.net/?p=4437 核心編譯

編譯目錄介紹

out/target/product/generic/system目錄下的常用目錄:

Android系統自帶的apk檔案都在out/target/product/generic/system/apk目錄下;

一些可執行檔案(比如C編譯的執行),放在out/target/product/generic/system/bin目錄下;

動態連結庫放在out/target/product/generic/system/lib目錄下;

硬體抽象層檔案都放在out/targer/product/generic/system/lib/hw目錄下.

原始碼目錄介紹

lunch 後面的引數介紹

lunch aosp_arm-eng

該命令表示針對模擬器進行完整編譯,並且所有除錯功能均處於啟用狀態。

如果您沒有提供任何引數就執行命令,lunch 將提示您從選單中選擇一個目標。

所有編譯目標都採用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號。

BUILDTYPE 是以下型別之一:

編譯型別 使用情況
user 適用於生產環境
userdebug 與“user”類似,但具有 root 許可權和可除錯性;是進行除錯時的首選編譯型別
eng eng 具有額外除錯工具的開發配置

單獨刷入某個 img:

fastboot刷入命令格式:fastboot flash 系統分割槽 對應的name.img

cd out/target/product/marlin
fastboot flash boot_a boot.img
fastboot flash boot_b boot.img
fastboot flash system system.img
fastboot flash system_b system_other.img
fastboot flash vendor vendor.img
fastboot flash userdata userdata.img
fastboot flash userdata data.img

SDK編譯

如果你需要自己編譯SDK使用,很簡單,只需要執行命令make sdk即可.

https://www.jianshu.com/p/384a66573a10
https://blog.csdn.net/tianzong2019/article/details/106957540/
https://blog.csdn.net/SpHinner/article/details/82841109
https://www.somedoc.net/www.somedoc.net/?p=4437 核心編譯
https://blog.csdn.net/wengliuhu/article/details/107979371 原始碼目錄介紹

https://developers.google.cn/android/images#marlin 官網刷機包,救磚
https://blog.csdn.net/u012417380/article/details/73196722 lunch引數介紹
https://source.android.com/source/building 官網刷機教程
https://www.dazhuanlan.com/2019/12/09/5dedf04e496e7  Android8 分割槽表變化和相關資訊
https://www.jianshu.com/p/367f0886e62b  部分編譯
https://kswapd.cn/article/aosp-build-to-pixel/?share=facebook 修改framework原始碼
https://developers.google.cn/android/images#marlin 救磚