As a point of comparison, Microsoft ships its OS across a variety of manufacturers and largely keeps it maintained across them (give or take some exceptions like enterprise environments & the like).
Even unlocked Android phones purchased independently of carriers have inconsistent lengths of support, so it doesn’t seem to be entirely a result of carriers, so…What happened here?
Not at all. The Darwin kernel (XNU) is semi-FOSS (as in: Apple throws source code over the fence every year or two) but nearly none of the rest is.
Not only is this practice not even close to Linux’ fully open development model, XNU is quite a minimal kernel; it’s more of a microkernel design. You need the other parts in order to have a usable system.
The Android userspace is fully FOSS. Android Framework, system libraries, system services and even the UI are fully FOSS with a fairly open development model.
I patch my Android framework to disallow apps from ever dictating how my screen should be rotated for example.
The Evil Corp. has been pulling more functionality into the proprietary GMS crap lately but it’s not very many features and alternatives exist for FOSS apps (i.e. Firebase push notifications: UnifiedPush).
OEMs take this fully open code and might make changes; mostly of cosmetic nature. Those usually aren’t published.
Many Vendors ship the regular Android userspace with little to no modification however.
Android FOSS but not Libre. Don’t confuse the two.
Only the kernel of Android is Libre. (XNU is not Libre btw.)