Ultimately, your goal is to get your embedded system to run the Android environment users and developers are accustomed to, not simply the native user-space we just covered. That includes not only the full set of system services and the packages that provide the standard APIs used by app developers, but also some less visible components, such as a set of native daemons that support the system services and the Hardware Abstraction Layer. This chapter will cover how the Android Framework operates on top of the native user-space and will discuss how to interact with and customize it.
Note that unlike the previously discussed components of Android, whose behavior can be modified in a number of ways, most of the Android Framework has to be used as is. You can’t, for instance, pick and choose which system services to run, as they aren’t started from a script or based on a configuration file. Instead, modifying the Framework typically requires diving into its sources and/or adding your own code to customize its behavior.
Such customization work therefore requires becoming intimately familiar with Android’s sources and is inherently version dependent. Still, we’ll try to cover enough of the essentials to enable you to start navigating Android’s internals on your own. Nevertheless, expect this to be the start of a long-term endeavor, as Android’s sources are fairly big, and new releases come out at a very rapid pace.