Trying to follow steps to build A15 e/os for mi439:
finding several issues:
- in extract blobs section:
It is not mentioned exactly where the “extract-files.sh” come from. In the main doc it has:
“and that you are in the /srv/e/src//device// folder”
however, that directory was created EMPTY just one step above in 4 (mkdir -p)
in the detailed extract doc it has:
https://doc.e.foundation/os/advanced/extracting-proprietary-blobs
After you have mounted the image(s), move to the root directory of the sources of your device and run extract-files.sh as follows:
system and vendor loop mounted OK:
$ df -Th system system/vendor
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 ext4 1.7G 1.6G 67M 96% /work/ROMs/A15pineblob/system
/dev/loop1 ext4 729M 688M 26M 97% /work/ROMs/A15pineblob/system/vendor
but where is the “root directory of the sources of the device” ? AI says “Yes, the docker run command will automatically pull the device tree and the kernel source” so, need to run docker run first? before can extract vendor blobs ?
main build steps are:
Step 1 install docker, 2 get docker image, 3 get device code (mi439), step 4, create srv directories..and step 5 extract blobs, but where do we get sources and specific to device?
Before i discovered that A15 already exists/built here:
https://images.ecloud.global/community/Mi439/
Pulled this:
repo init -u https://gitlab.e.foundation/e/os/android.git` -b a15 --git-lfs`
and:
repo sync -c --force-sync --no-clone-bundle --no-tags -j16
Syncing: 100% (1147/1147), done in 11.747s
Finalizing sync state…
Checking for bloat: 100% (98/98), done in 0.358s
repo sync has finished successfully.
So, searching the 170GB of data:
$ find . -name 'extract-files.sh'
./tools/extract-utils/templates/multi-device/device/extract-files.sh
./tools/extract-utils/templates/multi-device/common/extract-files.sh
./tools/extract-utils/templates/single-device/extract-files.sh
finds these, but they are templates, not device specific.
Started with this dev page:
Info about Xiaomi Redmi 7A / 8 / 8A / 8A Dual - Mi439 but not sure what is missing to run a test build..
second issue:
-
In the extract section “sudo rm system/vendor” that is already a directory in my case, so resulted in an error, suggest to add -f and -p on the subsuequent mkdir

-
decided to skip the blobs for a moment, and continue with doc…which says:
List of tags to use for BRANCH_NAME is available at ``https://gitlab.e.foundation/e/os/releases/-/tags``.
results in “404: Page not found” so, how to get list of valid tags ?
4. When trying to find the correct url or valid tag; found it is not possible to register on the gitlab without “work email” ??
trying to use yahoo/personal email…
even if blobs are resolved, not sure which branch to put in
maybe just a15 like in the repo/init or is there qpr2 ?
- Continued to docker run and got:
>> [Mon Jul 20 11:30:48 UTC 2026] Branch: a15
>> [Mon Jul 20 11:30:48 UTC 2026] Devices: mi439,
fatal: detected dubious ownership in repository at '/srv/src/A15/vendor/lineage'
To add an exception for this directory, call:
git config --global --add safe.directory /srv/src/A15/vendor/lineage
fatal: detected dubious ownership in repository at '/srv/src/A15/vendor/lineage'
To add an exception for this directory, call:
git config --global --add safe.directory /srv/src/A15/vendor/lineage
AI is suggesting to add these to the run cmd, but not sure why it’s not on the official guide?
noticed that the docker run creates a A15 subdirectory to the branch, so mapped the top “src” and the pulled repo in below it as A15:
$ cd /work/ROMs/e/src
$ du -shc A15
171G A15
171G total
docker run \
-v "/work/ROMs/e/src:/srv/src" \
-v "/work/ROMs/e/zips:/srv/zips" \
-v "/work/ROMs/e/logs:/srv/logs" \
-v "/work/ram-ccache:/srv/ccache" \
-e "BRANCH_NAME=a15" \
-e "DEVICE_LIST=mi439" \
-e "REPO=https://gitlab.e.foundation/e/os/releases.git" \
registry.gitlab.e.foundation:5000/e/os/docker-lineage-cicd:community
6. Finally, is there a quick guide/blog to customizing, i.e. change basic things like default apps, ringtones or what not ? Built matrixx rom, w/o docker so know a bit what’s going on, but just not seeing how the device tree is pulled and integrated ..
Appreciate any tips to get started.

