[ROM][14][UNOFFICIAL] LineageOS 21.0 per Xiaomi Redmi Note 8/8T

Screenshot

Build non ufficiale di LineageOS 21.0 (Android 14) adattata per Xiaomi Redmi Note 8 / 8T [ginkgo/willow].

Il supporto ufficiale di LineageOS per questo dispositivo è terminato nel 2023, e l'ultima versione pubblicata è LOS 18.1 (Android 11).

Attualmente, ad inizio 2025, la versione non ufficiale più recente disponibile online è LOS 19.1.


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): $ yay -S android-tools lineageos-devel 2. Creazione delle directory di lavoro: $ mkdir -p ~/bin
$ mkdir -p ~/android/lineage
3. Scaricamento il tool "repo" di Google nella rispettiva directory per gestire il codice sorgente: $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
4. Aggiunta della directory contenente repo a $PATH, così da poter utilzzare il comando senza dover specificare continuamente la sua posizione: $ nano ~/.zprofile
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
5. Refresh delle variabili globali: $ source ~/.zprofile 5. Configurazione di git: $ git config --global user.email "email@esempio.com"
$ git config --global user.name "Nome Esempio"

$ git lfs install

$ git config --global trailer.changeid.key "Change-Id"
5. Attivazione di ccache per velocizzare la compilazione: $ export USE_CCACHE=1
$ 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:

$ cd ~/android/lineage
$ 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:

$ nano .repo/local_manifests/roomservice.xml:
<?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>
Infine, un sync di tutto. Questo semplice comando dura quasi 2 ore, e scarica ~260gb di codice sorgente: $ repo sync

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: $ source build/envsetup.sh
$ brunch ginkgo
Una volta completato, per vedere il risultato finale: $ cd $OUT
$ 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 recovery recovery.img
$ fastboot flash dtbo dtbo.img
$ fastboot flash boot boot.img
$ fastboot flash vbmeta vbmeta.img
Dopodiché, bisogna entrare in modalità recovery, quindi da telefono spento premendo il tasto Power + Volume Su, oppure da fastboot con il comando: $ fastboot reboot recovery Da qui, si può riprendere a seguire la guida ufficiale per l'installazione.

Dalla recovery si fa un ripristino di fabbrica, infine dal menù principale: Update -> Apply from ADB.
E con il telefono collegato al computer: $ adb -d sideload lineage-xx.x-xxxxxxxx-UNOFFICIAL-ginkgo.zip E questo è tutto.

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.