As with anything Linux and Android, device/driver selection based on versions and availability is the key to simplicity. For instance, if you're trying to select a wifi or modem module for a new Android device you're developing. If the modem module chipset is well supported in Linux by the vendor and the kernel source for the Android device is available life is great. If you're selecting an ODM or Android development board has most common drivers built in to it already, you won't even have to compile or flash your device. You may be able to plug and play and drive down development time and costs. If not, you can recompile the kernel with the driver in it, flash it and go. With Android versions up to 4.2, you can just compile a driver as a module against the kernel headers and copy it to your device but as of Android KitKat, if you want to pass the Android Compatibility Test Suite (CTS), Google is requiring that you not allow kernel modules. This may not be a big deal to you but can be another factor in your development time and product life cycle.
If you’re selecting a modem with poor Linux driver support or the SoC specific Android kernel source is not easy to get ahold of, things get decidedly more difficult.
vlaganakos posted a great blog about bringing up Android from scratch on a new system.
Fang Bao also wrote a blog about what it was like to get kernel source headers to compile a kernel module and load it on an Android handset (in case you’re not concerned with the CTS requirements or KitKat).
If you have any specific requirements or questions about Android on ARM, feel free to ask here!