Google Android on the Beagleboard
Introduction to the Android API, HAL and SDK
Bill Gatliff
bgat@[Link] Freelance Embedded Systems Developer
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
1 / 65
What is Android?
Android delivers a complete set of software for mobile devices: an operating system, middleware and key mobile applications.
-- [Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
2 / 65
What is Android?
A software stack:
... and nothing more
(Albeit a pretty good one!)
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
3 / 65
What is Android?
A ton of new code:
Linux kernel port to MSM (Qualcomm) chipset Graphics, Audio and other APIs, implementations Development, debugging tools Includes key mobile applications
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
4 / 65
What is Android?
Borrows heavily from existing code:
Linux kernel for hardware abstraction SQLite libpng ...
[Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
5 / 65
Conguring the BYOES Beagleboard
Steps:
Select the Android kernel, rootfs Boot
On your workstation:
Install Android development tools Set up USB networking
We cant do all of that today!
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
6 / 65
Conguring the BYOES Beagleboard
# /switchboot ***** SWITCH-UR-BOOT **** Choose which file system to boot upon next reboot: 1. 2. 3. 4. 5. 6. 7. ESC-120 ESC-160 ESC-140 ESC-228 ESC-208 ESC-208 ESC-180 Kridner: Beagle 101 Van Gend/MontaVista: debugging+power Fisher/RidgeRun Fisher/RidgeRun Gatliff: Android 1024x768 Gatliff: Android 800x600 Yau/HY-research: Bluetooth
Please enter: 5
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
7 / 65
Conguring the BYOES Beagleboard
# /switchboot ... *** SUCCESS The correct uImage and [Link] have been setup. You can press the reset button now. #
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
8 / 65
Conguring the BYOES Beagleboard
Some notes:
Keyboard and mouse work differently (Just ignore the mouse altogether) You dont have a GSM modem!
Also:
You need the Android SDK v. 1.6
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
9 / 65
Hello, Android!
Lets start simple:
Hello, world! Command-line tools only
$ android create project --target 2 --name Hello --path ./helloworld --activity HelloWorld --package [Link] $ cd helloworld/ $ vi src/example/HelloWorld/[Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
10 / 65
Hello, Android!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
package [Link]; import [Link]; import [Link]; import [Link]; public class HelloWorld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { [Link](savedInstanceState); TextView tv = new TextView(this); [Link]("Hello, ESC BYOE attendees!"); setContentView(tv); } }
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
11 / 65
Hello, Android!
Build:
Create a debugging-enabled package
$ ant debug ... debug: [echo] running zip align on final apk... [echo] Debug Package: bin/[Link] BUILD SUCCESSFUL $
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
12 / 65
Hello, Android!
Create a Virtual Device:
(Well use real hardware later)
$ android create avd --name virtual1_6 --target 2 ... Created AVD virtual1_6 based on Android 1.6... $ emulator @virtual1_6
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
13 / 65
Hello, Android!
Download the Package:
Tap the icon to start it running
$ adb install bin/[Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
14 / 65
Hello, Android!
... or:
Launch from the shell
$ adb shell # am start -a [Link] -n [Link]/.HelloWorld
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
15 / 65
Hello, World! on Beagle
Same as before, only:
Redirect the debug bridge via ADBHOST
$ $ $ # export ADBHOST=[Link] adb install bin/[Link] adb shell am start -a [Link] -n [Link]./HelloWorld
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
16 / 65
Hello, World! on Beagle
Tidy up:
Uninstall the application
$ adb uninstall [Link] Success
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
17 / 65
Eclipse Android Plugin
Android Development Tool (ADT):
Custom plugin for Eclipse IDE
Helps automate:
Set up new Android projects Create new applications, components Debugging
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
18 / 65
Eclipse Android Plugin
Install Eclipse, then:
Click Help | Software Updates... [Link] Click Install...
Then:
Point Eclipse to the Android SDK directory Window | Preferences | Android (See the instructions on [Link])
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
19 / 65
The Genesis of Android
Open Handset Alliance:
Google, eBay, OMRON, PacketVideo, ... ASUSTeK, HTC, LG, Garmin, Motorola, ... Sprint Nextel, T-Mobile, ... ARM, Atheros, Broadcomm, Qualcomm, TI, ...
To date, more than 47 organizations
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
20 / 65
Noteworthy Features
Android uses Java:
... everywhere
And so will you:
But nothing prevents native processes Some native interfaces are available
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
21 / 65
Noteworthy Features
Broad Java support:
[Link] [Link] [Link] [Link] ...
But only the mobile-appropriate bits!
Android is almost but not quite Java(tm)
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
22 / 65
Terminology
Activity :
A single visual user interface component List of menu selections, icons, checkboxes, ... A reusable component
Service:
Headless activity component Background processes
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
23 / 65
Terminology
Broadcast receiver :
Component that receives announcements No user interface May launch an Activity in response
Content provider :
Provides application data to others The only way to share data
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
24 / 65
Terminology
Intent :
Message to a component (or broadcast) Similar to a remote procedure call Make a phone call, the battery is low, ...
Intent lter :
Species which Intents a component can handle
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
25 / 65
Terminology
Application:
Sequence of one or more Activities Manifest tells which Activity to run rst Activities might come from other applications
Process model:
Each application is a unique Linux user Each application is a unique process Activities often in different processes
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
26 / 65
Terminology
Task stack :
Sequences of application-centric Activity classes Foreground is visible to user BACK key returns to most-recent Activity
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
27 / 65
Terminology
In other words:
Not the Linux concept of application!
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
28 / 65
Example
Display a map:
Utilize a preexisting Activity class Call startActivity() to launch it Control returns when the map activity exits
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
29 / 65
Declarative vs. Procedural Programming
Programmatic UI layout:
UI comes directly from source code Manual connections between views Small UI changes can mean big source code changes Application is brittle
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
30 / 65
Declarative vs. Procedural Programming
A better way:
Use a declarative approach Describe what you want, not how to get it Let the UI framework ll in the details
In Android:
XML-based layouts, values
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
31 / 65
Hello, Android! with XML
Applied to Hello, Android!:
Move the layout to XML Move the text to a resource
Why?
Swap [Link] les to change layouts Swap [Link] les to translate Separate logic from presentation
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
32 / 65
Hello, Android! with XML
res/layout/[Link]:
Describes the layout
1 2 3 4 5 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="[Link] android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/hello"/>
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
33 / 65
Hello, Android! with XML
res/values/[Link]:
Denes the string resource
1 2 3 4 5 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Welcome to Android string resources!</string> <string name="app_name">Hello, Android</string> </resources>
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
34 / 65
Hello, Android! with XML
HelloWorld class then becomes:
Just do what [Link] says
1 2 3 4 5 6 7 8 9 10 11 12 13 package [Link]; import [Link]; import [Link]; public class HelloAndroid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { [Link](savedInstanceState); setContentView([Link]); } }
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
35 / 65
Power Management
Obviously important!
Can be a difcult problem to solve Too much model exposure is bad Too little is also bad
Extends the Linux device model:
Introduces wake locks See [Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
36 / 65
Power Management
In a nutshell:
Applications dont control power at all Applications hold locks on power states If no locks are held, Android powers down
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
37 / 65
Power Management
PARTIAL_WAKE_LOCK
CPU on, screen off, keyboard off Cannot power down via power button
SCREEN_DIM_WAKE_LOCK
CPU on, screen dim, keyboard off
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
38 / 65
Power Management
SCREEN_BRIGHT_WAKE_LOCK
CPU on, screen bright, keyboard off
FULL_WAKE_LOCK
CPU on, screen on, keyboard bright
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
39 / 65
Example
1 2 3 4 5 6 7 8
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); [Link] wl = [Link](PowerManager.SCREEN_DIM_WAKE_LOCK, "tag"); [Link](); // ..screen will stay on during this section.. [Link]();
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
40 / 65
Audio and Video APIs
MediaPlayer class:
Standard support for many data formats URI invokes appropriate input method Consistent API regardless of data source
MediaRecorder class:
Support for audio recording only Video recording is planned
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
41 / 65
Example
1 2 3 4 5 6 7
MediaPlayer mp = new MediaPlayer(); [Link](PATH_TO_FILE); [Link](); [Link](); [Link](); [Link]();
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
42 / 65
Audio and Video APIs
Surfaceinger :
Centralized framebuffer management Related to 2D h/w acceleration
Audioinger :
Centralized audio stream management
You dont work with these directly!
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
43 / 65
Linux Kernel
Important enhancements:
logger binder ram_console timed_gpio Double-buffered framebuffer (*)
All are staged for/in [Link] releases
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
44 / 65
Linux Kernel
logger:
Miscdevice for logle-like functionality
binder:
Android IPC subsystem High performance, security-aware
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
45 / 65
Linux Kernel
ram_console:
RAM-based console device /proc/last_kmsg
timed_gpio:
GPIO that automagically turns itself back off
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
46 / 65
Linux Kernel
Double-buffered framebuffer:
Added by platform support authors Not Android-specic, but not widely available
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
47 / 65
Building the Android Runtime
General procedure:
Get the code Build it Install it :)
[Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
48 / 65
Building the Android Runtime
The code:
2.1GB (!) of git trees Uses the repo tool to manage
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
49 / 65
Building the Android Runtime
# repo init -b cupcake -u git://[Link]/platform/[Link] # repo sync ... apply tweaks ... # make [TARGET_PRODUCT=freerunner] # make [TARGET_PRODUCT=beagleboard]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
50 / 65
Building the Android Runtime
See also [Link] :
A Beagle-specic Android repository Probably more up-to-date than Android proper
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
51 / 65
Installing Android into a Target
Build products:
[Link] [Link] [Link] [Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
52 / 65
Installing Android into a Target
And also:
out/target/product/<name>/root out/target/product/<name>/system out/target/product/<name>/data
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
53 / 65
Installing Android into a Target
Whats in there?
The Android lesystem
# ls root data/ [Link] dev/
init [Link] [Link]
[Link] proc/ sbin/
sys/ system/
# ls system app/ [Link] bin/ etc/
fonts/ framework/
lib/ media/
usr/ xbin/
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
54 / 65
Installing Android into a Target
Combine into unied tree:
... to export over NFS, perhaps
# mkdir /exports/android # cd root && tar c * | tar x -C /exports/android # cd system && tar c * | tar x -C /exports/android
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
55 / 65
Installing Android into a Target
Or, of course:
Install images into the target system as-is (Formats vary depending on the target)
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
56 / 65
Specic to the Beagleboard
Getting ready:
Congure USB network connection Test adb
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
57 / 65
Specic to the Beagleboard
Connect OTG port:
Congure USB networking, verify
$ dmesg ... $ sudo ifconfig eth2 [Link] up $ ping [Link]
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
58 / 65
Specic to the Beagleboard
Launch a shell via adb:
The shell is actually on the target!
$ export ADBHOST=[Link] $ adb kill-server $ adb shell #
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
59 / 65
But what does all this mean?
Why Im excited about Android:
New ideas on current challenges New developers, community Relatively feature-complete Still under active development
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
60 / 65
But what does all this mean?
But expecially:
Intended, designed for community development (And delivers on that promise) Easy to get started, but still challenging
Not just a new API:
Also an entirely new approach, context
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
61 / 65
But what does all this mean?
What Android seems good for:
Open development models Highly-congurable systems
And obviously:
Mobile platforms Touch-oriented interfaces Network-centric applications
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
62 / 65
But what does all this mean?
What Android might not be good for:
Very low-end hardware Highly proprietary systems
Maybe, maybe not:
Static systems Single-task systems No networking requirements
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
63 / 65
But what does all this mean?
But who knows, really? :)
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
64 / 65
Google Android on the Beagleboard
Introduction to the Android API, HAL and SDK
Bill Gatliff
bgat@[Link] Freelance Embedded Systems Developer
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
65 / 65