SailfishOS移植到Redmi-5-Plus的一些记录(2)

接上 http://birdzhang.xyz/2018/03/30/SailfishOS%E7%A7%BB%E6%A4%8D%E5%88%B0Redmi-5-Plus%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AE%B0%E5%BD%95/

本文章主要针对 hybris 15.1的移植

挑选设备源码

mer-hybris的android hybris-15.1是基于lineageos的,所以我们在没有官方/非官方lineageos用的时候,也要找基于lineage的第三方rom,如国内的Mokee,国外的OmniROM等,只需要稍微改一点devicetree就可以用了

适配hybris-15.1的一些更改

一、Failed to initialize property area

目前的解决方法是注释掉这个, 还有可能是没有关闭selinux或者没有初始化sailfish所需要的android init rc文件有关

system/core/init/property_service.cpp, 将72行的exit(1);注释掉

二、kernel,device部分

  1. 内核部分主要需要注意的是你的设备是否是有 /vendor分区的,project treble的都会有一个单独的/vendor分区,这个需要注意。

    可以通过这个里查看 arch/arm/boot/dts/qcom/msm8953.dtsi (根据你自己cpu来区分,找不到的话就用grep找一下)

    如下,可以看到有vendor跟system分区单独挂载,这个地方可以看谷歌对system-as-root的说明便于理解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    firmware: firmware {
    android {
    compatible = "android,firmware";
    fstab {
    compatible = "android,fstab";
    vendor {
    compatible = "android,vendor";
    dev = "/dev/block/platform/soc/7824900.sdhci/by-name/cust";
    type = "ext4";
    mnt_flags = "ro,barrier=1,discard";
    fsmgr_flags = "wait";
    status = "ok";
    };
    system {
    compatible = "android,system";
    dev = "/dev/block/platform/soc/7824900.sdhci/by-name/system";
    type = "ext4";
    mnt_flags = "ro,barrier=1,discard";
    fsmgr_flags = "wait";
    status = "ok";
    };

    也可以通过device tree的 fstab.qcom 查看,如果没有,需要加上去(至少在vince上面是这样,因为后面的dhd要靠这个来判断),如我的需要加这两行

    1
    2
    /dev/block/bootdevice/by-name/system            /system                 ext4    ro,barrier=1                                                    wait,recoveryonly
    /dev/block/bootdevice/by-name/cust /vendor ext4 ro,barrier=1 wait,recoveryonly

    有的设备/dev/block/bootdevice/by-name/system挂载到/下面(对应下面的dhd部分的makefstab_skip_entries),而我的设备/vendor是来自/cust(也是迷 @[email protected]

  1. device tree部分注释掉启用full treble的部分

    如我的设备需要把下面这些注释掉,否则selinux的政策文件会安装到/vendor下面,不会在根目录下产生,sfos需要在根下面有。

    扩展阅读: https://source.android.com/security/selinux?hl=zh_cn

    1
    2
    3
    4
    5
    6
    # Treble
    #BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED := true
    #PRODUCT_FULL_TREBLE_OVERRIDE := true
    #PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE := 27
    #BOARD_VNDK_VERSION := current
    #BOARD_VNDK_RUNTIME_DISABLE := true

三、dhd,dhc部分

https://wiki.merproject.org/wiki/Adaptations/faq-hadk 搜索 15.1也会找到一些需要注意的地方

修改dhd的spec文件,添加

1
2
# On Android 8 the system partition is (intended to be) mounted on /.
%define makefstab_skip_entries / /vendor /dev/stune /dev/cpuset /sys/fs/pstore /dev/cpuctl

也不一定全部要加上,我的设备/system,/vendor就不自动挂载,需要改成这样, 可以先不加然后telnet上去看看这里目录下有没有文件吧

1
%define makefstab_skip_entries /dev/stune /dev/cpuset /sys/fs/pstore /dev/cpuctl

这样会生成system.mountvendor.mount,启动systemd的时候会挂载上

对于有些设备可能提示kgsl kgsl-3d0: |_load_firmware| request_firmware(a530_pm4.fw) failed: -2,需要做一个软链到 /lib/firmware

https://github.com/mer-hybris/droid-config-sony-nile/blob/91c15efb576c29a9d41cc4cd1d40c62ddcce9824/sparse/lib/firmware

调试

暂无很详细的,主要是看dmesg,journalctl等看看把出错的都修了。

通话声音

如果可以打通电话但是没有声音,则需要 pulseaudio-modules-droid-hidl 1.0版本(截止2019-09-24),然后配合新的ril配置文件 https://github.com/mer-hybris/droid-config-sony-nile/tree/master/sparse/etc/ofono

界面crash

看dmesg/logcat/journactl里面是不是有binder的信息,打补丁吧,至于打哪些只能靠猜(大雾

SailfishOS移植到Redmi 5 Plus的一些记录

移植旗鱼系统到红米5p的过程记录

!!!可以去ホロ 🐺的博客看看更详细的!!!

https://blog.yoitsu.moe/category/sailfish.html

准备工作

搭建环境

Android编译环境(HADK 第4章)

需要先配置一下hadk的环境变量,一共三个文件,可以参考这里: https://github.com/CancroSailors/sailfish-build-environment

然后source ~/.hadk.env一下

1. 安装git等

sudo apt-get install git

2. 同步CM的代码

配置git的用户名跟邮箱,填自己的就行,随便填也行
1
2
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
创建检出代码的目录,所在的盘空间要足够
1
2
3
4
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-14.1
配置你的设备的仓库,这里是vince
1
2
3
4
5
6
7
8
9
10
11
12
mkdir $ANDROID_ROOT/.repo/local_manifests
cat <<'EOF' >> $ANDROID_ROOT/.repo/local_manifests/vince.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project path="device/xiaomi/vince" name="Sailfish-On-Vince/device_xiaomi_vince" revision="cm-14.1" />
<project path="vendor/xiaomi/vince" name="Sailfish-On-Vince/vendor_xiaomi_vince" revision="cm-14.1" />
<project path="kernel/xiaomi/vince" name="Sailfish-On-Vince/kernel_xiaomi_msm8953" revision="cm-14.1" />
<project path="hybris/droid-hal-version-vince" name="Sailfish-On-Vince/droid-hal-version-vince" revision="master" />
<project path="hybris/droid-config-vince" name="Sailfish-On-Vince/droid-config-vince" revision="master" />
<project path="rpm" name="Sailfish-On-Vince/droid-hal-vince" revision="master" />
</manifest>
EOF
同步代码

repo sync --fetch-submodules

如果你要求快,可以用 repo sync --fetch-submodules -c --no-tags --no-clone-bundle,这样只会拉取当前要用的代码,但是不方便后面的修改提交

出错就多同步几次

Mer编译环境

参见官方教程: https://sailfishos.org/wiki/Platform_SDK_Installation

安装Platform SDK

1
2
3
4
5
6
7
8
9
export PLATFORM_SDK_ROOT=/srv/mer
curl -k -O http://releases.sailfishos.org/sdk/installers/latest/Jolla-latest-SailfishOS_Platform_SDK_Chroot-i486.tar.bz2 ;
sudo mkdir -p $PLATFORM_SDK_ROOT/sdks/sfossdk ;
sudo tar --numeric-owner -p -xjf Jolla-latest-SailfishOS_Platform_SDK_Chroot-i486.tar.bz2 -C $PLATFORM_SDK_ROOT/sdks/sfossdk ;
echo "export PLATFORM_SDK_ROOT=$PLATFORM_SDK_ROOT" >> ~/.bashrc
echo 'alias sfossdk=$PLATFORM_SDK_ROOT/sdks/sfossdk/mer-sdk-chroot' >> ~/.bashrc ; exec bash ;
echo 'PS1="PlatformSDK $PS1"' > ~/.mersdk.profile ;
echo '[ -d /etc/bash_completion.d ] && for i in /etc/bash_completion.d/*;do . $i;done' >> ~/.mersdk.profile ;
sfossdk

另开一个终端,输入sfossdk,进入mer下

安装targets,官方教程:https://sailfishos.org/wiki/Platform_SDK_Target_Installation

其实就是执行下面的命令,要下载这两个包,过程有些慢

(2019-06-13更新,修复链接地址为最新的)

1
2
sdk-assistant create xiaomi-vince-latest http://releases.sailfishos.org/sdk/targets/Sailfish_OS-latest-Sailfish_SDK_Tooling-i486.tar.7z
sdk-assistant create xiaomi-vince-armv7hl http://releases.sailfishos.org/sdk/targets/Sailfish_OS-latest-Sailfish_SDK_Target-armv7hl.tar.7z

更新到最新(Update to latest)

1
2
3
sudo ssu re x.y.z.ab
sudo zypper ref
sudo zypper dup

安装打包的工具

1
sudo zypper in android-tools createrepo_c

修改fixup-mountpoints

文件在hybris/hybris-boot/fixup-mountpoints,添加你的设备的,这里是vince。
adb到手机上,输入ls -l /dev/block/platform/*/by-name/, 获取分区信息,或者其他路径的,HADK里面有写

Camera支持

1
2
3
cd $ANDROID_ROOT/external/droidmedia
echo 'DROIDMEDIA_32 := true' >> env.mk #针对64位的系统
echo 'FORCE_HAL:=1' >> env.mk #使用HAL1,根据自己机型设置

编译hybris-hal

1
2
3
4
5
cd $ANDROID_ROOT
source build/envsetup.sh
export USE_CCACHE=1
breakfast $DEVICE
make -j8 hybris-hal

期间可能会报错,谷歌搜一下

验证Kernel

1
2
cd $ANDROID_ROOT
hybris/mer-kernel-check/mer_verify_kernel_config ./out/target/product/$DEVICE/obj/KERNEL_OBJ/.config

出现WARNING或者ERROR,将提示的加入到你的defconfig中,我的在kernel/xiaomi/vince/arch/arm64/configs/vince_defconfig
然后执行make hybris-root后重新验证。没有出现ERROR后可以执行make hybris-recovery

打包dhd(HADK 第7章)

再开一个终端(我们这里称终端2),输入sfossdk,进入mer打包环境下

1
2
cd $ANDROID_ROOT
rpm/dhd/helpers/build_packages.sh -d

打包droidmedia与audioflingerglue

如果你的机器是32位的话那么下面的命令去掉_32,下面的也一样

在终端1中

1
make -j$(nproc --all) $(external/droidmedia/detect_build_targets.sh $PORT_ARCH $(gettargetarch))

在终端2中

1
2
3
4
5
6
7
8
9
10
DROIDMEDIA_VERSION=$(git --git-dir external/droidmedia/.git describe --tags | sed \
-r "s/\-/\+/g")
rpm/dhd/helpers/pack_source_droidmedia-localbuild.sh $DROIDMEDIA_VERSION
mkdir -p hybris/mw/droidmedia-localbuild/rpm
cp rpm/dhd/helpers/droidmedia-localbuild.spec \
hybris/mw/droidmedia-localbuild/rpm/droidmedia.spec
sed -ie "s/0.0.0/$DROIDMEDIA_VERSION/" \
hybris/mw/droidmedia-localbuild/rpm/droidmedia.spec
mv hybris/mw/droidmedia-$DROIDMEDIA_VERSION.tgz hybris/mw/droidmedia-localbuild
rpm/dhd/helpers/build_packages.sh --build=hybris/mw/droidmedia-localbuild

在终端1中

1
make -j$(nproc --all) $(external/audioflingerglue/detect_build_targets.sh $PORT_ARCH $(gettargetarch))

在终端2中

1
2
3
4
5
6
7
8
9
10
AUDIOFLINGERGLUE_VERSION=$(git --git-dir external/audioflingerglue/.git describe --tags | sed \
-r "s/\-/\+/g")
rpm/dhd/helpers/pack_source_audioflingerglue-localbuild.sh $AUDIOFLINGERGLUE_VERSION
mkdir -p hybris/mw/audioflingerglue-localbuild/rpm
cp rpm/dhd/helpers/audioflingerglue-localbuild.spec \
hybris/mw/audioflingerglue-localbuild/rpm/audioflingerglue.spec
sed -ie "s/0.0.0/$AUDIOFLINGERGLUE_VERSION/" \
hybris/mw/audioflingerglue-localbuild/rpm/audioflingerglue.spec
mv hybris/mw/audioflingerglue-$AUDIOFLINGERGLUE_VERSION.tgz hybris/mw/audioflingerglue-localbuild
rpm/dhd/helpers/build_packages.sh --build=hybris/mw/audioflingerglue-localbuild

然后重新打包dhd

1
rpm/dhd/helpers/build_packages.sh --droid-hal

打包其他中间件包(mw)

注意到 https://wiki.merproject.org/wiki/Adaptations/faq-hadk 搜索当前版本需要对应的mw版本号,不一定用最新的

执行 rpm/dhd/helpers/build_packages.sh --mw ,然后选择 all 即可

【进阶】上传到obs打包

将droid-local-repo/vince下 droid-hal-vince/.rpm 跟audioflingerglue.rpm 、 droidmedia*.rpm 上传到obs的droid-hal-vince下

例如这些包:https://build.merproject.org/package/show/nemo:devel:hw:xiaomi:vince/droid-hal-vince

obs打包还需要dhc,dhv等等几个包,此处不详细说明了,可以到 https://github.com/mer-hybris 看其他机型的

打包dhv

也就是 droid-hal-$DEVICE-version

rpm/dhd/helpers/build_packages.sh -v

如果提示 droid-configs 之类的找不到,需要手动安装

1
sb2 -t $VENDOR-$DEVICE-$PORT_ARCH -R -msdk-install zypper -n install droid-config-$DEVICE

[email protected]@[email protected]@.ks

~obs打包完之后,将droid-config-vince-kickstart-configuration-0.2.4*.armv7hl.rpm 下载下来,解压获得[email protected]@[email protected]@.ks放到$ANDROID_ROOT下面~

1
2
3
4
5
6
7
8
cd $ANDROID_ROOT
HA_REPO="repo --name=[email protected]@"
HA_DEV="repo --name=[email protected]@"
KS="[email protected]@[email protected]@.ks"
sed \
"/$HA_REPO/i$HA_DEV --baseurl=file:\/\/$ANDROID_ROOT\/droid-local-repo\/$DEVICE" \
$ANDROID_ROOT/hybris/droid-configs/installroot/usr/share/kickstarts/$KS \
> $KS

镜像制作

1
2
3
4
5
6
7
8
9
10
cd $ANDROID_ROOT
RELEASE=2.1.4.14
EXTRA_NAME=-alpha1
hybris/droid-configs/droid-configs-device/helpers/process_patterns.sh
sudo mic create fs --arch=$PORT_ARCH \
--tokenmap=ARCH:$PORT_ARCH,RELEASE:$RELEASE,EXTRA_NAME:$EXTRA_NAME \
--record-pkgs=name,url \
--outdir=sfe-$DEVICE-$RELEASE$EXTRA_NAME \
--pack-to=sfe-$DEVICE-$RELEASE$EXTRA_NAME.tar.bz2 \
$ANDROID_ROOT/[email protected]@[email protected]@.ks

在当前目录下会有一个 sfe-$DEVICE-$RELEASE$EXTRA_NAME目录,下面的 sailfishos-$DEVICE-$RELEASE$EXTRA_NAME.zip就是要使用的刷机包

刷机

刷入 lineageos-14.1的包,刷入上面的sailfishos-$DEVICE-$RELEASE$EXTRA_NAME.zip的包,重启

可以参考 https://wiki.merproject.org/wiki/Adaptations/libhybris/Install_SailfishOS_for_Vince

调试

欢迎加入 IRC #jolla-cn #sailfishos-porters (只限英文交流) 或 https://t.me/joinchat/GTqoL1HLIYXWNf-JeijTAg 讨论

相关文档