Skip to content

Instantly share code, notes, and snippets.

@paulivil
Forked from kimmoli/onyx-sfdroid.md
Last active January 13, 2021 08:15
Show Gist options
  • Select an option

  • Save paulivil/9d28f98ad40eae350464c35b155e6054 to your computer and use it in GitHub Desktop.

Select an option

Save paulivil/9d28f98ad40eae350464c35b155e6054 to your computer and use it in GitHub Desktop.
onyx-sfdroid
#!/bin/bash
source build/envsetup.sh
set -e
SOURCE_DIR=~/android/system
INSTALLDIR=~/onyx_sfdroid
DEVICE=onyx
sudo mkdir -p $INSTALLDIR/root
SFDROID_PATH=/usr/libexec/sfdroid
HW_PATH=$SFDROID_PATH/system/lib/hw
BIN_PATH=$SFDROID_PATH/system/bin
LIB_PATH=$SFDROID_PATH/system/lib
FRAMEWORK_PATH=$SFDROID_PATH/system/framework
PRIV_PATH=$SFDROID_PATH/system/priv-app
sudo mkdir -p $INSTALLDIR/root/$LIB_PATH
sudo mkdir -p $INSTALLDIR/root/$HW_PATH
sudo mkdir -p $INSTALLDIR/root/$BIN_PATH
sudo mkdir -p $INSTALLDIR/root/$FRAMEWORK_PATH
sudo mkdir -p $INSTALLDIR/root/$PRIV_PATH/Settings
sudo mkdir -p $INSTALLDIR/root/$PRIV_PATH/SystemUI
sudo chown root:root -R $INSTALLDIR/root
lunch cm_$DEVICE-eng
echo ==== building libhardware ====
cd hardware/libhardware
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/libhardware.so $INSTALLDIR/root/$LIB_PATH
sudo chown root:root $INSTALLDIR/root/$LIB_PATH/libhardware.so
## netd
echo ==== building netd ====
cd system/netd/server
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/bin/netd $INSTALLDIR/root/$BIN_PATH
sudo chown root:root $INSTALLDIR/root/$BIN_PATH/netd
# surfaceflinger
echo ==== building surfaceflinger ====
cd frameworks/native/services/surfaceflinger
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/libsurfaceflinger.so $INSTALLDIR/root/$LIB_PATH
sudo chown root:root $INSTALLDIR/root/$LIB_PATH/libsurfaceflinger.so
# sensorservice (sfdroid sensors)
echo ==== building sensorservice ====
cd frameworks/native/services/sensorservice
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/libsensorservice.so $INSTALLDIR/root/$LIB_PATH
sudo chown root:root $INSTALLDIR/root/$LIB_PATH/libsensorservice.so
echo ==== building sfdroid sensors ====
cd hardware/libhardware/modules/sfdroid_sensors
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/hw/sfdroid_sensors.default.so $INSTALLDIR/root/$HW_PATH
sudo chown root:root $INSTALLDIR/root/$HW_PATH/sfdroid_sensors.default.so
# libinputflinger
echo ==== building libinputflinger ====
cd frameworks/native/services/inputflinger
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/libinputflinger.so $INSTALLDIR/root/$LIB_PATH
sudo chown root:root $INSTALLDIR/root/$LIB_PATH/libinputflinger.so
echo ==== building mediaserver ====
cd frameworks/av/media/mediaserver
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/bin/mediaserver $INSTALLDIR/root/$BIN_PATH
sudo chown root:root $INSTALLDIR/root/$BIN_PATH/mediaserver
# sharebuffer
echo ==== building sharebuffer ====
cd hardware/libhardware/modules/sharebuffer
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/hw/sharebuffer.default.so $INSTALLDIR/root/$HW_PATH
echo ==== building frameworks base core res ====
cd frameworks/base/core/res
mm
cd $SOURCE_DIR
# framework: Network State Trackers
# frameworks/base/wifi/java/android/net/wifi
echo ==== building frameworks base core java android net ====
cd frameworks/base/core/java/android/net
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/framework/framework.jar $INSTALLDIR/root/usr/libexec/sfdroid/system/framework
sudo chown root:root $INSTALLDIR/root/usr/libexec/sfdroid/system/framework/framework.jar
sudo cp out/target/product/$DEVICE/system/framework/ext.jar $INSTALLDIR/root/usr/libexec/sfdroid/system/framework
sudo chown root:root $INSTALLDIR/root/usr/libexec/sfdroid/system/framework/ext.jar
sudo chmod +r $INSTALLDIR/root/usr/libexec/sfdroid/system/framework/ext.jar
# services.jar: AlarmManagerService, ConnectivityService, droidmedia AppOps
echo ==== building frameworks base services java com android server ====
cd frameworks/base/services/java/com/android/server
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/framework/services.jar $INSTALLDIR/root/usr/libexec/sfdroid/system/framework
sudo chown root:root $INSTALLDIR/root/usr/libexec/sfdroid/system/framework/services.jar
# libandroid_servers.so AlarmManagerService, PowerManagerService, ActivityStackSupervisor, sfdroid_Helpers
echo ==== building frameworks base services core jni ====
cd frameworks/base/services/core/jni
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/libandroid_servers.so $INSTALLDIR/root/$LIB_PATH
sudo chown root:root $INSTALLDIR/root/$LIB_PATH/libandroid_servers.so
echo ==== building external dbus ====
cd external/dbus
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/libdbus.so $INSTALLDIR/root/$LIB_PATH
sudo chown root:root $INSTALLDIR/root/$LIB_PATH/libdbus.so
echo ==== building frameworks base core jni ====
cd frameworks/base/core/jni
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/lib/libandroid_runtime.so $INSTALLDIR/root/$LIB_PATH
sudo chown root:root $INSTALLDIR/root/$LIB_PATH/libandroid_runtime.so
# Settings:
echo ==== building apps Settings ====
cd packages/apps/Settings
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/priv-app/Settings/Settings.apk $INSTALLDIR/root/$PRIV_PATH/Settings
sudo chown root:root $INSTALLDIR/root/$PRIV_PATH/Settings/Settings.apk
echo ==== building frameworks base packages SysteUI ====
cd frameworks/base/packages/SystemUI/src/com/android/systemui
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/priv-app/SystemUI/SystemUI.apk $INSTALLDIR/root/$PRIV_PATH/SystemUI
sudo chown root:root $INSTALLDIR/root/$PRIV_PATH/SystemUI/SystemUI.apk
echo ==== building opt net ethernet ====
cd frameworks/opt/net/ethernet/java/com/android/server
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/framework/ethernet-service.jar $INSTALLDIR/root/usr/libexec/sfdroid/system/framework
sudo chown root:root $INSTALLDIR/root/usr/libexec/sfdroid/system/framework/ethernet-service.jar
echo ==== building opt net wifi ====
cd frameworks/opt/net/wifi/service/java/com/android/server/wifi
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/framework/wifi-service.jar $INSTALLDIR/root/usr/libexec/sfdroid/system/framework
sudo chown root:root $INSTALLDIR/root/usr/libexec/sfdroid/system/framework/wifi-service.jar
echo ==== building frameworks base cmds am ====
cd frameworks/base/cmds/am/src/com/android/commands/am/
mm
cd $SOURCE_DIR
sudo cp out/target/product/$DEVICE/system/framework/am.jar $INSTALLDIR/root/usr/libexec/sfdroid/system/framework
sudo chown root:root $INSTALLDIR/root/usr/libexec/sfdroid/system/framework/am.jar
echo === Build complete ===
echo === tarballing ===
cd $INSTALLDIR/root
sudo tar -czvf $INSTALLDIR/$DEVICE_sfdroid.tgz .
cd $INSTALLDIR
echo === DONE ===
# set up the global environment
on init
export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
# This is not 64-bit safe -stskeeps
export LD_LIBRARY_PATH /usr/libexec/sfdroid/system/lib:/usr/libexec/droid-hybris/lib-dev-alog:/vendor/lib:/system/lib
export ANDROID_BOOTLOGO 1
export ANDROID_ROOT /system
export ANDROID_ASSETS /system/app
export ANDROID_DATA /data
export ANDROID_STORAGE /storage
export ASEC_MOUNTPOINT /mnt/asec
export LOOP_MOUNTPOINT /mnt/obb
export BOOTCLASSPATH /system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/usr/libexec/sfdroid/system/framework/ext.jar:/usr/libexec/sfdroid/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar
export SYSTEMSERVERCLASSPATH /system/framework/org.cyanogenmod.platform.jar:/system/framework/org.cyanogenmod.hardware.jar:/usr/libexec/sfdroid/system/framework/services.jar:/usr/libexec/sfdroid/system/framework/ethernet-service.jar:/usr/libexec/sfdroid/system/framework/wifi-service.jar
export LD_PRELOAD libsigchain.so:libNimsWrap.so:libopx_cam.so
on boot
class_start sfdroid
service sfdroid_zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class sfdroid
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart sfdroid_media
onrestart restart sfdroid_netd
# netd is required for sfdroid. but it has been patched to not break sfos but probably still needs to be reworked.
service sfdroid_netd /usr/libexec/sfdroid/system/bin/netd
class sfdroid
socket netd stream 0660 root system
socket dnsproxyd stream 0660 root inet
socket mdns stream 0660 root system
socket fwmarkd stream 0660 root inet
service sfdroid_sf /system/bin/surfaceflinger
class sfdroid
user system
group graphics drmrpc
onrestart restart sfdroid_zygote
service sfdroid_media /usr/libexec/sfdroid/system/bin/mediaserver
class main
user media
group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm qcom_diag
ioprio rt 4
service sfdroid_keystore /system/bin/keystore /data/misc/keystore
class main
user keystore
group keystore drmrpc
service sfdroid_vold /system/bin/vold
class sfdroid
socket vold stream 0660 root mount
ioprio be 2
service sfdroid_healthd /sbin/healthd
class sfdroid
critical
seclabel u:r:healthd:s0
service sfdroid_lmkd /system/bin/lmkd
class sfdroid
socket lmkd seqpacket 0660 system system

sfdroid for onyx

status

The general idea is to bring Android app support to SailfishOS on OnePlus X (ONE E1003 a.k.a. onyx). Now you only get the barebone CM that boots and is mostly functional, but won't give you working SailfishOS with Android support. Bluetooth seems to mute audio. I haven't tried telephony. Turning selinux off doesn't seem to have any effect (SailfishOS doesn't work with selinux).

initial preparation

When in TWRP go to Advanced>Terminal and type getprop. Look for ro.product.device. If it says ONE go ahead to next stage. If it says onyx means you are stuck with version 2.x of TWRP -try updating inside recovery by choosing install image. TWRP 3.0-1 will change ro.product.device to ONE. This source code checks out with OxygenOS 2.2.0 so I suggest updating or downgrading the stock firmware to that level. Stock recovery will install stock firmware at least the rooted one. To install TWRP you need to unlock the bootloader. Instructions on https://forum.xda-developers.com/oneplus-x/general/guide-oneplus-x-how-to-unlock-t3748730. From this point on the instructions cover Linux environment. Storage occupied is somewhere around 120 GB. flash card of at least 1 GB for the zipped installers.

prerequisites

We'll be using ubuntu chroot from Sailfish HADK, so prepare the environment for starters. https://sailfishos.org/wp-content/uploads/2017/09/SailfishOS-HardwareAdaptationDevelopmentKit-2.0.1.pdf Building instructions for onyx https://gist.github.com/rinigus/7fa2f6f9aebfa340d8496ec8f46d0e43 Note that for sfdroid_renderer by kimmoli to install you have to add libhybris-libGLESv1 to patterns. Sfdroid can be made into an installable package.

setup build env for CM

create directories and init repo

mkdir -p ~/android/system
cd ~/android/system/
repo init -u https://github.com/LineageOS/android.git -b stable/cm-12.1-YOG7D
cd .repo/local_manifests
curl -O https://gist.githubusercontent.com/paulivil/9d28f98ad40eae350464c35b155e6054/raw/onyx.xml
The actual sfdroid patched sources are commented out at this stage.

onyx.xml is among the files in this gist

change aosp revision to r38

~/android/system/.repo/manifest.xml

-           revision="refs/tags/android-5.1.1_r37" />
+           revision="refs/tags/android-5.1.1_r38" />

download sources

This takes some time, about 80GBytes

cd ~/android/system
repo sync

remove duplicate configpanel, keyhandler and TapToWake

rm -rI ~/android/system/device/oppo/common/configpanel/
rm -rI ~/android/system/device/oppo/common/keyhandler/
rm -rI ~/android/system/device/oppo/common/cmhw/

comment out config_speed_up_audio_on_mt_calls

~/android/system/device/oneplus/onyx/overlay/packages/services/Telecomm/res/values/config.xml

-    <bool name="config_speed_up_audio_on_mt_calls">true</bool>
+<!--    <bool name="config_speed_up_audio_on_mt_calls">true</bool> -->

enter ubuntu chroot

sdk
ubu-chroot -r $MER_ROOT/sdks/ubuntu
cd ~/android/system

install unzip

This might be needed or not (ref bouncycastle errors)

sudo apt-get install unzip

build

hadk
cd ~/android/system
source build/envsetup.sh
export USE_CCACHE=1
breakfast $DEVICE
croot
brunch $DEVICE

Build time was roughly 4 hours with i3

Current status: make completed successfully

copy zip to device

scp /home/pauli/android/system/out/target/product/onyx/cm-12.1-20180415-UNOFFICIAL-onyx.zip nemo@....:/media/sdcard/nnnn-nnnn/

flash with twrp

Wipe, factory reset

Install zip

reboot system

patching the sources for sfdroid

Uncomment the sfdroid sources, comment out the matching sources from default.xml located in .repo/manifests

cd ~/android/system
repo sync --force-sync

build modified packages

place buildscript on the root of ~/android/system and make it runnable chmod a+x buildscript.sh

sdk
ubu-chroot -r $MER_ROOT/sdks/ubuntu
hadk
cd ~/android/system
./buildscript.sh
exit

prepare the package

Use pack-sfdroid.sh (make it runnable first) in the same way like buildscript to create archive make hybris/mw/sfdroid folder Copy the resulting sfdroid-0.0.0.tgz to your hybris/mw/sfdroid folder make rpm folder within sfdroid folder and place sfdroid.spec in there. Once you get to prepare your SailfishOS hardware adaptation you can also build the installable package rpm/dhd/helpers/build_packages.sh --build=hybris/mw/sfdroid add sfdroid to patterns eg. onyx specific section and don't forget to add libhybris-libGLESv1 (in addition to v2)

sfdroid_renderer

This will bring sfdroid launcher (two actually) to Sailfish. But you have to install it separately once Sailfish is up and running. sfdroid_renderer is built in obs, https://build.merproject.org/package/show/home:kimmoli:sfdroid/sfdroid_renderer

ssu ar kimmoli-sfdroid http://repo.merproject.org/obs/home:/kimmoli:/sfdroid/sailfish_latest_armv7hl/
devel-su pkcon repo-set-data kimmoli-sfdroid refresh-now true
devel-su pkcon install sfdroid_renderer

init.rc patching

located at PlatformSDK:$ANDROID_ROOT/system/core/rootdir

import /init.trace.rc
+import /init.sfdroid.rc
#Include CM's extra init file

If you build your hybris-hal after adding this line it will transfer to your device. Alternatively you can edit your file via ssh connection or adb shell (using vi). drop init.sfdroid.rc file into root of hybris/droid-configs/sparse folder before processing patterns

other stuff

OpenJDK 7 needed for succesfull compilation.
If you get some BouncyCastle error with file keys, run this command (change paths) from outside ubuntu chroot

java -jar \
/home/$USER/android/system/out/host/linux-x86/framework/dumpkey.jar \
build/target/product/security/testkey.x509.pem \
build/target/product/security/cm.x509.pem \
build/target/product/security/cm-devkey.x509.pem > \
/home/$USER/android/system/out/target/product/scorpion/obj/PACKAGING/ota_keys_intermediates/keys
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project name="LineageOS/android_device_oppo_common" path="device/oppo/common" remote="github" revision="ec34d17cd81afd459071e2f6e663b1d65338257e" />
<project name="LineageOS/android_device_qcom_common" path="device/qcom/common" remote="github" revision="d51a421eb303a7eb4917902cb133a662e71f3916" />
<project name="MasterAwesome/android_vendor_oneplus_onyx" path="vendor/oneplus/onyx" remote="github" revision="cb13df5d523058a8233a3201c2fe2404c6d6ddfb"/>
<project name="MasterAwesome/android_device_oneplus_onyx" path="device/oneplus/onyx" remote="github" revision="a995b5c5ec7b67b4a219443445fc9c61bdfa3833"/>
<project name="MasterAwesome/android_kernel_oneplus_msm8974" path="kernel/oneplus/msm8974" remote="github" revision="ba2cf5c90d04dcd7a1c8fc572c0fa84c2f63a59b" />
<project name="LineageOS/android_hardware_qcom_fm" path="hardware/qcom/fm" remote="github"/>
<!--<project name="sfdroid/android_frameworks_base_old" path="frameworks/base" remote="github" revision="oneplus-onyx" />
<project name="sfdroid/android_hardware_libhardware" path="hardware/libhardware" remote="github" revision="oneplus-onyx" />
<project name="sfdroid/android_frameworks_native" path="frameworks/native" remote="github" revision="oneplus-onyx" />
<project name="sfdroid/android_external_dbus" path="external/dbus" remote="github" revision="oneplus-onyx" />
<project name="sfdroid/android_frameworks_opt_net_wifi" path="frameworks/opt/net/wifi" remote="github" revision="oneplus-onyx" />
<project name="sfdroid/android_frameworks_opt_net_ethernet" path="frameworks/opt/net/ethernet" remote="github" revision="oneplus-onyx" />
<project name="sfdroid/android_system_netd" path="system/netd" remote="github" revision="oneplus-onyx" />
<project name="sfdroid/android_packages_apps_Settings" path="packages/apps/Settings" remote="github" revision="oneplus-onyx" />-->
</manifest>
fold=sfdroid-0.0.0
rm -rf $fold
mkdir $fold
mkdir -p $fold/system/bin
mkdir -p $fold/system/framework
mkdir -p $fold/system/lib
mkdir -p $fold/system/lib/hw
mkdir -p $fold/system/priv-app
cp ./out/target/product/${DEVICE}/system/framework/am.jar $fold/system/framework/
cp ./out/target/product/${DEVICE}/system/framework/ext.jar $fold/system/framework/
cp ./out/target/product/${DEVICE}/system/framework/ethernet-service.jar $fold/system/framework/
cp ./out/target/product/${DEVICE}/system/framework/framework.jar $fold/system/framework/
cp ./out/target/product/${DEVICE}/system/framework/services.jar $fold/system/framework/
cp ./out/target/product/${DEVICE}/system/framework/wifi-service.jar $fold/system/framework/
cp ./out/target/product/${DEVICE}/system/lib/libandroid_runtime.so $fold/system/lib/
cp ./out/target/product/${DEVICE}/system/lib/libandroid_servers.so $fold/system/lib/
cp ./out/target/product/${DEVICE}/system/lib/libdbus.so $fold/system/lib/
cp ./out/target/product/${DEVICE}/system/lib/libhardware.so $fold/system/lib/
cp ./out/target/product/${DEVICE}/system/lib/libinputflinger.so $fold/system/lib/
cp ./out/target/product/${DEVICE}/system/lib/libsurfaceflinger.so $fold/system/lib/
cp ./out/target/product/${DEVICE}/system/lib/libsensorservice.so $fold/system/lib/
cp ./out/target/product/${DEVICE}/system/lib/hw/sfdroid_sensors.default.so $fold/system/lib/hw/
cp ./out/target/product/${DEVICE}/system/lib/hw/sharebuffer.default.so $fold/system/lib/hw/
cp ./out/target/product/${DEVICE}/system/priv-app/Settings/Settings.apk $fold/system/priv-app/
cp ./out/target/product/${DEVICE}/system/priv-app/SystemUI/SystemUI.apk $fold/system/priv-app/
cp ./out/target/product/${DEVICE}/system/bin/netd $fold/system/bin/
cp ./out/target/product/${DEVICE}/system/bin/mediaserver $fold/system/bin/
tar -cjvf ${fold}.tgz $fold
Name: sfdroid
Summary: Android support for Sailfish
Version: 0.0.0
Release: 1
Group: System/Libraries
License: TBD
Source0: %{name}-%{version}.tgz
AutoReqProv: no
%description
%{summary}
%prep
%setup
%build
pwd
ls
tar -xvf %name-%version.tgz
%install
mkdir -p $RPM_BUILD_ROOT/%{_libexecdir}/sfdroid/system/bin/
mkdir -p $RPM_BUILD_ROOT/%{_libexecdir}/sfdroid/system/framework/
mkdir -p $RPM_BUILD_ROOT/%{_libexecdir}/sfdroid/system/lib/hw/
mkdir -p $RPM_BUILD_ROOT/%{_libexecdir}/sfdroid/system/priv-app/
cp -r %name-%version/system/* $RPM_BUILD_ROOT/%{_libexecdir}/sfdroid/system/
%files
%defattr(-,root,root,-)
%{_libexecdir}/sfdroid/system/bin/*
%{_libexecdir}/sfdroid/system/framework/*
%{_libexecdir}/sfdroid/system/lib/*
%{_libexecdir}/sfdroid/system/priv-app/*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment