Sailfish OS构建(1)
第一章 概述
1.1目標
依據本指南,您可以在一個安卓設備上部署一個運行于已有的安卓固件和內核之上sailfishos(或基于sailfishos core)linux操作系統。
內容包括:
Sailfish Core: GNU/Linux userspace core
Android Hardware Adaptation (HA/HAL), 包括:
指定設備的 Android Kernel
Android base :
LineageOS - https://wiki.lineageos.org
AOSP - Android Open Source Project - https://source.android.com
CAF - Code Aurora Forum - https://www.codeaurora.org
Sony Open Devices program - Open Devices - Open Devices - Sony Developer World
Vendor-specific Android base
從 Android base 獲取的二進制驅動
針對 Android base 的hybris補丁
針對二進制驅動程序構建的 libhybris 接口
基于特定硬件插件的中間件包
使用 Android hwcomposer 的 Qt/Wayland QPA 插件
Sailfish OS 組件
1.2 開發
1.2.1 需求
使用platform SDK作為開發環境,具備以下功能:
一個或多個特定于設備的目標(具有特定于設備的頭文件和庫的 rootfs)
HA 構建 SDK(構建 Android 源代碼所需的最小 Ubuntu chroot)??在 HA 開發期間,您通常會有一個使用 HA 構建 SDK 的窗口/終端,您可以在其中構建和處理 Android 代碼。以及另一個使用 Platform SDK 構建 RPM 以進行硬件適配的會話。
配置 platform SDK,以及特定設備的target和用于HA構建的chroot在配置SDK中介紹。
平臺 SDK 會話的命令和輸出通過在代碼塊頂部使用 PLATFORM_SDK $ 指示,如下所示:
PLATFORM_SDK $
echo "此命令應該在 Platform SDK 執行"
如何進入platform SDK 在配置SDK中介紹。
在代碼塊頂部使用HABUILD_SDK $指示來自與HA構建會話的命令和輸出,類似這樣
HABUILD_SDK $
echo "此命令應該在 Ubuntu HA build SDK 執行"
如何進入 HABUILD_SDK $ 在進入Ubuntu Chroot中介紹.
1.2.2 構建位置的根目錄
在本指南中,我們使用環境變量 $PLATFORM_SDK_ROOT 代表托管 Platform SDK、Targets 和 Ubuntu chroot 的 SDK 目錄。 對于一個在 0.5-1GB 的 SDK Targets,您總共需要大約 3GB 的空間。
1.2.3 構建組件
有許多組件需要構建; 在HA build SDK中構建底層和Android相關的組件; 其余的都是在 Platform SDK 中構建的。
在 HA 構建 SDK 中:
一個內核
一個支持各種啟動選項的hack友好的 initrd
hybris-boot.img 和 hybris-recovery.img(用于啟動和調試)
最小的 Android /system/ 樹
為與 libhybris 和 Sailfish OS(例如 Bionic libc、logcat、init、...)兼容而修改的 Android 組件
在platform SDK中:
包含所有構建的二進制文件和提取的配置的 RPM 包
特定于硬件的中間件和插件(例如 Qt QPA 插件、PulseAudio)
RPM 包被上傳到一個特定于 HA 的存儲庫進行分發,通過這個存儲庫,使用 mic 實用程序的完整系統映像。 mic 實用程序通常也在 Platform SDK 中運行。
1.3 部署
hybris-boot.img(包含內核和我們自定義的 initrd)被刷寫到設備上,而 Sailfish OS rootfs 被放置在 /data/ 分區的子目錄中,與一個現有的、未修改的 Android 系統一起。Sailfish OS rootfs 然后用作 switchroot 目標,其中 /data 綁定安裝在其中以共享訪問任何用戶數據。
第二章 先決條件
2.1 移動設備
在撰寫本文時(2021-02-12 ),LineageOS 15.1 (Android 8)、16.0 (Android 9) 和 17.1 (Android 10) 正式支持 Android 設備。 CyanogenMod 版本(與 Sailfish 操作系統兼容)10.1.x、11.0、12.1、13.0、14.1 將需要額外的努力,因為 CM 已經過時。 有關更多受支持的 Android 版本,請查看此鏈接
在本指南中,我們將使用術語 Android 基礎,它指的是您正在移植的適當基礎:LineageOS、AOSP、CAF 等
我們同樣支持Sony Open Device項目,并且為此發布了如何重構可刷機鏡像的教程:
Xperia X (Sony AOSP 6)
Xperia XA2 (Sony AOSP 8)
Xperia 10 (Sony AOSP 9)
Xperia 10 II (Sony AOSP 10)
自 sailfishos 3.4.0,添加了對 ARM 64bit 的 sailfishos userspace 支持。
從 CM 13.0 (Android 6) 開始的 Sailfish OS 適配是通過混合運行 64 位 Linux 內核和 Android HAL 構建的,而 Sailfish OS 用戶空間在 32 位模式下運行。 這種混合模式仍然受支持,但我們鼓勵移植者切換到完整的 64 位移植(以 Xperia 10 II 為參考)
兼容設備的列表,請參閱 Redirecting…
有關已使用 HADK 移植的設備的狀態列表,請參閱 Adaptations/libhybris - Mer Wiki
請參閱 Adaptations/libhybris/porters - Mer Wiki 以獲取早期階段的移植人員列表,以在 IRC 上聯系作者
AOSP 或 CAF Android 基礎支持也是可能的,但我們為更廣泛的設備選擇 LineageOS。 由移植者用 hybris 補丁修補 AOSP/CAF base。使用它的剩余差異很小(例如,使用lunch命令替代breakfast)
用于備份和恢復設備內容(例如 SD 卡或 USB 電纜到主機),以及閃存恢復圖像到設
2.2 構建設備
使用64bit 內核的 X86-64機器
sailfishos platform SDK (稍后介紹安裝方法)
sailfishos platform SDK target (稍后介紹)
至少 30 GiB 的可用磁盤空間(20 GiB 源下載 + 更多用于構建)用于完整的 Android 6 構建; 最少的下載和 HADK 構建(僅與硬件適配相關的組件)需要空間略小。 較新的 Android 基礎版本會產生越來越大的尺寸要求。
最少4GB RAM(越大越好)
第三章 準備您的設備
確認您可以備份和恢復您的設備,并且您了解設備恢復選項。 這不僅在刷寫您使用本指南構建的映像時很有用,而且在您想使用庫存 Android 將設備重置為出廠狀態時也很有用(請注意,并非所有 Android 供應商都提供可供下載的出廠映像,因此您可能需要創建 正在運行的 Android 系統的完整備份并將其存儲在安全的地方,然后再開始使用您的自定義版本擦除和重新刷新設備)。
3.1 備份和檢查您的設備
如上所述,在首次刷入 Android 基礎版本之前備份現有的 Android 原始鏡像可能會有所幫助,因為對于某些供應商而言,獲取原始鏡像可能很困難(例如,某些原始圖像只能作為適用于 Windows 的自解壓 . exe 包)或不可能(某些供應商不提供供下載的庫存鏡像)。
使用 Android Recovery(例如 TWRP 或??ClockworkMod)用于:
備份到 SD 卡:系統、數據、啟動和恢復分區
測試恢復備份(重要)
警告:雖然某些設備可以備份到內部設備存儲,但如果在移植期間您最終覆蓋了該分區,您的備份將消失。 在這種情況下(對于沒有 SD 卡插槽的設備),最好也將備份數據復制到您的開發機器(例如通過 adb pull in recovery)。
最新版本的 adb 支持使用 adb 備份功能將完整設備備份到主機。
參考ClockworkMod介紹獲取更多幫助信息
3.2 刷入和測試您的Android base 鏡像
刷入您為 Android base 構建或獲取的映像,無論是 LineageOS、CAF、AOSP 還是其他。
官方 LineageOS 刷機說明可在此 LineageOS wiki 頁面上找到。
您可能還想驗證您設備的 Android 基礎版本是否功能齊全,以避免浪費時間進行已知問題的硬件適配。 此外,您的設備可能存在一些硬件缺陷——在 Android 中進行測試會驗證所有組件是否正常工作,因此您有一個功能基線來比較您的 Sailfish OS 構建結果。
您應該最少檢查下下列特性:
OpenGL ES 2.0:使用例如 用于 Android 測試的 Gears(您將獲得將是最大刷新率的赫茲數)。
WLAN 連接:連接到 AP、ad-hoc 或使用您的設備設置移動接入點。
音頻:耳機檢測、聽筒揚聲器、揚聲器等。
藍牙:連接藍牙耳機、驗證可發現性、發送文件。
NFC:檢查設備是否可以檢測、讀取和/或寫入 NFC 標簽。
SD/MicroSD:使用文件管理器應用程序查看是否可以檢測到插入的 SD 卡。
USB:MTP、大容量存儲(如果可用)和 adb 訪問。
電話:2G/3G/LTE 通話 + 數據連接。
GPS:使用 GPS 測試,也檢查 GLONASS;典型的修復時間;全球定位系統。
傳感器:使用 AndroSensor:加速度計、接近傳感器、環境光傳感器、陀螺儀、磁力計(羅盤)、霍爾(翻蓋)、。 . .
LED:如果您的設備有通知 LED 或鍵盤背光。
相機(前后):還測試變焦、閃光燈等功能。
按鈕:增大音量、減小音量、電源、相機快門等。
視頻輸出:HDMI / MHL 連接(如果您有必要的適配器),TV輸出。
屏幕背光:暫停和背光控制,最小和最大亮度。
電池表:充電水平、電池健康、通過 USB 充電(壁式充電器和主機 PC)。
振動馬達:強度、模式。
硬件作曲家版本:通過 ADB 檢查 dumpsys SurfaceFlinger(請參閱 SF 層調試)。
指紋傳感器
調頻收音機
我們建議您寫下這些測試的結果,以便您永遠記住它們。
第四章 配置SDK
4.1 配置需要的環境變量
在本指南中,我們將引用您的 SDK、目標和源代碼的位置。 與 Android 硬件適配一樣,設備供應商 (數學公式: $ VENDOR) 和設備代號 ( $DEVICE) 也在腳本和配置文件中使用。 在本指南中,我們將使用 Nexus 5(lge/hammerhead 為其供應商/設備對),并使用 CyanogenMod 11.0 版本作為“An droid base”移植它。 因此,請確保您仔細閱讀代碼片段,并在適合您移植的設備/供應商/基礎的地方重命名。
現在在適合您的設備和設置的主機操作系統上運行以下命令:
HOST $
cat <<'EOF' > $HOME/.hadk.env
export ANDROID_ROOT="$HOME/hadk"
export VENDOR="lge"
export DEVICE="hammerhead"
# "armv7hl" is still supported, but we encourage to have full 64bit ports
export PORT_ARCH="aarch64"
EOF
cat <<'EOF' >> $HOME/.mersdkubu.profile
function hadk() { source $HOME/.hadk.env; echo "Env setup for $DEVICE"; }
export PS1="HABUILD_SDK [\\${DEVICE}] $PS1"
hadk
EOF
這樣可以確保在您使用 ubu-chroot 命令進入 Android SDK 時正確設置環境。
它還創建了一個函數 hadk,您可以使用它來設置或重置環境變量。
4.2 配置platform SDK
可以在 Sailfish OS wiki 上找到說明(“快速入門”部分就足夠了,暫時不要安裝 SDK Targets):Installation | Sailfish OS Documentation。
之后,暫時離開 PLATFORM_SDK 以使用必要的命令更新創建最新的 ~/.mersdk.profile:
PLATFORM_SDK $
exit
HOST $
cat <<'EOF' >> $HOME/.mersdk.profile
function hadk() { source $HOME/.hadk.env; echo "Env setup for $DEVICE"; }
hadk
EOF
sfossdk
筆記:
~/.mersdk.profile 為platform SDK環境初始化腳本,在該腳本中可以預置一些默認操作
例如:
修復platform SDK環境不自動掛載附屬硬盤的問題:
只需在該腳本內添加相應的掛載命令:
sudo mount /dev/sda1 ~/lib1
sudo mount /dev/sda2 ~/lib2
拉取tools:
sdk-assistant create SailfishOS-${RELEASE} https://releases.sailfishos.org/sdk/targets/Sailfish_OS-${RELEASE}-Sailfish_SDK_Tooling-i486.tar.7z
環境配置可參考:
https://github.com/CancroSailors/sailfish-build-environment
https://gitlabsh.uniontech.com/sbp/obs/obs_setup/-/blob/master/document/script/vince_set_HADK.sh
https://gitlabsh.uniontech.com/sbp/obs/obs_setup/-/blob/master/document/script/vince_init_sdk_dotfile.sh
您將需要一些默認情況下未安裝到 Platform SDK 中的工具:
android-tools-hadk 包含使用 Android SDK 所需的工具和實用程序
kmod 用于MIC的 QEMU 構建鏡像
PLATFORM_SDK $
sudo zypper ref
sudo zypper in android-tools-hadk kmod
我們強烈建議所有的移植至少使用 3.0.0.8 Platform SDK。 使用 sdk-manage 命令升級您的tool和target,或從新版本中創建(尤其是從 2.x 更新到 3.x 時)。 檢查您使用的是哪個版本:
PLATFORM_SDK $
# if no such file, you're on an old SDK version
cat /etc/os-release
有關使您的 SDK 保持最新狀態的更多信息:Welcome | Sailfish OS Documentation
筆記:
無法正常進入PLATFORM_SDK環境
su: failed to execute /bin/bash: Resource temporarily unavailable
解決辦法:
sudo sed -ri 's/4096/65535/' "$PLATFORM_SDK_ROOT"/sdks/sfossdk/etc/security/limits.d/95-nproc-sdk.conf
升級SDK
PLATFORM_SDK $
ssu re 4.2.0.21
sudo zypper ref -f
sudo zypper dup -y
sudo zypper --non-interactive in bc pigz atruncate android-tools-hadk kmod zip
4.3 配置一個安卓編譯環境
4.3.1 下載和解壓Ubuntu Chroot
為了保持構建穩定性,我們使用 Platform SDK 中的 Ubuntu GNU/Linux chroot 環境來構建我們的 Android 源代碼樹。 對于需要 OpenJDK 1.8 或更高版本的 Android 設備移植,使用以下命令下載 rootfs 并將其解壓縮到適當的位置:
PLATFORM_SDK $
TARBALL=ubuntu-focal-20210531-android-rootfs.tar.bz2
curl -O https://releases.sailfishos.org/ubu/$TARBALL
UBUNTU_CHROOT=$PLATFORM_SDK_ROOT/sdks/ubuntu
sudo mkdir -p $UBUNTU_CHROOT
sudo tar --numeric-owner -xjf $TARBALL -C $UBUNTU_CHROOT
# FIXME: to be removed when Sailfish OS 4.2.0 is out:
sudo sed -i 's/jessie/bullseye/g' /usr/bin/ubu-chroot
4.3.2 進入 Ubuntu chroot
PLATFORM_SDK $
ubu-chroot -r $PLATFORM_SDK_ROOT/sdks/ubuntu
# FIXME: Hostname resolution might fail. This error can be ignored.
# Can be fixed manually by adding the hostname to /etc/hosts
HABUILD_SDK $
# Now you are in the HABUILD_SDK environment
# To leave, just type 'exit' or Ctrl+D, and you'll be back to the PLATFORM_SDK
筆記:
ubuntu chroot環境賬號過期
[HABUILD]
sudo apt update
#執行sudo su 會提示:sudo: account validation failure, is your account locked?
#賬號過期,需要修正一下
退出chroot環境:
exit
sudo chroot $PLATFORM_SDK_ROOT/sdks/ubuntu
[Chroot]
chage -M 999999 $username
exit
4.3.3 如果您的移植工作要求openjdk 1.7或更老的版本
我們的 ubu-chroot 環境基于 20.04 LTS,它提供 OpenJDK 1.8 或更新版本。
如果您的 Android 基礎構建需要較舊的 Java 開發工具包,請改為安裝舊版 ubu-chroot:
PLATFORM_SDK $
TARBALL=ubuntu-trusty-20180613-android-rootfs.tar.bz2
curl -O https://releases.sailfishos.org/ubu/$TARBALL
UBUNTU_CHROOT=$PLATFORM_SDK_ROOT/sdks/ubuntu
sudo mkdir -p $UBUNTU_CHROOT
sudo tar --numeric-owner -xjf $TARBALL -C $UBUNTU_CHROOT
第五章 編譯安卓HAL
5.1 檢出安卓base源碼
????我們的構建流程是基于安卓源碼樹的,但是我們需要在其中編輯一些項目,打上一些讓libhybris需要的補丁以確保功能正確,并且讓內建操作和在init.*.rc文件中的服務最小化。
確保您已經在你的git設置中設置好你的姓名和郵箱地址:
HABUILD_SDK $
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
您同時需要安裝從ASOP源碼倉庫中安裝repo,參考Installing repo.
提示:如果您的移植依賴openJDK1.7或更早的版本,使用舊版基于Python2的repo工具。
在您安裝完repo命令后,下列命令將下載為了構建Android base 應用于sailfishos 固件移植的修改部分所依賴的項目。
您能移植的所有可用的Android base 變體和版本可以從這里瀏覽。
選擇一個對您的設備固件支持最好的版本。
當然,您也可以為您選擇的Android base打補丁(例如:CAF、AOSP、及其他)
您最終的sailfishos移植成果將是一個可以安裝的ZIP文件。在向您的設備部署這個zip文件之前,您將必須先燒寫相應版本的Android base,以使sailfishos可以復用Android HAL的共享組件。
如果您的主ROM與您的Android base或版本不匹配,并且您想要在您的設備上保留該ROM,然后為其尋求MultiROM支持。從它的版本V28開始,它支持啟動sailfishos。
本移植指南使用Nexus 5和CyanogenMod 11.0版本作為例子:
HABUILD_SDK $
sudo mkdir -p $ANDROID_ROOT
sudo chown -R $USER $ANDROID_ROOT
cd $ANDROID_ROOT
repo init -u git://github.com/mer-hybris/android.git -b hybris-11.0
筆記:
repo install
mkdir -p ~/bin
echo Installing repo
if ! curl https://storage.googleapis.com/git-repo-downloads/repo >~/bin/repo; then
????curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' | base64 -d >~/bin/repo
fi
sed -ri 's:#!/usr/bin/env python$:#!/usr/bin/env python3:' ~/bin/repo
chmod +x ~/bin/repo
分流代理: https://gitlabsh.uniontech.com/sbp/obs/obs_setup/-/blob/master/document/script/proxy_gfwlist.sh
使用內網AOSP內網鏡像:
sed -ri "s;[ ]+REPO_URL =.*$;\ \ REPO_URL = \'git://10.20.15.143/tools/repo.git\';" ~/bin/repo
sed -ri "s;https://android.googlesource.com;git://10.20.15.143;" .repo/manifests/default.xml
gpg 錯誤
PLATFORM_SDK $
repo init -u git://github.com/mer-hybris/android.git -b hybris-12.1 --depth 1
# 出現fatal: cannot run /usr/bin/gpg: No such file or directory 等之類的錯誤時
# 解決辦法:
rm -rf $HOME/.repoconfig
git config --global gpg.program $(which gpg2)
安卓編譯報錯libsepolwrap.so does not exist
#在安卓編譯命令后加入參數
make SELINUX_IGNORE_NEVERALLOWS=true
5.2 設備倉庫
本地manifest包含特定于設備的存儲庫,適用于 Android 以及 mer-hybris 構建。
如果您的設備已經移植完成,它的代碼可能存儲在GitHub,您應該檢查這個倉庫(選擇您正在移植的hybris-*分支),并且在這一節使用$DEVICE.xml替代創建一個文件。
首先創建目錄:
mkdir $ANDROID_ROOT/.repo/local_manifests
如果您正工作于一個新的移植,您需要自己創建本地manifest:最少包含兩個倉庫:一個kernel倉庫、一個設備配置倉庫。從lineageOS device wiki中找到這些,對于Nexus5 這個將是:Build for hammerhead | LineageOS Wiki,
下面的本地manifest也需要指向正確的分支-識別哪個匹配默認的manifest分支(stable/cm-11.0 in Nexus 5 case)。
加入下面的內容到ANDROID_ROOT/.repo/local_manifests/DEVICE.xml:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project path="device/lge/hammerhead"
name="CyanogenMod/android_device_lge_hammerhead"
revision="stable/cm-11.0" />
<project path="kernel/lge/hammerhead"
name="CyanogenMod/android_kernel_lge_hammerhead"
revision="stable/cm-11.0" />
</manifest>
同步完整的源碼,時間將會比較久:
HABUILD_SDK $
repo sync --fetch-submodules
預期同步后的磁盤空間占用為13GB(2015-09-09,hybris-11.0 branch)。根據您的網絡連接狀態,這步操作將會花費一些時間。在這期間,您可以讓您自己熟悉這份指南剩下的部分。
筆記:
repo sync GnuTLS recv error
PLATFORM_SDK $
repo sync -c --force-sync --fetch-submodules --no-clone-bundle --no-tags
同步代碼時出現如下錯誤:
error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
fatal: 遠端意外掛斷了
fatal: 過早的文件結束符(EOF)
fatal: index-pack 失敗
解決方案:
git config --global http.postBuffer 1048576000
sudo apt install gnutls-bin
repo sync 單個項目
PLATFORM_SDK $
repo sync -c --force-sync --fetch-submodules --no-clone-bundle --no-tags kernel/xiaomi/cancro
#kernel/xiaomi/cancro??是 .repo/local_manifests配置中的path。當前同步前如果有存在,請先刪除。
需要更新的三個項目,以匹配最新SDK
git -C rpm/dhd/ pull github master
git -C rpm/dhd/ checkout master
git -C hybris/droid-configs/droid-configs-device pull github master
git -C hybris/droid-configs/droid-configs-device checkout master
git -C hybris/droid-hal-version-$DEVICE/droid-hal-version pull github master
git -C hybris/droid-hal-version-$DEVICE/droid-hal-version checkout master
5.3配置掛載點信息
目前在sailfishos中,udev在initrd之后啟動,這讓我們無法使用通用的分區名稱(獨立于分區編號)。
在initrd中,我們必須硬編碼為/boot和/data分區指定/dev/mmcblkXpY節點。
在initrd之后,systemd需要掛載所有的其他需要的分區(類似 /system,/firmware,/presist,/config,...)來讓HAL層工作。需要的分區是從*.fstab和init*.rc中讀取,在其中禁用,并且創建相應的.mount單元--所有這些由$ANDROID_ROOT/rpm
(droid-hal-device)完成。
很遺憾,同樣是由于udev的后啟動,systemd不能識別.mount單元中的具名分區路徑,即使可以在/dev/block/platform/*/by-name/ or /dev/block/platform/*/*/by-name中看到已經創建好的節點。
為了解決這個問題,我們需要在hybris/hybris-boot/fixup-mountpoints中為每個設備創建分區名稱和編號之間的映射--這樣我們肯定會覆蓋到所有分區,因為如果手動通過查看fstab/rc文件完成,有些可能會被忽略。
為了獲取到這些映射,您應該燒寫并啟動Android base鏡像,并且在您的主機執行adb shell 并執行下列命令:
ls -l /dev/block/platform/*/by-name/
如果沒有產生任何結果,請嘗試:
ls -l /dev/block/platform/*/*/by-name/
有些情形下您也可以試試
ls -l /dev/block/bootdevice/by-name/
一旦您修補了 fixup-mountpoints,除非文件 .repo/local_manifests/$DEVICE.xml 指向 hybris-boot 帶有所需修復掛載點更改的 fork,請注意是否必須再次運行 repo sync--fetch-submodules 因為它會重置您的更改。
然后當你啟動到 Sailfish OS UI 時,請不要忘記上傳你的 fixup-mountpoints 補丁。
5.4構建Android base相關的部分
在 Android 構建樹中,在 bash shell(如果您當前使用的是zsh等終端,您需要切換回bash shell,因為安卓構建腳本假定您在執行bash) 中運行以下命令:
HABUILD_SDK $
source build/envsetup.sh
export USE_CCACHE=1
breakfast $DEVICE
make -j$(nproc --all) hybris-hal droidmedia
您可能需要多次迭代以發現缺少的存儲庫、工具、配置文件和其他內容。
相關的輸出部分將會在 out/target/product/$DEVICE/中,特別是:
hybris-boot.img: 內核和initrd
hybris-recovery.img: Recovery boot image
system/ 和 root/: HAL 系統庫和二進制
make hybris-hal 后output目錄 out/ 的大致大小為 10 GB(截至 2019-03-14,hybris-sony-aosp-8.1.0_r52-20190206 分支)
5.4.1 內核設置
一旦內核構建完成,您可以檢查內核配置。
您可以使用Mer kernel config checker:
HABUILD_SDK $
cd $ANDROID_ROOT
hybris/mer-kernel-check/mer_verify_kernel_config \
./out/target/product/$DEVICE/obj/KERNEL_OBJ/.config
向您的Android base 正在使用的默認配置文件應用列出的修改,哪一個?這個針對每個設備都不一樣,首先大概是這樣:
檢查$ANDROID_ROOT/device/$VENDOR/*/BoardConfig*.mk中TARGET_KERNEL_CONFIG的值。
檢查在構建內核時使用 defconfig 的 make bootimage 的輸出,例如:
??make -C kernel/lge/hammerhead ... cyanogenmod_hammerhead_defconfig
檢查您Android base的內核對于arch/arm*/configs文件夾的提交記錄,尋找默認配置文件。
如果您很著急,可以首先處理Error,但是也不要忘了回頭處理warning。在您完成所有的修改后,重新運行make hybris-boot并重新校驗。無休止的循環操作:)。最后 在沒有error之后執行make hybris-recovery。
5.4.2貢獻您的模塊
將內核存儲庫fork到您的 GitHub 主頁(在本文檔中以 myname 表示)。
對于以 CM 11.0 為基礎的 Nexus 5,下一步是(在適當的地方重命名以匹配您的設備/分支):
HABUILD_SDK $
cd kernel/lge/hammerhead
git checkout -b hybris-11.0
DEFCONFIG=arch/arm/configs/cyanogenmod_hammerhead_defconfig
git add $DEFCONFIG
git commit -m "Hybris-friendly defconfig"
git remote add myname https://github.com/myname/android_kernel_lge_hammerhead
git push myname hybris-11.0
為 github/mer-hybris 下的分支內核存儲庫創建 PR。 如果沒有,請讓 mer-hybris 管理員創建一個。
調整 .repo/local_manifests/$DEVICE.xml ,替換下列信息:
<project path="kernel/lge/hammerhead"
????name="CyanogenMod/android_kernel_lge_hammerhead"
????revision="stable/cm-11.0-XNG3C" />
為:
<project path="kernel/lge/hammerhead"
????name="myname/android_kernel_lge_hammerhead"
????revision="hybris-11.0" />
5.5常見陷阱
如果 repo sync --fetch-submodules 失敗并產生以下錯誤信息 fatal: duplicate path device/samsung/smdk4412-common in /home/nemo/android/.repo/manifest.xml, 用 rm .repo/local_manifests/roomservice.xml刪除本地 manifest。
git clone 命令出現“Forbidden . . . ” 。在 github 存儲庫上,您可能已達到 API 速率限制。 要解決此問題,請將您的 github 憑據放入 ~/.netrc。 可以通過以下鏈接找到更多信息:Perm.auth. with Git repositories
error: Cannot fetch . . . (GitError: –force-sync not enabled; cannot overwrite a local work tree., 經常在repo sync --fetch-submodules gets 中斷后發生. 這個repo工具的一個bug, 確保您的修改已經被安全地儲存 (使用 repo status), 然后使用下列命令修復:
??HABUILD_SDK $
??repo sync --force-sync
??repo sync --fetch-submodules
在某些情況下(使用并行構建),構建可能會失敗,在這種情況下,請使用 make -j1 ... 使用非并行構建重試并查看沒有并行作業輸出的錯誤消息。 構建通常以以下輸出結束:
??HABUILD_SDK $
??...
??Install: .../out/target/product/$DEVICE/hybris-recovery.img
??...
??Install: .../out/target/product/$DEVICE/hybris-boot.img
備注:
在使用第三方android源碼編譯hybris-boot.img時,注意hybris-boot文件夾里面的Android.mk中涉及到的HYBRIS_BOOT_PART以及HYBRIS_DATA_PART,如果么有被正確識別到,可以在文件里面將其直接寫死成設備正確的掛載分區點.例如:
HYBRIS_BOOT_PART :=/dev/block/platform/soc/soc:ap-apb/71900000.ufs/by-name/boot
HYBRIS_DATA_PART :=/dev/block/platform/soc/soc:ap-apb/71900000.ufs/by-name/userdata
筆記:
做適配時,需要翻看如下三個網站:
GitHub - mer-hybris/hadk-faq: FAQ for Sailfish OS porting guide (HADK)
kr9xx - collabedit
site:Sailfish OS IRC logs??some_message
platform SDK 與sailfishos SDK的用途差異:
platform SDK:
1.使用chroot作為構建環境,可以直接直接掛載本地文件目錄作為工作環境。
2.一般用于構建需要與Android base結合一起構建的軟件包。
sailfishos SDK:
1.使用docker容器,或VB虛擬機作為構建環境,工作環境基本與本機完全獨立。
2.一般用于構建應用層軟件包,且需要使用platform SDK構建出的hal層軟件包作為應用層依賴。
platform SDK編譯常用命令:
#設置生成的rpm包的target
sb2 -d SailfishOS-latest-aarch64
#指定spec文件編譯rpm包
mb2 -s $SPECFILE build
#生成帶debug信息的軟件包
mb2 -t $VENDOR-$DEVICE-$PORT_ARCH -s $SPECFILE build --enable-debug #若為qmake的構建的軟件包,則需要同時將qmake的構建模式變更為debug模式,不配置的話qt構建的gcc命令行會默認添加-no-debug參數,導致調試軟件包為空。
#從軟件源安裝軟件包
zypper in openssh-clients
# 手動安裝軟件包到target
sb2 -t $VENDOR-$DEVICE-$PORT_ARCH -m sdk-install -R zypper in $PACKAGENAME
或者
sdk-assistant target package-install $VENDOR-$DEVICE-$PORT_ARCH xxx.rpm
#進入指定target(可以查看安裝包信息狀態)
sdk-assistant target maintain
QT配置:
#定義生成dbug模式軟件包
#在pro文件最后一行添加如下定義:
CONFIG += debug
#release模式的定義為CONFIG += release
application SDK編譯常用命令:
#生成帶debug信息的軟件包
sfdk --specfile=rpm/geoclue-providers-hybris.spec build --enable-debug
#在target中安裝編譯依賴
sfdk --specfile=rpm/droidmedia.spec build-requires
#常規構建命令
sfdk --specfile=rpm/droidmedia.spec build
#設置編譯目標環境
sfdk config --push target SailfishOS-4.1.0.24-aarch64
#進入SDK構建虛擬機
sfdk tools exec SailfishOS-4.1.0.24-aarch64
后半部分持續更新......
總結
以上是生活随笔為你收集整理的Sailfish OS构建(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端技巧——js篇
- 下一篇: 【原创】C#中的抽象类(abstract