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:

ComponentMeaning
arm6464-bit ARM
bA/B partition device
gGoogle Apps included
vVanilla (no Google Apps)
NNo 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.