L'idea di questo progetto è nata dal fatto che
il mio dispositivo, avendo ormai qualche anno,
sta ricevendo sempre meno supporto, ed il numero dei suoi mantenitori sta calando insieme alla varietà di custom ROM che lo supportano.
Negli anni ne ho provate di varie, tra cui crDroid, EvoX e PixelOS, ma la mia preferita
in assoluto è
LineageOS, che però ha abbandonato il supporto per ginkgo/willow dopo aver
rilasciato la versione 18.1, con Android 11.
Passato qualche anno, ora siamo già ad Android 15, con addirittura Android 16 in beta, e mentre
Google mantiene cinque versioni alla volta, LineageOS ne supporta attivamente soltanto due: utilizzare
un sistema con Android 11 non rappresenta soltanto un problema per quanto riguarda la
compatibilità, ma anche un rischio per la sicurezza, non essendo al passo con le patch
che vengono rilasciate regolarmente.
Questo mi ha spinto a provare a compilare LineageOS dal codice sorgente seguendo la
guida ufficiale,
per poi discostarmi da essa poiché la wiki non presenta alcuna informazione riguardo il build
per i dispositivi non supportati. Con nessuna esperienza pregressa in questo ambito, e zero
idee su che cosa sia un device tree, dopo aver seguito i primi passi della guida, ho continuato
la ricerca su vari forum come XDA e Reddit.
Detto questo, iniziamo con il procedimento.
Per prima cosa, dobbiamo impostare l'ambiente di sviluppo:
1. Installazione delle dipendenze necessarie (fortunatamente l'AUR di Arch Linux contiene un pacchetto completo adatto allo scopo):
$ mkdir -p ~/android/lineage
$ chmod a+x ~/bin/repo
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
$ git config --global user.name "Nome Esempio"
$ git lfs install
$ git config --global trailer.changeid.key "Change-Id"
$ export CCACHE_EXEC=/usr/bin/ccache
$ ccache -M 50G
$ rm ~/.cache/ccache
$ mkdir ~/.cache/ccache
A questo punto, bisogna inizializzare il repository della versione da compilare, ed è da qui che smettiamo di seguire la guida ufficiale, inizializzando LOS 21.0 piuttosto della 18.1:
$ repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 --git-lfs --no-clone-bundle
Qui troviamo il problema principale: abbiamo bisogno di trovare i file specifici del dispositivo,
quelli proprietari, del kernel, eventuali librerie aggiuntive, e inserirli nel progetto affinché funzioni tutto.
Questi file specifici sono essenziali per la compilazione di Android, e fornisono le informazioni neccessarie
sull'hardware per la comunicazione con il software: non è possibile compilare una versione standard
installabile su tutti i dispositivi (come avviene ad esempio con i computer).
La cosa divertente è che è possibile trovarli su github, ma sono incompatibili tra versioni di Android diverse,
e custom ROM diverse. Questo vuol dire che ogni device tree è unico, nonostante dovrebbero soltanto indicare le
specifiche del dispositivo.
Dopo aver analizzato un po' i diversi file disponibili online, ho capito che la differenza è nettamente maggiore
tra versioni di Android diverse, piuttosto che tra ROM diverse.
Così ho preso
i file specifici di crDroid (fortunatamente basato su LineageOS) per il mio dispositivo,
che ha portato con successo il mio telefono ad Android 14, e li ho inseriti nel manifest "roomservice.xml"
invece di "ginkgo.xml" per non far arrabbiare il compilatore.
Inoltre, ho deciso di aggiungere
miuicamera, perché l'app stock ha molte meno funzioni:
<?xml version="1.0" encoding="UTF-8">
<manifest>
<project path="device/xiaomi/ginko" name="crdroidandroid/android_device_xiaomi_ginkgo" remote="github" revision="14.0" />
<project path="vendor/xiaomi/ginko" name="crdroidandroid/proprietary_vendor_xiaomi_ginkgo" remote="github" revision="14.0" />
<project path="kernel/xiaomi/ginko" name="crdroidandroid/android_kernel_xiaomi_ginkgo" remote="github" revision="14.0" />
<project path="vendor/miuicamera" name="DerpFest-ginkgo/vendor_miuicamera" remote="github" revision="arrow-12.0-a3" />
</manifest>
Dopo aver scaricato tutto, ho notato che il device tree di crDroid potrebbe funzionare perfettamente senza modifiche, poiché all'interno dei file, il dispositivo viene menzionato come "lineage_ginkgo". L'unico file che lo lega a crDroid è "crdroid.dependencies", che però ho eliminato perché non è strettamente necessario, ma serve soltanto ai mantenitori ufficiali per tenere traccia delle dipendenze.
A questo punto, iniziamo a compilare. Questo processo dura molto tempo, nel mio caso quasi 9 ore, ed espande lo spazio necessario di ulteriori ~150GB:
$ brunch ginkgo
$ ls
L'installazione non è complicata, basta spegnere il telefono (ricordatevi di salvare i dati!), e riaccenderlo tenendo premuto il tasto Volume Giù per entrare nella modalità fastboot. Poi, bisogna collegare il telefono ad un computer munito di adb e fastboot, e flashare le seguenti partizioni con le immagini appena create:
$ fastboot flash dtbo dtbo.img
$ fastboot flash boot boot.img
$ fastboot flash vbmeta vbmeta.img
Dalla recovery si fa un ripristino di fabbrica, infine dal menù principale: Update -> Apply from ADB.
E con il telefono collegato al computer:
Il mio prossimo progetto sarà probabilmente LineageOS 22.1 con Android 15, ci sto lavorando da un po' e ci sono molte più difficoltà a causa del nuovo sistema di partizionamento, per questo mi è anche capitato un hard brick (no bootloader/recovery) che in seguito ho risolto smontando il telefono e mettendolo in modalità EDL per ripristinare il sistema con QFIL. Questo mi ha decisamente rallentato, però ora posso continuare.