(disclaimer: I work at Qualcomm)
> Mobile devices have no UEFI
Since the Snapdragon 835, Android devices with Qualcomm processors use UEFI all the way to the kernel.
However, custom UEFI binaries aren't part of the boot flow, with an Android UEFI boot application running instead.
> no bus enumeration
It's device tree instead of ACPI, but apart from that the situation isn't _that_ different from PCs today. We aren't in the ATAGS era anymore. The reflashing interface nowadays is standardised through fastboot too.
> so the OS image has to be taylored for each device
Thankfully a lot of progress has been done on that.
Since Treble, the BSP proper has been untied from Android releases.
Since devices shipping with Android 12, a Google-built kernel with a stable kernel module ABI has been shipping (for a given major kernel + Android version release combo). This allows kernel security updates to be identical across the whole ecosystem.
> althrough both are arm, you cannot use Ubuntu (or other disto) image intended for one on another
That used to be true, but across the whole Android device fleet (even between SoC vendors) it's not true anymore.
However, there's a catch still: there isn't a central update service. So while you might use a custom OS that way, you'll still need to update the vendor partitions (with the drivers, both kernel and user-mode ones) out of band in that scenario to get updates for those.
More info on generic system images: https://developer.android.com/topic/generic-system-image.
This mechanism allows to have universal Android images that work across all of the ecosystem, and can be used for GNU/Linux distributions on phones too if there's motivation to do so.