Google Android on the Beagleboard
Introduction to the Android API, HAL and SDK
Bill Gatliff
bgat@billgatliff.com 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.
-- http://android.com/about/
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 ...
http://source.android.com/projects
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 boot.scr 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 example.HelloWorld $ cd helloworld/ $ vi src/example/HelloWorld/HelloWorld.java
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 example.helloworld; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloWorld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("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/Hello-debug.apk 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/Hello-debug.apk
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
14 / 65
Hello, Android!
... or:
Launch from the shell
$ adb shell # am start -a android.intent.action.MAIN -n example.HelloWorld/.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=192.168.99.100 adb install bin/Hello-debug.apk adb shell am start -a android.intent.action.MAIN -n example.HelloWorld./HelloWorld
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
16 / 65
Hello, World! on Beagle
Tidy up:
Uninstall the application
$ adb uninstall example.HelloWorld 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... https://dl-ssl.google.com/android/eclipse/ Click Install...
Then:
Point Eclipse to the Android SDK directory Window | Preferences | Android (See the instructions on developer.android.com)
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:
java.io java.net java.security java.sql ...
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 main.xml les to change layouts Swap strings.xml 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/main.xml:
Describes the layout
1 2 3 4 5 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" 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/strings.xml:
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 main.xml says
1 2 3 4 5 6 7 8 9 10 11 12 13 package com.example.hello; import android.app.Activity; import android.os.Bundle; public class HelloAndroid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
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 android.os.PowerManager
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); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "tag"); wl.acquire(); // ..screen will stay on during this section.. wl.release();
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(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start(); mp.pause(); mp.stop();
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 kernel.org 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 :)
http://source.android.com/
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://android.git.kernel.org/platform/manifest.git # 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 gitorious.org :
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:
userdata.img ramdisk.img system.img kernel.img
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/ default.prop dev/
init init.goldfish.rc initlogo.rle
init.rc proc/ sbin/
sys/ system/
# ls system app/ build.prop 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 192.168.99.101 up $ ping 192.168.99.100
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=192.168.99.100 $ 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@billgatliff.com Freelance Embedded Systems Developer
Copyright c Bill Gatliff, 2009
Google Android on the Beagleboard
65 / 65