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
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^^^^^^^^^^^
下載驅動檔案
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 Component | Company | Download | SHA-256 Checksum |
---|---|---|---|
Vendor image | 3fe0150da11fe3065f39bf3308d9ecf1a4ca0a5ded120b21d711271bf68fae08 | ||
GPS, Audio, Camera, Gestures, Graphics, DRM, Video, Sensors | Qualcomm | 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
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/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" ] }