当前位置: 首页 > 工具软件 > Sailfish > 使用案例 >

Sailfish OS构建(1)

子车峰
2023-12-01

第一章 概述

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

后半部分持续更新......

 类似资料: