Spring naar hoofdtekst

Y550 met zelfgebouwd LineageOS

Geplaatst op door ,
Laatste aanpassing op .

Inleiding

De veiligheid van de ingebakken software (firmware) van mijn Huawei Y550 smartphone houdt me al vele jaren bezig. In een eerder artikel beschreef ik de procedure om van de originele firmware over te stappen naar zogenaamde custom ROMs. Een opvolgend artikel beschreef het updaten van zo'n bestaand CustomROM. In dit artikel beschrijf ik het proces van het zelf bouwen van een CustomROM.

Let op: ik bedoel hiermee het fabriceren van het installatie-image zelf. Andere ontwikkelaars zorgen voor de spreekwoordelijke stenen, specie, steigers en soep tijdens de pauze. Een open source project als dit kan niet zonder het werk van anderen. Je staat als het ware op de schouders van reuzen. Onderstaande post is ook als losstaande Engelstalige handleiding beschikbaar.

LineageOS

Het meest bekende alternatieve besturingssysteem voor smartphones en tablets is LineageOS, een wereldwijd open source project, gedragen door duizenden vrijwilligers. Op basis van de open broncode van Android die Google regelmatig vrijgeeft, bouwen deze enthousiastelingen actuele firmware voor honderden verschillende toesteltypen, met nieuwe functies maar ook beveiligingsupdates.

Basis

Het model Ascend Y550 van Huawei wordt niet officieel ondersteund door de vrijwilligers van LineageOS. De hardware lijkt echter veel op die van een ander model dat wel wordt ondersteund: Huawei Honor 4/4X, codenaam cherry. Het bouwen van de firmware voor dit toestel wordt uitvoerig beschreven.

Gelukkig zijn er ook ontwikkelaars, die weliswaar geen officiële ondersteuning kunnen bieden, maar wel een toestel up to date houden, op basis van hoe het hen uitkomt. Zo is er een groep ontwikkelaars die, speciaal voor de Y550 en andere soortgelijke maar niet officiëel ondersteunde typen, een Linux-kernel onderhoudt op GitHub. Eén van hen is desalesouche; degene wiens adviezen en informatie hebben geleid tot het schrijven van dit artikel.

Vereisten

De benodigdheden om een CustomROM te kunnen bouwen zijn:

  • een 64-bit computer met GNU/Linux, bijvoorbeeld Ubuntu 18.04 LTS
  • 100 tot 200 GByte vrije schijfruimte voor broncode en cache
  • minimaal 8 GByte RAM
  • een degelijke internetverbinding

Voorbereiding

Voor zover nog niet gebeurd, installeer Ubuntu. Kies voor de minimale installatie; méér dan de basis systeemprogramma's zullen we niet nodig hebben. Werk je in een virtuele machine, vergeet dan niet ook openssh-server te installeren. Je kunt het systeem dan via SSH vanaf je lokale terminal bereiken.

sudo apt update;
sudo apt install -y openssh-server;

Installatie software

Er is behoorlijk wat software nodig om de broncode van LineageOS binnen te halen, te beheren en te compileren tot een kant-en-klaar image. Hieronder een samengevat commando om alles in één keer te installeren:

sudo apt update && sudo apt upgrade -y;
sudo apt install -y bc bison build-essential ccache curl flex \
  g++-multilib  gcc-multilib git gnupg gperf imagemagick \
  lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool \
  libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 \
  libxml2-utils lzop pngcrush rsync schedtool squashfs-tools libxslt1-dev \
  openjdk-8-jdk android-tools-adb android-tools-fastboot python;

Mappen en repo

De volgende twee mappen moeten worden aangemaakt:

mkdir -p ~/bin;
mkdir -p ~/android/lineage;

In de eerste bevindt zich straks het programma repo, een belangrijk commando om alle onderliggende projecten van ons CustomROM te beheren en te updaten. De tweede map is de hoofdmap waarin alle broncode zal worden opgeslagen.

Het volgende commando downloadt het repo-script en maakt het uitvoerbaar:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo;
chmod a+x ~/bin/repo;

Om er zeker van te zijn dat de map ~/bin in de ${PATH} omgevingsvariabele is opgenomen, open ~/.profile en voeg eventueel onderstaande code toe, als die er nog niet staat:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Voer voor de zekerheid het commando source ~/.profile uit om de wijzigingen van kracht te laten zijn.

Initialiseren

repo maakt onder de motorkap veelvuldig gebruik van git, een systeem om wijzigingen aan met name broncode van software comfortabel en inzichtelijk te beheren. Het gebruik van git vereist dat je jouw naam en e-mailadres instelt, zodat eventuele wijzigingen naar jou kunnen worden teruggevolgd. Stel de gegevens als volgt in:

git config --global user.name "Voornaam Achternaam";
git config --global user.email voorachternaam@mijne-mailadres.com;

Daarna volgt de daadwerkelijke initialisatie:

cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b cm-14.1

Als je houdt van kleurtjes op je scherm, antwoord dan Y op de betreffende vraag.

In de verborgen .repo-map staat welke projecten op wat voor manier moeten worden samengevoegd om de totale broncode bij elkaar te krijgen. Dit staat opgesomd in zogenaamde manifests. Dit zijn in XML opgemaakte bestanden, die met elke normale teksteditor te bewerken zijn.

Synchroniseren

Dan volgt de eerste synchronisatie, waarin van alle betrokken projecten de nieuwste wijzigingen worden binnengehaald. De eerste keer kan dit behoorlijk lang duren.

repo sync --force-sync

Maak daarna de map local_manifests in de .repo map aan. Maak daarin een nieuw XML-bestand met de volgende inhoud en een willekeurige naam. Het mijne heet fwiep.xml:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <remote name="githubfwiep" fetch="https://github.com/fwiep" />

  <project
        path="device/cyanogen/msm8916-common"
        name="LineageOS/android_device_cyanogen_msm8916-common"
        remote="github" />

  <project
        path="device/qcom/common"
        name="LineageOS/android_device_qcom_common"
        remote="github" />

  <project
        path="device/huawei/msm8916-common"
        name="android_device_huawei_msm8916-common"
        remote="githubfwiep" revision="cm-14.1" />

  <project
        path="device/huawei/y550"
        name="android_device_huawei_y550"
        remote="githubfwiep" revision="cm-14.1" />

  <project
        path="vendor/huawei"
        name="proprietary_vendor_huawei"
        remote="githubfwiep" revision="cm-14.1" />

  <project
        path="kernel/huawei/y550-vid" 
        name="HUAWEI-Y550-Y635/android_kernel_huawei_msm8916"
        remote="github" revision="los-14.1" />

  <project
        path="bootable/recovery-twrp"
        name="omnirom/android_bootable_recovery"
        remote="github" revision="android-7.1" />

</manifest>

Dan volgt opnieuw een synchronisatie:

repo sync --force-sync;

Y550 aanpassing

In bovenstaand manifest staan een aantal projecten met het attribuut remote="githubfwiep". Hiermee wordt verwezen naar mijn speciaal voor de Y550 ingerichte kopieën van de officiële cherry repos.

Voor de specifieke aanpasssingen vroeg ik advies aan de ervaren vrouwen en mannen op het XDA-forum. Let op: deze edits zijn dus al uitgevoerd als je de bovenstaande projecten met repo hebt binnengehaald.

In ./device/huawei/msm8916-common/system.prop

ro.sf.lcd_density=240

In ./device/huawei/cherry/BoardConfig.mk

TARGET_OTA_ASSERT_DEVICE := Y550-L01,Y550-L02,Y550-L03

In ./device/huawei/msm8916-common/BoardConfigCommon.mk

DEVICE_RESOLUTION := 480x854

In ./device/huawei/msm8916-common/BoardConfigCommon.mk

TARGET_KERNEL_SOURCE := kernel/huawei/y550-vid
TARGET_KERNEL_CONFIG := cm_hwY550_defconfig

In ./device/huawei/msm8916-common/msm8916.mk

PRODUCT_AAPT_PREF_CONFIG := hdpi
TARGET_SCREEN_HEIGHT := 854
TARGET_SCREEN_WIDTH := 480

/vendor

Jammer genoeg is niet alle broncode van een Android-smartphone open source. De meeste fabrikanten houden een deel van de firmware geheim. Hiervan kan dus niemand (behalve de fabrikant) onderzoeken hoe ze werkt, of eventuele fouten en beveiligingslekken corrigeren.

CustomROMs zijn afhankelijk van zulke stukken firmware, omdat ze onmisbaar zijn voor de functionaliteit van de hardware. LineageOS voorziet hierin door middel van de /vendor-map. Hierin worden stukken originele firmware als binaire data opgeslagen en overgenomen in het uiteindelijke image.

Hoewel het misschien niet helemaal correct of legaal is, heb ik er voor gekozen om die bestanden eenmalig aan mijn repositories op GitHub toe te voegen. Zo kan eenieder die de instructies volgt direct aan de slag. De liefhebbers en die-hards verwijs ik graag naar de officiële instructies (link 1, link 2) van LineageOS.

CCache

Om het bouwen van images te versnellen, maakt LineageOS gebruik van een zogenaamd compiler-cache, oftewel ccache. Hierin worden reeds gecompileerde bestanden opgeslagen, die bij een volgende bouw kunnen worden gekopiëerd, als de broncode sindsdien niet is gewijzigd. Dit kan behoorlijk veel tijd schelen. Door éénmalig het volgende commando uit te voeren stel je de gewenste cache-grootte in; bijvoorbeeld 50 GByte:

ccache -M 50G;

Daarnaast moet nog een omgevingsvariabele worden ingesteld. Voeg dit commando ook toe aan je ~/.bashrc, zodat het bij elke shell sessie wordt uitgevoerd:

export USE_CCACHE=1;

jack

Tot slot van de algemene voorbereidingen volgt nog het inrichten van een centrale hulp voor het compilatieproces: jack, niet te verwarren met de Jack Audio Connection Kit (JACK). Het programma is nogal kieskeurig wat geheugen betreft, beklaagt zich regelmatig over een tekort en laat de bouw dan spontaan vastlopen. Hieronder volgt mijn persoonlijke werkende combinatie van instellingen.

Vul het bestand ~/.jack-settings met de volgende inhoud:

# Server settings
SERVER_HOST=127.0.0.1
SERVER_PORT_SERVICE=8076
SERVER_PORT_ADMIN=8077

# Internal, do not touch
SETTING_VERSION=4
JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"

Dan nog voor de zekerheid een extra omgevingsvariabele (ook in ~/.bashrc):

export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m";

Bouw

Eindelijk kan de bouw van het daadwerkelijke image beginnen!

cd ~/android/lineage;
source build/envsetup.sh;
LANG=C brunch y550 2>&1 | tee $( date +'%Y-%m-%d_%H-%M-%S' )-build.log;

Als alles meezit begint de computer nu behoorlijk hard te werken. Processors lopen warm en geheugen wordt tot de nok toe gevuld. Na afloop verschijnt een melding dat het bouwen succesvol was en hoe lang dit heeft geduurd.

Tips

Als de bouw niet direct slaagt, is het best een uitdaging om in de overvloed van console meldingen een hint van de oorzaak te vinden. Wees gerust, dit hoort bij het leerproces van het zelf bouwen van software. Als je tot hier bent gekomen, ben je zelfredzaam genoeg om ook de laatste obstakels vakkundig uit de weg te ruimen.

VM specificaties

Als je besluit in een virtuele machine te bouwen: geef de gast minimaal 2 processorkernen en zo veel mogelijk werkgeheugen. Meer is beter, veel meer is veel beter.

Jack

Beklaagt jack zich over te weinig geheugen en heb je daar iets aan gedaan, vergeet dan niet om de jack-server opnieuw te starten:

croot;
./prebuilts/sdk/tools/jack-admin kill-server;
./prebuilts/sdk/tools/jack-admin start-server;

Succes

In de map /out/target/product/y550 staan de zojuist gebouwde images te wachten om te worden geïnstalleerd. Voor het eenvoudig flashen van het CustomROM, zoals beschreven in mijn eerdere posts, is het lineage-14.1-XXXXXXXX-UNOFFICIAL-y550.zip-archief met bijbehorend .md5-bestand voldoende. Deze kopieer je naar jouw Y550 en flasht het met behulp van TWRP. Klaar!

Inhoudsopgave

Atom-feed Atom-feed van FWiePs weblog

Artikelen


Doorzoek de onderstaande categorieën om de lijst met artikelen te filteren.