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!