Spring naar hoofdtekst

Y550 met zelfgebouwd LineageOS

Geplaatst op door ,
Laatste aanpassing op .

Inleiding

De veiligheid van de ingebakken software 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 Custom ROM. In dit artikel beschrijf ik het proces van het zelf bouwen van een Custom ROM.

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.

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. Gelukkig zijn er ontwikkelaars, die weliswaar geen officiële LineageOS-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 recente Linux-kernel onderhoudt op GitHub. Eén van hen is desalesouche; degene wiens adviezen en informatie hebben geleid tot het schrijven van dit artikel.

Voorbereiding

Het bouwen van een eigen LineageOS-image voor de Y550 is een uitgebreid proces met een aantal benodigdheden. De stappen zijn uitvoerig gedocumenteerd, maar gelden in eerste instantie alléén voor het wel-ondersteunde type. Voor de specifieke aanpasssingen vroeg ik advies aan de ervaren vrouwen en mannen op het XDA-forum. Hieronder zal ik de instructies samenvatten en eventueel aanvullen waar nodig. Desondanks adviseer ik om de genoemde documentatie grondig door te lezen.

De systeemvereisten zijn eenvoudig opgesomd:

  • een werkende Huawei Ascend Y550 smartphone
  • een 64-bit computer met GNU/Linux, bijvoorbeeld Ubuntu 16.04 of nieuwer
  • 100 tot 200 GByte vrije schijfruimte voor broncode en cache
  • minimaal 8 GByte RAM
  • een degelijke internetverbinding
  • een Y550 met een recent LineageOS, of een recent image voor de Y550
    (noodzakelijk voor het vullen van de /vendor-map tijdens de voorbereidingen)

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 install -y \
    android-tools-adb android-tools-fastboot \
    \
    bc bison build-essential ccache curl flex g++-multilib gcc-multilib git \
    gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev \
    libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev \
    libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool \
    squashfs-tools xsltproc zip zlib1g-dev \
    \
    openjdk-8-jdk;

~/bin en repo

repo is het script dat het binnenhalen en synchroniseren van de broncode voor zijn rekening neemt. Het moet worden gedownload bij Google en in een map worden geplaatst, vanwaar het op de commandline kan worden aangeroepen - bijvoorbeeld ~/bin. Deze map bevindt zich standaard in ${PATH}, als zij bestaat.

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

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;

Aangenomen dat de werkmap voor het bouwen ~/android/lineage is:

$ 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 onder andere 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

/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.

Hiervoor moet je dus de beschikking hebben over een recent (toestel met een) LineageOS-image, van waaruit je de Binairy Large OBjects (BLOBs) kunt kopiëren.

$ source build/envsetup.sh
$ breakfast cherry
$ cd device/huawei/cherry
$ ./extract-files.sh

Start de volgende stap door middel van het commando breakfast. Er worden opnieuw een aantal projecten vol broncode binnengehaald en de betreffende mappen in /vendor aangemaakt. Voer daarna het ./extract-files.sh script uit, terwijl de Y550 met een USB-poort is verbonden (of je de alternatieve instructies hebt gevolgd om de bestanden uit een image te kunnen halen).

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:

$ 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.

In het bestand ~/.jack-settings staat het volgende:

# 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:

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

Y550-aanpassingen

Tot dusver gelden de getoonde instructies voor zo'n beetje alle door LineageOS ondersteunde toestellen. Om de Y550 van deze CustomROM te voorzien moet de broncode op een aantal plaatsen worden aangepast.

Als eerste moet er een lokaal manifest aan /.repo worden toegevoegd, in plaats van het bestaande /.repo/local_manifests/roomservice.xml. Dit bestand overschrijft de keuzes voor met name de kernel en de vendor-Huawei map (zie ook als download):

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <project name="LineageOS/android_device_huawei_cherry" path="device/huawei/cherry" revision="cm-14.1" />
    <project name="LineageOS/android_device_cyanogen_msm8916-common" path="device/cyanogen/msm8916-common" revision="cm-14.1" />
    <project name="LineageOS/android_device_huawei_msm8916-common" path="device/huawei/msm8916-common" revision="cm-14.1" />
    <project name="HUAWEI-Y550-Y635/android_kernel_huawei_msm8916" path="kernel/huawei/y550-vid" revision="los-14.1" />
    <project name="TheMuppets/proprietary_vendor_huawei" path="vendor/huawei" revision="cm-14.1" />
    <project name="LineageOS/android_device_qcom_common" path="device/qcom/common" revision="cm-14.1" />
    <project name="omnirom/android_bootable_recovery" path="bootable/recovery-twrp" revision="android-7.1" />
</manifest>

Voer hierna opnieuw een synchronisatie uit; dit kan weer enige tijd in beslag nemen:

$ repo sync

Daarna volgende Y550-specifieke aanpassingen.

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

ro.sf.lcd_density=240

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

TARGET_OTA_ASSERT_DEVICE := c8817d,g620s,C8817D,C8817E,G621-TL00,G620S-UL00,G620S-L01,Che1-CL20,Che1-L04,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

Bouw

Eindelijk kan de bouw van het daadwerkelijke image beginnen!

$ cd ~/android/lineage;
$ source build/envsetup.sh;
$ croot;
$ brunch cherry;

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.

Als het niet meezit, heeft jack waarschijnlijk niet genoeg geheugen. Dan kun je in het bestand ~/.jack-server/config.properties het aantal services aanpassen:

jack.server.max-service=1

Een tip als je besluit in een VirtualMachine te bouwen: geef de gast minimaal 2 processorkernen en zo veel mogelijk werkgeheugen. Meer is beter, veel meer is veel beter.

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.

Succes

In de map /out/target/product/cherry 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-cherry.zip-archief voldoende, vergezeld door het bijbehorend .md5-bestand. 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.