Blog / Jun 15, 2026
Installing LineageOS 21 (Google-Free) on a Lenovo Tab M9 (TB310FU)
A complete walkthrough of installing AndyYan's LineageOS 21 GSI on a Lenovo Tab M9, including MediaTek quirks, Fastboot/Fastbootd confusion, debugging dead ends, and post-install surprises.
Installing LineageOS 21 (Google-Free) on a Lenovo Tab M9 (TB310FU)
A complete walkthrough of installing AndyYan’s LineageOS 21 GSI on a Lenovo Tab M9, including all the mistakes, dead ends, MediaTek quirks, debugging steps, and post-install surprises encountered along the way.
Introduction
The Lenovo Tab M9 is a surprisingly capable budget Android tablet.
My model:
Lenovo Tab M9
TB310FU
4 GB RAM
64 GB Storage
Helio G80
My intended use case:
- Home Assistant dashboard
- Casual Android gaming
- Video playback
- Web browsing
- Document editing
I wasn’t interested in Google’s ecosystem and wanted a lightweight Android installation with minimal background services.
After reviewing available options, I decided to install AndyYan’s LineageOS 21 GSI.
Why a GSI?
The Tab M9 does not have a large custom ROM community.
However, it supports:
Project Treble
Dynamic Partitions
A/B Partitions
which makes it an excellent candidate for Generic System Images (GSIs).
Rather than waiting for a device-specific ROM, I could run a standard Android 14 LineageOS GSI.
Choosing the Correct Build
AndyYan publishes several variants.
Examples:
arm64_bgN
arm64_bvN
Meaning:
| Component | Meaning |
|---|---|
| arm64 | 64-bit ARM |
| b | A/B partition device |
| g | Google Apps included |
| v | Vanilla (no Google Apps) |
| N | No root |
I originally considered:
arm64_bgN
which includes:
- Play Store
- Play Services
However, I ultimately decided I wanted a completely Google-free installation.
Final choice:
lineage-21.0-20250621-UNOFFICIAL-arm64_bvN
This variant includes:
- No Google Apps
- No Play Services
- No Play Store
- No Root
Exactly what I wanted.
Setting Up the Tooling
Windows LTSC Surprise
My machine runs Windows LTSC.
Because of that:
winget
was unavailable.
Most Android guides assume Winget exists.
It doesn’t.
Installing ADB and Fastboot with Scoop
Instead:
scoop install adb
This installs:
adb
fastboot
globally.
No manual extraction of Platform Tools required.
Installing Android Command Line Tools
Next:
scoop install android-clt
This provides:
sdkmanager
Verification:
sdkmanager --version
Installing the Google USB Driver
This became useful later.
Install:
sdkmanager "extras;google;usb_driver"
This downloads Google’s USB driver package used by Device Manager when assigning Android Bootloader Interface drivers.
At the time I wasn’t sure whether the issue was driver-related.
As it turned out, the situation was more complicated.
Unlocking the Bootloader
On the tablet:
Settings
→ About Tablet
→ Tap Build Number 7 times
Enable:
OEM Unlocking
USB Debugging
Reboot into Fastboot.
Verification:
fastboot getvar unlocked
Result:
unlocked: yes
Huge milestone.
Without this, nothing else matters.
The First Major Confusion
At one point:
fastboot devices
returned:
<nothing>
Normally this means:
Fastboot isn’t working.
Except:
fastboot getvar all
returned pages of information.
Example:
product: t6100a_wifi
modelname: TB310FU
current-slot: a
unlocked: yes
Clearly Fastboot was working.
This was the first clue that MediaTek devices behave differently from what most Android documentation assumes.
The MediaTek Rabbit Hole
The tablet repeatedly showed:
TrackID
===> FASTBOOT MODE..
Windows showed:
Android ADB Interface
VID_0E8D
PID_201C
Meanwhile:
fastboot devices
often returned nothing.
But:
fastboot getvar unlocked
worked.
fastboot getvar all
worked.
fastboot getvar is-userspace
worked.
This created a lot of confusion.
Traditional Android advice says:
If fastboot devices shows nothing, Fastboot is not connected.
On this MediaTek tablet that wasn’t always true.
Understanding Fastboot vs Fastbootd
This was probably the biggest conceptual mistake during the installation.
I assumed:
Fastboot
and
Fastbootd
were the same thing.
They are not.
Fastboot
The tablet displays:
TrackID
===> FASTBOOT MODE..
Verification:
fastboot getvar is-userspace
returns:
is-userspace: no
This is the real bootloader.
Fastbootd
Entering:
fastboot reboot fastboot
switches into Fastbootd.
Verification:
fastboot getvar is-userspace
returns:
is-userspace: yes
This is Android userspace.
This is where dynamic partitions are flashed.
Once I understood this distinction, everything became much clearer.
The vbmeta Adventure
I extracted:
vbmeta.img
from Lenovo’s official firmware package.
Verification:
(Get-Item vbmeta.img).Length
returned:
4096
which is exactly what a small vbmeta image should look like.
Attempts to flash it produced confusing and inconsistent results.
At some point I realised I was spending more time fighting vbmeta than actually flashing Android.
Interestingly, after unlocking the bootloader:
secure: no
appeared in the Fastboot output.
The final installation succeeded without requiring further vbmeta modifications.
Flashing LineageOS
After entering Fastbootd:
fastboot reboot fastboot
Verification:
fastboot getvar is-userspace
returned:
is-userspace: yes
The image:
lineage-21.0-20250621-UNOFFICIAL-arm64_bvN
was approximately:
2.26 GB
Flash command:
fastboot flash system system.img
The flash completed successfully.
Factory Reset
After flashing:
Recovery
→ Factory Reset
→ Format Data
This should not be skipped.
It is one of the most common causes of boot loops after flashing GSIs.
Orange State Panic
The first reboot displayed:
Orange State
Your device has been unlocked and can't be trusted.
Your device will boot in 5 seconds.
Then…
Nothing.
Or so it seemed.
My immediate assumption:
The installation failed.
The Three Circles of Hope
Eventually:
Three spinning LineageOS circles
appeared.
The device was simply performing its first boot.
The first boot took significantly longer than expected.
Lesson:
Do not interrupt the first boot.
Wait.
Be patient.
Post-Install Scare: The Brightness Incident
Several days later, the tablet appeared to crash.
The trigger seemed to be:
Changing brightness
The device powered off and would not appear to boot normally.
I could still reach:
TrackID
===> FASTBOOT MODE..
and Recovery.
Naturally I assumed something serious had happened.
Initial Theory
I suspected:
- Display HAL crash
- Brightness bug
- SurfaceFlinger crash
- Corrupted user data
The symptoms looked convincing.
Recovery Investigation
Recovery showed several warnings:
platform device type is unknown
/cache partition not found
failed to find/open a drm device
failed to load bitmap
At first glance these looked concerning.
In reality, most of them are common recovery warnings on A/B devices and GSIs.
Slot Investigation
Checking Fastboot:
fastboot getvar current-slot
fastboot getvar slot-successful:a
fastboot getvar slot-successful:b
returned:
current-slot: a
slot-successful:a: yes
slot-successful:b: no
This was important.
It meant:
- Android had previously booted successfully.
- Slot A was healthy.
- The bootloader did not consider the installation broken.
The Real Cause
Eventually the tablet booted.
The screen brightness was simply so low that the display looked completely black.
The device had likely been booting the entire time.
This explained several earlier mysteries:
- Recovery worked.
- Fastboot worked.
- Slot A was healthy.
- No obvious boot errors existed.
The tablet was alive.
I just couldn’t see it.
Lesson Learned
When debugging a GSI:
Before assuming:
The tablet is dead
check whether:
adb devices
shows a connected device.
A black screen does not necessarily mean Android is not running.
Post-Install Software
Because I chose:
arm64_bvN
there are no Google services.
Applications installed afterwards:
Aurora Store
Home Assistant
Firefox
VLC
Benefits:
- No Google account required
- No Play Services
- Less background activity
- Better privacy
- Lower memory usage
- Cleaner Android experience
Lessons Learned
1. MediaTek devices are weird
Fastboot can work even when:
fastboot devices
appears broken.
2. Fastboot and Fastbootd are completely different
Always verify:
fastboot getvar is-userspace
before flashing.
3. Orange State is normal
It simply means:
Bootloader unlocked
and is expected.
4. First boot takes much longer than expected
Especially on budget hardware.
5. Learn to trust getvar
Commands like:
fastboot getvar unlocked
fastboot getvar current-slot
fastboot getvar is-userspace
fastboot getvar all
provided far more useful information than:
fastboot devices
during this installation.
6. A black screen is not always a crash
Sometimes the display is simply too dim to see.
Verify before assuming the worst.
Final Thoughts
The Lenovo Tab M9 turned out to be an excellent candidate for a lightweight Android 14 installation.
Final system:
Lenovo Tab M9 TB310FU
LineageOS 21
Android 14
arm64_bvN
No Google Services
No Root
The installation process itself was not particularly difficult.
The challenge was understanding:
- MediaTek quirks
- Fastboot vs Fastbootd
- Dynamic partitions
- A/B slots
- vbmeta
- The misleading behaviour of
fastboot devices
Once those pieces clicked into place, the actual installation was straightforward.
And yes, eventually the three spinning circles appeared.