1. 程式人生 > 其它 >Pixel XL編譯和燒錄Android 8.0

Pixel XL編譯和燒錄Android 8.0

參考部落格https://blog.csdn.net/weixin_43860588/article/details/105474948

策略選擇

本打算在mac上編譯原始碼, 但看到經過反覆折騰,最終決定採取行動硬碟格式化為EXT4格式,存放aosp程式碼,mac安裝ubuntu虛擬機器方式,掛載行動硬碟的方式進行原始碼編譯。

這樣可以避免虛擬機器體積過於龐大,也方便在不同電腦上訪問原始碼。

構建環境搭建

https://source.android.com/setup/build/initializing

aosp 原始碼是通過 Git 進行管理的,但是由於程式碼量巨大,單純使用 Git 已經無法滿足日常便捷操作的目標。所以 Google 以 Git 為基礎,使用 Python 編寫了 repo 這款工具,讓開發者可以更方便輕鬆的管理原始碼,點選檢視 repo 使用詳情。

首先,建立 repo 工具存放資料夾。

然後,下載 repo,並賦予 repo 可執行許可權。

curl https://storage.googleapis.com/git-repo-downloads/repo >  /usr/local/bin/repo
chmod a+x /usr/local/bin/repo

安裝所需的軟體包 (Ubuntu 18.04)

您需要 64 位版本的 Ubuntu。

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5-dev lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

適用於Python2

sudo apt install python-minimal

適用於 Python3

如果您的 Ubuntu 20.04.2 LTS 是全新安裝(相對於升級)的 Linux 版本:

sudo ln -s /usr/bin/python3 /usr/bin/python

下載Android原始碼

下載aosp原始碼

由於Android原始碼體量巨大,直接拉取很容易失敗,可以先下載.repo壓縮包(直接用以前下載的33G左右)

tar zxvf aosp_repo.tgz -C oreo/

按照手機型號在安卓開發者網站查詢對應的分支和細分版本等資訊 https://source.android.com/setup/start/build-numbers

這裡我們的手機為Pixel XL,找一個支援Pixel XL編譯的分支,可以在開啟以上網址後全域性搜尋Pixel XL,選擇其中一個分支為android-8.0.0_r3

OPR6.170623.012 android-8.0.0_r3  Oreo  Pixel XL、Pixel  2017-08-05

切到特定分支,這裡要切換成android-8.0.0_r3

直接
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r3

接下來回到.repo所在目錄

repo sync -c (完全下載好,.repo資料夾大約44G)

選項:
-j : 多工,一般8核心可以開到16任務,過多會起反作用
-c: 只下載當前分支程式碼
-d: 讓工程回退到manifest指定的版本
-f: 如果某個工程同步失敗,繼續同步
為了避免失敗, 可以加指令碼重試
#!/bin/sh
repo sync -c -j4
while [ $? -ne 0 ]
do
repo sync -c -j4
done

問題記錄:

1. AttributeError: 'str' object has no attribute 'decode'

2. File "/Volumes/aosp/google/.repo/repo/project.py", line 2587, in DiffZ
out = iter(out[:-1].split('\0')) # pylint: disable=W1401
TypeError: a bytes-like object is required, not 'str'

出現這種情況跟我們下載方式有關係,報錯報在repo目錄,有理由懷疑下載不是最新的,所以不要去修改指令碼(改了同步也會出現衝突),想辦法更新到最新就好

解決方式:

cd .repo/repo

git reset --hard HEAD^^^^^^^^^^^

git pull

下載驅動檔案

https://developers.google.com/android/drivers

機器為pixel xl, 結合程式碼分支資訊OPR6.170623.012,實際連結為

https://developers.google.com/android/drivers#marlinopr6.170623.012

Pixel XL binaries for Android 8.0.0 (OPR6.170623.012)

Hardware ComponentCompanyDownloadSHA-256 Checksum
Vendor image Google Link 3fe0150da11fe3065f39bf3308d9ecf1a4ca0a5ded120b21d711271bf68fae08
GPS, Audio, Camera, Gestures, Graphics, DRM, Video, Sensors Qualcomm Link f3a578c9c582e61f94ca83c85135f46c270a1e6af679365d94c7b2d2e8afbe7a

下載完解壓後實際是兩個指令碼

extract-qcom-marlin.sh

extract-google_devices-marlin.sh

編譯

這裡選擇編譯pixel xl可以直接用的user debug 版本

source build/envsetup.sh
lunch 21
make -j4

問題記錄

問題1
SyntaxError: invalid syntax
[ 0% 104/83842] target Java: okhttp (...IBRARIES/okhttp_intermediates/classes)
File "build/tools/normalize_path.py", line 25
print os.path.normpath(p)
^
SyntaxError: invalid syntax
[ 0% 105/83842] target Java: libphone...number-platform_intermediates/classes)
File "build/tools/normalize_path.py", line 25
print os.path.normpath(p)
^
SyntaxError: invalid syntax
ninja: build stopped: subcommand failed.
06:48:49 ninja failed with: exit status 1
build/core/main.mk:21: recipe for target 'run_soong_ui' failed
make: *** [run_soong_ui] Error 1
-----------------------
問題2
[ 0% 3/83736] JarJar: out/target/common/obj/JAVA_LIBRARIES/libphonenumber-platform_intermediates/classes-jarjar.jar
FAILED: out/target/common/obj/JAVA_LIBRARIES/libphonenumber-platform_intermediates/classes-jarjar.jar
/bin/bash -c "java -jar out/host/linux-x86/framework/jarjar.jar process external/libphonenumber/jarjar-rules.txt out/target/common/obj/JAVA_LIBRARIES/libphonenumber-platform_intermediates/classes-full-debug.jar out/target/common/obj/JAVA_LIBRARIES/libphonenumber-platform_intermediates/classes-jarjar.jar"
錯誤: 找不到或無法載入主類 com.tonicsystems.jarjar.Main
ninja: build stopped: subcommand failed.
10:46:07 ninja failed with: exit status 1
build/core/main.mk:21: recipe for target 'run_soong_ui' failed
make: *** [run_soong_ui] Error 1

#### make failed to build some targets (41 seconds) ####

問題3
Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'
[ 0% 292/79741] target C++: libv8src <= external/v8/src/wasm/wasm-module.cc

解決方式:

問題1  
使用python2

問題2
編譯之前執行 export LC_ALL=C

問題3
參考https://segmentfault.com/a/1190000039970343

原因就是編譯時用的是open-jdk 8u292,預設禁用了TLSv1, TLSv1.1,
從/etc/java-8-openjdk/security/java.security中取消TLSv1, TLSv1.1 禁用
修改後執行 ./jack-admin kill-server && ./jack-admin start-server

後記:

1. 關於repo切分支

除了repo init -b,這種方式應該也是可以

cd  .repo/manifests

git checkout -b android-8.0.0_r3
git branch --set-upstream-to=origin/android-8.0.0_r3 android-8.0.0_r3
git fetch --all
git reset --hard origin/android-8.0.0_r3

2. repo init做了啥

執行repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r3

三個檔案變化 .repo/manifests/default.xml .repo/manifests.git/config .repo/manifests.git/.repo_config.json sain@Ubuntu1804:/media/sain/Linux/aosp/test$ cat .repo/manifests/default.xml <?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="aosp" fetch=".." review="https://android-review.googlesource.com/" /> <default revision="refs/tags/android-8.0.0_r3" remote="aosp" sync-j="4" /> -------------- sain@Ubuntu1804:/media/sain/Linux/aosp/test$ cat .repo/manifests.git/config [core] repositoryformatversion = 0 filemode = true [filter "lfs"] smudge = git-lfs smudge --skip -- %f process = git-lfs filter-process --skip [remote "origin"] url = https://aosp.tuna.tsinghua.edu.cn/platform/manifest fetch = +refs/heads/*:refs/remotes/origin/* [branch "default"] remote = origin merge = refs/heads/android-8.0.0_r3 -------------- sain@Ubuntu1804:/media/sain/Linux/aosp/test$ cat .repo/manifests.git/.repo_config.json { "core.repositoryformatversion": [ "0" ], "core.filemode": [ "true" ], "filter.lfs.smudge": [ "git-lfs smudge --skip -- %f" ], "filter.lfs.process": [ "git-lfs filter-process --skip" ], "remote.origin.url": [ "https://aosp.tuna.tsinghua.edu.cn/platform/manifest" ], "remote.origin.fetch": [ "+refs/heads/*:refs/remotes/origin/*" ], "branch.default.remote": [ "origin" ], "branch.default.merge": [ "refs/heads/android-8.0.0_r3" ] }