SlideShare une entreprise Scribd logo
1  sur  122
Télécharger pour lire hors ligne
Android System Development
By Team Emertxe

Introduction to Android Architecture

History

Software stack

Directory structure

Environment Setup & Build
✔
Installing tools
✔
Downloading Android Source
✔
Android Build System
●
Booting the device
●
Debugging essentials

Linux Kernel

Overview of Linux Driver Eco system

Kernel Configuration & Compilation
Table of Content
What is Android?
●
Android is an OS primarily designed for mobile devices
●
Built on Linux Kernel
●
Java, the main programming language
●
Android is Open and Free
●
Most of the code available under Apache License
●
Developed and distributed by Google
●
Managed by Open Handset Alliance (OHA)
“Android provides a rich application framework that
allows you to build innovative apps and games for
mobile devices in Java language environment”
“Android provides a rich application framework that
allows you to build innovative apps and games for
mobile devices in Java language environment”
Version Release Date Features
1.6
(Donut)
15 Sep 2009 • Improved Android Market experience
• Gallery now enables users to select multiple
photos for deletion
• Support for CDMA and GSM
• Support for more screen sizes and resolutions
• Quick search box with updated Voice Search,
integration with native applications
• Updated technology support text-to-speech engine
4
History
(Version And Features)
Version Release
Date
Features
2.0/2.1
(Eclair)
26 Oct 2009  New capabilities in Accounts, contacts & Sync
Management
 Quick Contact
 Optimized hardware speed
 New Browser UI and HTML 5 support
 Improved Google Maps 3.1.2
 MicrosoftExchage support
 Built in flash support for Camera
 MotionEvent class enhanced to track multi-touch
events
 Improved virtual keyboard
 Bluetooth 2.1
 Live Wallpapers/Folder
5
History
(Version And Features)
Version Release
Date
Features
2.2
(Froyo)
20 May 2010 • OS speed, memory, and performance optimizations
• Dalivk JIT Complier
• Improved application launcher with shortcuts to
Phone and Browser applications
• USB tethering and Wi-Fi hotspot functionality
• Automatic App update
• Quick switching between multiple keyboard
languages and their dictionaries
• Support for numeric and alphanumeric passwords
• Support for file upload fields in the Browser
application
• Adobe Flash10.1 support
6
History
(Version And Features)
Version Release Date Features
2.3
(Gingerbread)
6 Dec 2010 • Updated user interface design
• New audio effects
• Support for Near Field Communication
• Redesigned multi-touch software keyboard
• Enhanced support for native code development
• Audio, graphical, and input enhancements for
game developers
• Concurrent garbage collection for increased
performance
• Native support for more sensors (such as
gyroscopes and barometers)
• A download manager for long running downloads
• Improved power management and application
control
7
History
(Version And Features)
Version Release Date Features
3.1 and 3.3
(Honeycomb)
22 Feb 2011 • It was the first Android OS version which was
specifically designed for tablets
• It adds toolbars at top and bottom and
incorporates tabbed browsing and other desktop
features
•
• Honeycomb uses Microsoft's Media Transfer
Protocol (MTP) for file transfer rather than
connecting as a USB mass storage device
History
(Version And Features)
Version Release Date Features
4.0(Ice Cream
Sandwich)
19 Oct 2011  New typeface called Roboto
 New Face unlock feature
 Android Beam – A secure NFC powered content
sharing platform
 Re-arrangeable folders, Favorites Tray,
Screenshots
 Swipe to dismiss notifications, tasks and browser
tabs
 W-Fi Direct
 Manage apps running in background
 Revamped Gmail interface
History
(Version And Features)
Version Release
Date
Features
4.1, 4.2 & 4.3
(Jelly Bean)
27 Jun 2012  User interface has been made faster and smoother
under Project Butter
 Notification center has been improved with
expandable and actionable notifications
 Off line voice recognition and typing facility
 Better Google Voice Search
 Support for external Braille input in enhanced
Accessibility options
 Android Beam with enhanced option to transfer
photos and videos
 Google Now
 App encryption and Smart App updates
History
(Version And Features)
Version Release Date Features
4.4 (KitKat) Nov 2013  Faster Multi-tasking
 A smarter caller id
 Print where ever, when ever.
 Pick a file, any file
History
(Version And Features)
Version Release
Date
Features
5.0 (Lollipop) Nov 2014  Support for 64-bit CPUs
 Support for print previews
 Audio input and output through USB devices
 Android Runtime (ART) with ahead-of-time (AOT)
compilation and improved garbage collection
(GC), replacing Dalvik that uses just-in-time (JIT)
compilation
History
(Version And Features)
Version Release Date Features
6.0
(Marshmallow)
17 Aug 2015 • Android Pay
• Fingerprint Scan Standardization
• App Permission Control
• App Links
• Doze
• Home Screen Rotation
• Chrome Custom Tab
• Auto backup and Store
• Status bar icon removal
History
(Version And Features)
Software Stack (Architecture)
Version Release
Date
Features
Android N 22 Aug 2016 • Split Screen
• Quick Switching beween apps
• Notification redesigned
• Customizable Quick Setting
• Multi-language support
• Seamless update
History
(Version And Features)
Android Software Stack
● Android is built on Linux kernel
● Does not include full set of standard Linux utilities
● It has a core capability like
– Security
– Memory management
– Process management
– Network stack
– Driver model
– Abstraction Layer
Android Software Stack
Linux Kernel
Dialer Email Cal Camera . . .
Applications
Managers
Activity Location Package Notification
Resource WindowTelephony
Content Providers
View System
Java API Framework
Android Runtime
Core Libraries
Native C/C++ Libraries
WebkitOpen MAX AL Libc
Media Framework . . .OpenGL ES
Android Runtime
Hardware Abstraction Layer
Sensor WiFi Bluetooth Camera . . .
Linux Kernel
Drivers
Audio Binder (IPC) Display Keyboard
Bluetooth Shared MemoryCamers
Power Management
WiFi USBSensor . . .
Flash Memory
Linux Kernel
● It has a core capability like:
– Display, Camera, Bluetooth, Flash Memory, USB Driver,
Keypad, WiFi, Audio and Power Management
Native C/C++ Libraries
WebkitOpenMAX AL Libc
Media Framework SSLOpenGL ES
SQLite
Vulkan
Camera
. . .
Architectural Detail
(Native Libraries)
● Native libraries are written in C/C++
● Called through Java wrapper APIs (JNI)
● Current API level 24
● Layer contains
– OpenMAX AL, OpenGL ES, OpenSL ES
– 2D and 3D (Vulkan) graphics
– Media codecs (MPEG-4, H.264, MP3, etc.)
– SQL database (SQLite)
– A native web browser engine (WebKit)
Functional Libraries
(webkit)
● Open source WebKit browser: http://webkit.org
● Renders pages in full (desktop) view
● Full CSS, Javascript, DOM, AJAX support
Functional Libraries
(SQLite)
● Server less, transactional SQL database engine
● Most widely deployed SQL database engine in the world
● Light-weight transactional data store
● Back end for most platform data storage
● Transactions are Atomic, Consistent, Isolated and Durable
(ACID) even after system crashes and power failures
● Zero-configuration - no setup or administration needed
● Complete database is stored in single cross-platform disk file
● Cross-platform support (Linux, OS X, Windows 10 mobile)
Android Runtime
Core Libraries
Android Runtime
Android Runtime (ART)
● Introduced in Android version 5.0 (API level 21)
● Each app runs in its own process and own instance of ART
● ART is written to run multiple virtual machines on low-memory
devices by executing DEX files
● DEX is a bytecode format designed specially for Android that's
optimized for minimal memory footprint
● Build toolchains, such as Jack, compile Java sources into DEX
bytecode
● DEX was runtime prior to ART
Android Runtime
Core Libraries
Android Runtime
Android Runtime (ART)
(Key features)
● Ahead-of-time (AOT) and just-in-time (JIT) compilation
● Optimized garbage collection (GC)
● Better debugging support
– Dedicated sampling profiler
– Detailed diagnostic exceptions and crash reporting
– Ability to set watch points to monitor specific fields
Components Description
Content Providers Access, store and share application data
Resource Manager Access to strings, graphics & layout files
Notification Manager Display custom alerts in the status bar
Activity Manager Manages life cycle of apps
Window Manager Rendering view on the screen
View System UI (lists, grids, text boxes, buttons)
Package Manager Application formation
Location Manager Location based services
Java API Framework
Dialer Email Cal Camera . . .
Applications
Application Layer
● Collection of built-in & 3rd party apps
● Built-in apps - Dialer, Web Browser
● 3rd party apps – Nova Launcher
● Same APIs & approval process for
both
● Built-in apps can be stopped to use
3rd party apps
Dalvik Runtime
● Dalvik is a virtual machine (VM) in Android OS
● Android apps are converted into compact Dalvik
EXecutable (.dex)
● Dalvik VM is a register-based architecture
● A tool called dx is used to convert some (but not all)
Java .class files into the .dex format
Dalvik Runtime
● Multiple classes are included in a single .dex file
● Initially, Dalvik had a just-in-time compiler
● Being optimized for low memory requirements,
Dalvik has some specific characteristics that
differentiate it from other standard VMs:
– VM was slimmed down to use less space
– It uses its own bytecode, not Java bytecode
– Moreover, Dalvik had been designed so that a
device can run multiple instances of VM efficiently
Dalvik Vs JVM
● Dalvik Virtual machine (DVM)
– Register Architecture
– Designed to run on low memory
– Uses its own bytecode
– Runs .dex file (Dalvik EXecutable)
● Java Virtual Machine (JVM)
– Stack Architecture
– Uses java bytecode
– Runs .class file having JIT
Android Runtime
● Each Android app is a process
● App process has an instance of Android Runtime
● ART can run multiple VMs efficiently
● Executes classes compiled by a Java language compiler
that have been transformed into the .dex format
● Dalvik EXecutable (.dex) format is optimized for ART
Android Bionic
● A Google developed C library
● Based on BSD standard C library
● Does not have full support of POSIX APIs
● Does not support full pthreads
– Example : pthread_cancel not supported
● Has been kept simple, fast and lightweight
● GPL & LGPL code has been kept “out” of user space
● BSD license is provided
Android Kernel Changes
● Wakelocks
● Binder IPC
● Klogger
● Anonymous Shared Memory (ashmem)
● Alarm Timers
● Low memory killer
● ION memory allocator
● Network Security
● Various drivers
● Various fixes
Android Kernel Changes
(Wakelocks)
● Linux has two power management methods
– APM ( Advanced Power Management)
– ACPI ( Advanced Configuration and Power Interface)
● Android uses none of them
● Android has its own Power Manager (app centric)
● Android Apps have to request “wakelock”
● Wakelock prevent host CPU to go to sleep mode
● If no wakelocks are held, PM will put device in sleep mode
Wakelock CPU Screen Keypad
PARTIAL_WAKE_LOCK ON OFF OFF
SCREEN_DIM_WAKE_LOCK ON DIM OFF
SCREEN_BRIGHT_WAKE_LOCK ON BRIGHT OFF
FULL_WAKE_LOCK ON BRIGHT BRIGHT
Android Kernel Changes
(Wakelocks)
*FULL_WAKE_LOCK : Deprecated in API level 17. App should use
FLAG_KEEP_SCREEN_ON (As long as app window is in focus keep the screen
BRIGHT.
Android Kernel Changes
(Binder IPC)
●
Signals
●
Semaphores
●
Message Queues
●
Pipes
●
Sockets
●
Shared Memory
Linux System V IPC
●
Binder (system wide)
●
Sockets
●
Ashmem
Android IPC
●
App : Android App component can be started by any process
●
Stability : No other process shall get affected if a process misbehaves
●
Security : Each process is sandboxed and runs under distinct system ID
●
Memory : If not needed, processes can be removed to free memory
●
System V IPC is prone to resource leak and instability in view of above
requirements (Hence binder IPC is rewritten and used)
Android Kernel Changes
(Binder IPC)
● Binder IPC “Link to death” mechanism – built in
reference counting of object and notification of death
● When a binder service is no longer referenced by
any clients, its owner is automatically notified that it
can dispose of it
Android Kernel Changes
(Klogger)
●
syslog daemon to handle userspace logs
●
Syslog () call over socket generates expensive task switching
●
Exposed in /var/log directory
●
dmesg command to get kernel logs ( printk() )
Linux
●
A kernel driver
●
Uses 4 circular buffers in kernel memory area
●
Buffers are exposed in /dev/log directory
●
Logcat command to access logs
Android
Android Kernel Changes
(ashmem)
●
Anonymous Shared Memory (ashmem)
●
Open /dev/ashmem
●
Supports reference counting so that kernel can reclaim resources
which are no longer needed
●
Discard shared memory units under memory pressure
●
Allow kernel to shrink shared memory region under low memory
pressure
● Linux IPC based on shared memory is prone to resource leak
●
Can’t be downsized under low memory pressure
Android Kernel Changes
(Alarm timer)
●
Linux has High Resolution Timers that can wake up a process but get
missed when system is suspended
●
Real Time Clock (RTC) can wake the suspended system but can’t wake
a process
●
Developed alarm timers by adding patches to RTC and High Resolution
times so that suspended system can wake up and applications can
accomplish its job
Android Kernel Changes
(ION memory allocator)
●
Android Requirement :
✔
Unified memory management interface for ease of use (allocate
memory in the system for most of the cases)
✔
Allow efficient (zero copy) sharing of memory between user space,
kernel space & hardware devices
Android Kernel Changes
(ION memory allocator)
●
Available memory management mechanisms
●
DMABUF – from Linaro
●
CMEM – from TI
●
PMEM – from Qualcomm
●
NVMAP – from NVIDIA
●
Linux usually allocates buffer up to 512 pages (4 KiB / page)
●
Linux available heaps (3 types) – vmalloc (virtual), kmalloc (physical)
and pre-allocated (reserved) at boot
Android Kernel Changes
(ION memory allocator)
●
ION is generalized memory manager
●
Introduced in Android 4.0 ICS
●
ION removes ARM specific dependencies
●
Provides a common structure for how memory will be managed and
used by GPU, Audio and Camera drivers
●
Default ION driver offers three heaps
●
ION_HEAP_TYPE_SYSTEM – allocation via vmalloc_user()
●
ION_HEAP_TYPE_SYSTEM_CONTIG – allocation via kzalloc()
●
ION_HEAP_TYPE_CARVEOUT - carveout memory is physically
contiguous and set aside at boot
●
Developers may choose to add more ION heaps
●
ION_HEAP_TYPE_IOMMU was added by NVIDIA for hardware blocks
equipped with an IOMMU
●
User space programs shall open /dev/ion device before it can allocate
memory from ION
Android Kernel Changes
(ION memory allocator)
●
Memory sharing between user space, kernel & devices without copy
●
This is achieved by sharing memory pages directly to avoid copying
●
Once memory is allocated successfully from a heap, a file descriptor is
returned to user space which can be subsequently used to invoke
mmap() to map the allocated pages into user space
●
Useful scenario, for Instance, OpenGL can manipulate the memory in
user space easily and a GPU can also populate the same piece of
physical memory with zero copying
Android Kernel Changes
(Paranoid Network Security)
●
In Linux, any app can open the network connection
●
Android needs strict policy for network access control
●
Permission based network access
●
Filtered with GID
#define GID Capability
AID_NET_BT_ADMIN 3001 Can create an RFCOMM, SCO, or
L2CAPP Bluetooth socket
AID_NET_BT 3002 Can create a Bluetooth socket
AID_INET 3003 Can create IPv4 or IPv6 socket
AID_NET_RAW 3004 Can create certain kinds of IPv4
sockets??
AID_NET_ADMIN* 3005 Allow CAP_NET_ADMIN permissions for
process
Patches in mainline
Following patches/features are added in the mainline kernel
(3.10 onward):
●
Binder
●
Alarm Timers (under the name POSIX Alarm Timers introduced
in 2.6.38)
●
Ashmem
●
Klogger
●
Timed GPIOs
●
Low Memory Killer
●
RAM Console (superseded by pstore RAM backend introduced in
3.5)
Missing Patches
Following patches/features are missing from the mainline kernel
(As of 3.10 ) -
●
Paranoid Networking
●
ION Memory Allocator
●
USB Gadget
●
FIQ debugger
●
pmem (removed in 3.3)
Directory Structure
Directory Structure
(Android Root)
Root Sub-directory Description
android device Device specific (Samsung, HTC, LG, etc) stuff
kernel Kernel tree for chipsets (msm, mediatek, etc..)
platform Android platform source code
product For variety of products, currently for brillo
public-projects Empty (Android based public projects)
toolchain jack, gcc, ndk, llvm, etc..
tools repo, aospstats
trusty For trusted execution environment components
(Google's Trusty OS)
Directory Structure
(Platform)
# Directory Description
1 abi Not very clear, seems to be created for APIs for binary
interface; currently it contains C++ files having APIs
2 art Android Runtime
3 bionic Android's standard C library
4 bootable Code samples (bootloader, diskinstaller, recovery)
5 build The main entry point of the build system
6 cts contains compatibility test suite
7 dalvik Dalvik tools and core libraries
8 developers Not clear, build, demos, samples, docs etc..
9 development Platform engineering tools and sample apps
10 docs AOSP documents
11 external Contains source code for all external open source
projects
Directory Structure
(Platform)
# Directory Description
12 frameworks Contains sources of all the frameworks
13 hardware Hardware related source code such as HAL
14 libcore Test code for dalvik, DOM, JSON, LUNI (lang util net
io) and other support files
15 libnativehelper VM-agnostic native helper functions
16 ndk build scripts & helper files for building the NDK
17 out Build generated directory, output is placed here
18 packages Standard android apps of AOSP
19 pdk Reduced set of Android release provided to chipset
vendors and OEMs to migrate to new release
20 prebuilts cross compilations toolchains for different
development machines
21 sdk To compile the SDK. Lot of tools are moved to
prebuilts
Directory Structure
(Platform)
# Directory Description
22 system System core files (commands, debugging, bootstat)
23 toolchain To build and install GNU tools
24 tools libraries that are sourced in tools/base and tools/swt
are converted to prebuilts which are located in
prebuilts/devtools
25 vendor Initially created for vendors (HTC); It seems to be
discontinued
Setting up Build Environment
System Requirements
● Intel core i5 or higher
● RAM – 4 ~ 8 GB
– Recommended 8GB
● HDD – 100 ~ 500 GB
– Recommended 300GB
● Ubuntu 14.04 LTS or higher
– Recommended 16.04
● Swap partition - 8 GB
● Optionally enable ccache
– Recommended for servers
Check your system
● CPU configuration
– $ lscpu
● Available memory
– $ free -h
● Linux Version
– $ uname -a
● OS distribution
– $ lsb_release -a
● Running processes
– $ top
● IP address
– $ ifconfig
Major Steps
● Choose a branch to build
● Setup Linux build environment
– Install openJDK (JAVA 8)
– Installing git
– Install repo
● Download source (repo sync)
● Install arm toolchain
*https://source.android.com/source/initializing.html
Installing essential packages
● Installing essential packages
$ sudo apt-get install git-core gnupg flex bison gperf build-
essential 
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev
ccache 
libgl1-mesa-dev libxml2-utils xsltproc unzip
● $ sudo apt-get install gtkterm
● $ sudo apt-get install adb
*https://source.android.com/source/initializing.html
Configuring USB access
● $ wget -S -O - http://source.android.com/source/51-
android.rules | sed "s/<username>/$USER/" | sudo
tee >/dev/null /etc/udev/rules.d/51-android.rules;
sudo udevadm control --reload-rules
Check Java version
● Verify Java version (if you already have)
– $ java -version
● You should get following message :-
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-3~14.04.1-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)
*Skip this slide if you already have openJDK 8
Installing openJDK8
●
Installing PPA
– $ sudo add-apt-repository ppa:openjdk-r/ppa
– $ sudo apt-get update
– $ sudo apt-get install openjdk-8-jdk
●
If you have more than one java versions then use update-
alternatives command
– $ sudo update-alternatives --config java
●
Set the correct version number
– $ sudo update-alternatives --config javac
●
Finally, verify the installed version with below command
– $ java -version
https://help.ubuntu.com/lts/serverguide/git.html
Installing git (ubuntu)
● Run following command
– $ sudo apt-get install git
● Configure git with your real name and email address;
you will need an email address that is connected with
a registered Google account
– $ git config --global user.email "you@example.com"
– $ git config --global user.name "Your Name"
● Verify the configuration with following command
– $ git config -l
*https://source.android.com/source/downloading.html
Installing repo tool
● Repo tool is required to work with Git to work with
Android
● Create a bin directory in home folder
– $ mkdir ~/bin
– $ export PATH=~/bin:$PATH
● (or edit .bashrc file and add path)
● Download repo tool and make sure it is executable
– $ curl https://storage.googleapis.com/git-repo-
downloads/repo > ~/bin/repo
– $ chmod a+x ~/bin/repo
Initializing repo client
● Create a working directory in home folder
– $ mkdir ~/android
– $ cd android
– $ repo init -u
https://android.googlesource.com/platform/manifest -b
android-7.1.2_r4
● On successful initialization .repo folder shall be created
– $ cd .repo
● Clone git repository
– $ git clone https://github.com/android-rpi/local_manifests
Repo Sync
● Download the Android source
– $ repo sync
● Syncing with repository would take few hours
● Time depends on your connection speed and server
usage
● Ensure there are no or few interruptions in
connectivity
Checking GCC version
● Verify gcc version installed in your machine
– $ gcc --version
● You should get follwing message :-
gcc (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
Skip this slide if you already have gcc 4.9 installed
Installing gcc/g++
● Installing
– $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
– $ sudo apt-get update
– $ sudo apt-get install gcc-4.9 g++-4.9
● Removing old links to gcc-4.8 or lesser
– $ sudo rm /usr/bin/gcc
– $ sudo rm /usr/bin/g++
● Creating soft-links to gcc-4.9
– $ ln -s /usr/bin/gcc-4.9 /usr/bin/gcc
– $ ln -s /usr/bin/g++-4.9 /usr/bin/g++
ARM toolchain
● Check following directory (you must have toolchain)
– $ ls android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-
4.9/bin/
● Otherwise, download from Android Developer web site
– https://android.googlesource.com/platform/prebuilts/gcc/linux-
x86/arm/arm-linux-androideabi-4.9/+/android-7.1.2_r4
● Set the toolchain path (if stored in custom user directory)
– $ export PATH=<toolchain directory> : $PATH
● Or edit “.bashrc” and add above export command
Install python mako
● Install python mako module
– $ sudo apt-get install python-mako
● Python is used by build system
Make Hierarchy
Makefile Root working directory Top level make file
main.mk build/core/ Top level build configuration file
config.mk
definitions.mk
dex_preopt.mk
build/core/ Includes all other sub .mk file
Standard flag definitions
Dalvik default options
● Android.mk – Platform configuration; to include & build sources for
your device
● AndroidBoard.mk – Kernel configuration; build system uses that to
drop the kernel image in place
● AndroidProducts.mk - specify appropriate product make file to be
used for building.
Example – device/brcm/rpi3/AndroidProducts.mk
● device_codename.mk - Every device has a codename, and there is a
file named as the codename of device. It specifies the properties and
extras to copy over into the final output.
Example: device/brcm/rpi3/rpi3.mk
● BoardConfig.mk - This is where compiler conditional flags are set,
partition layouts, boot addresses, ramdisk size etc..
Example : device/brcm/rpi3/BoardConfig.mk
Make configuration
Build Commands
● Builds only the package, instead of going through entire build
– $ make <package-name>
● Cleans all files generated by previous compilations
– $ make clean
● Removes all files generated by compilation of given package
– $ make clean-<package>
● Execute 'make' from top of the tree (even if your current directory is
somewhere else)
– $ m
●
Builds all of the modules in current directory
– $ mm
●
Build all of the modules in supplied directory
– $ mmm <dir-path>
Compiling Sources
Kernel Compilation
● $ cd kernel/rpi
● $ ARCH=arm scripts/kconfig/merge_config.sh
arch/arm/configs/bcm2709_defconfig
android/configs/android-base.cfg android/configs/android-
recommended.cfg
● $ ARCH=arm CROSS_COMPILE=arm-linux-androideabi-
make zImage -j4
● $ ARCH=arm CROSS_COMPILE=arm-linux-androideabi-
make dtbs -j4
Android Compilation
(envsetup.sh)
● Modifies the current environment, it adds
many useful shell macros; these macros will
serve several purposes:
– Configure and set up the build system
– Ease the navigation in the source code
– Ease the development process
– Some macros will modify the environment
variables, to be used by the build system later on
Android Compilation
(lunch)
● “lunch” is a shell function defined in build/envsetup.sh
● It sets the environment variables needed for the build
● TARGET_PRODUCT
– Which product to build. To build for the emulator, you will
have aosp_<arch>
● TARGET_BUILD_VARIANT
– Either user, userdebug or eng
● TARGET_BUILD_TYPE
– Either release or debug
Android Compilation
(TARGET_BUILD_VARIANT)
●
TARGET_BUILD_VARIANT := user
– Secure, No root access
– “adb” disabled
– Modules marked as user are included
– Set for production phones
●
TARGET_BUILD_VARIANT := userdebug
– Secure, No root access
– “adb” enabled
– Modules marked as “user” and “debug” are included in binary
– Set during app development
● TARGET_BUILD_VARIANT := eng (This is default make flavour)
– Not secure, By default root access is enabled
– “adb” is enabled
– Modules marked as “user”, “debug” and “eng” are included
– Set during initial board bring up and native development
Android Compilation
(LOCAL_MODULE_TAGS)
● LOCAL_MODULE_TAGS := user
– Module will be included in user, userdebug & eng
● LOCAL_MODULE_TAGS := debug
– Module will be included in userdebug & eng builds
● LOCAL_MODULE_TAGS := eng
– Module will be included in “eng” build only
● LOCAL_MODULE_TAGS := optional
– Module will be included in the build only if listed in
PRODUCT_PACKAGES section of product makefile
*debug and eng modules could be modules used for testing is
different stages of product development
Android Compilation
(TARGET_BUILD_TYPE)
● TARGET_BUILD_TYPE := debug
– Set for development binary
– Debug options across whole system enabled
● TARGET_BUILD_TYPE := release
– Set for production binary
– Debug options are disabled
Android Compilation
(Resource Overlays)
● PRODUCT_PACKAGE_OVERLAYS := <relative-
overlay-path>
● Resource overlays specify resource files that are
applied on top of the defaults
● The most commonly customized settings are
contained in the file
frameworks/base/core/res/res/config.xml
● Example :
device/brcm/rpi3/overlay/frameworks/base/core/res/r
es/config.xml
Android Asset Packaging Tool
● This tool is part of SDK (build system)
● It is used to view, create, and update Zip-
compatible archives (zip, jar, apk)
● It can also compile resources into binary assets
Android Compilation
● $ source build/envsetup.sh
● $ lunch rpi3-eng
● Make -j4
Jack Server Settings
● Try following if build stops due to jack server
● Set Xmx to higher number (depends on available
RAM)
– $ export JACK_SERVER_VM_ARGUMENTS="-Xmx4g
-Dfile.encoding=UTF-8 -XX:+TieredCompilation"
● $ jack-admin kill-server
● $ jack-admin start-server
● Make -j2
Verify output files
● Android System image (system.img)
– $ ls out/target/product/rpi3
● Boot files (Raspberry Pi firmware)
– $ ls device/brcm/rpi3/boot
– bootcode.bin (bootloader), start.elf, fixup.dat, config.txt, cmdline.txt
● Linux Kernel Image (zImage)
– $ ls kernel/rpi/arch/arm/boot/
● RPI device tree binary
– $ ls kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb
– $ ls kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo
● Ramdisk image
– $ ls out/target/product/rpi3/ramdisk.img
Knowing firmware files
●
“bootcode.bin”
– Is a second stage bootloader
– Executed on VideoCore IV GPU
– Loads the third stage bootloader – start.elf
– Start GPU
●
“start.elf”
– GPU firmware (3rd stage bootloader)
– Reads config.txt and cmdline.txt
– Loads Linux kernel image
– Start CPU
Knowing firmware files
●
GPU runs it's own simple OS, called VCOS (Video Core
Operating System)
●
1st stage bootloader is programmed in BCM2835 SoC; It
mounts FAT32 boot partition on the SD card so that the
second stage bootloader can be accessed
●
After Linux is started, code on GPU is not unloaded; GPU still
can communicate to CPU through a protocol
Knowing firmware files
●
“config.txt” - Containing configuration parameters for
– VideoCore IV GPU (Video/HDMI modes, memory, console frame
buffers etc)
– Linux Kernel (load addresses, device tree, uart/console baud
rates etc)
●
“cmdline.txt”
– Contains kernel command line parameters to be passed to Linux
kernel at boot
●
“fixup.dat”
– To configure the SDRAM partition between GPU & CPU
Knowing firmware files
●
RPI device tree binary
$ ls kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb
$ ls kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo
Prepare SD card
●
Partitions of the card should be set-up like followings
p1 512MB for BOOT : Do fdisk : W95 FAT32(LBA) & Bootable, mkfs.vfat
p2 512MB for /system : Do fdisk, new primary partition
p3 512MB for /cache : Do fdisk, mkfs.ext4
p4 remainings for /data : Do fdisk, mkfs.ex4
●
Set volume label for each partition - system, cache, userdata
●
Use -L option of mkfs.ext4, e2label command, or -n option of mkfs.vfat
Prepare SD card
(check mount points)
●
Check mount points for sdcard (Usually /dev/sdb<n>)
$ mount
●
Unmount the partitions
$ sudo umount /dev/sdb1
$ sudo umount /dev/sdb2
●
Validate whether all partitions are unmounted
$ mount
Prepare SD card
(Create partitions)
●
Create new partitions
$ sudo fdisk /dev/sdb
●
List partions using p command
●
Delete partions using d command
●
Create partions using n command (Create all as primary (use p))
●
Sizes (P1, P2, P3, P4): +512M, +3G, +512M, rest will be default
●
Change partion type using t command (select c (FAT32 format) for p1 here)
●
Define p1 as active using a command
●
!!! Make sure to save the partion table using w
Prepare SD card
(Format partitions)
●
Partion 1 is FAT32 format
$ sudo mkfs.vfat -n boot /dev/sdb1
●
All others are ext4
$ sudo mkfs.ext4 -L system /dev/sdb2
$ sudo mkfs.ext4 -L cache /dev/sdb3
$ sudo mkfs.ext4 -L userdata /dev/sdb4
Copy images to SD card
●
Copy system image
$ cd out/target/product/rpi3
$ sudo dd if=system.img of=/dev/<p2> bs=4M
●
Copy Boot partition, kernel & ramdisk
$ cp device/brcm/rpi3/boot/* to p1:/
$ cp kernel/rpi/arch/arm/boot/zImage to p1:/
$ cp kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb to p1:/
$ cp kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo to
p1:/overlays/vc4-kms-v3d.dtbo
$ cp out/target/product/rpi3/ramdisk.img to p1:/
●
To preserve permissions
$ sudo cp -a /path-to-working-system-part/* /media/emertxe/system/
Bootloader
●
Is a small piece of code executed before any operating system
becomes ready to run
●
Bootloader start running before any other software; therefore it is
highly processor specific and board specific
●
Bootloaders usually starts from ROM
●
When a board is switched on CPU jumps to a hardcoded/predecided
address which is the beginning of bootloader instructions
●
First task of bootloader (generally) to map RAM to predefined
addresses; After RAM is mapped Stack Pointer (SP) is setup
Bootloader
●
Bootloader is responsible for
✔
Basic hardware initialization (RAM, Serial port, Screen, Keyboard etc..)
✔
Loading kernel image (from flash, network or other storage) to RAM
✔
Decomprerss kernel image
✔
Execute kernel
Boot Sequence
(PC)
BIOS
(from ROM)
Power-on
Stage 1 boot
(from RAM)
Stage 2 boot
(from RAM)
Kernel boot
1. Basic Input/Output System
2. Runs POST stands for Power on Self Test
3. Initializes monitor and keyboard
4. Loads 1st stage bootloader from HDD/CD-
ROM/Floppy in RAM
1. Example MBR (Master Boot Record)
2. Typically, stored in 1st
sector of HDD or CD-ROM
3. Size is less than 512 bytes
4. Loads 2nd stage bootloader in RAM
1. Example GRUB (Grand Unified Bootlader)
2. Has knowledge of file system
3. Decompress & loads Kernel image & initrd in
RAM
1. Mounts RFS
2. Executes /sbin/init program
Boot Sequence
(Embedded)
Boot ROM
(from ROM)
Power-on
1st
stage Bootloader
(from SRAM)
Kernel boot
1. Board specific bootloader
2. Initialize minimal hardware
3. Load first stage bootloader (MMC, SPI flash)
in SRAM
1. Initialize DRAM, NAND, SPI controller
2. Load 2nd
stage bootloader
2nd
stage Bootloader
(from RAM)
1. Example U-boot or Barebox
Initialize other hardware (USB, NW)
2. Load Kernel image and Ramdisk
1. Mounts RFS
2. Executes /sbin/init program
Android Bootup
Bootloader
- Initialize minimal HW
- Initialize RAM
- Load kernel, Ramdisk
Kernel boot
- Init Kernel sub-system
- Init Drivers
- Mount RFS
- Start “Init” process
Zygote’s man()
- register Zygote socket
- preload Java classes
- preload resources
- start system_server
- Listen to connections
system_server
- Init service
- Register w/ service Manager
Activity Manager
- Init Self
- send intent CATEGORY_HOME
Init
- Mount /dev, /sys etc
- SELinux Setup
- Run init.rc script
- start native Daemons
Native Daemons
- rild
- netd
- adbd
- bluetoothd
- debuggerd
- servicemanager
- mediaserver
- app_process (Zygote)
runtime
- start dalvikvm
- call Zygote’s main ()
App
fork()
startViaZygote()
Launcher
- Init self
- register onClick() handlers
Click
Zygote
● Zygote is a daemon whose goal is to launch Apps
● Zygote is the parent of all App process
● The startup of the process is triggered by Init.rc
● It is actually started by app_process
Zygote
● app_process launches
– Zygote
– Creates first Dalvik VM
– Calls Zygote’s main () method
● Zygote
– Preloads all necessary Java classes and resources
– Starts System Server
– Opens a socket /dev/socket/zygote to listen for requests for
starting apps
● System Server is a detached process from it’s parent
– Initializes different System Services and starts Activity Manager
Zygote
● Zygote receives a request to launch an App
through /dev/socket/zygote
● Zygote can be by adding keyword “disabled” in
init.rc
Hardware Details
Raspberry Pi3
(specifications)
●
Broadcom BCM2837 chipset running at 1.2 GHz
●
64-bit quad-core ARM Cortex-A53
●
802.11 b/g/n Wireless LAN
●
Bluetooth 4.1 (Classic & Low Energy)
●
Dual core Videocore IV® Multimedia co-processor
●
1 GB LPDDR2 memory
●
microUSB connector for 2.5 A power supply
●
1 x 10/100 Ethernet port
●
1 x HDMI video/audio connector
●
1 x RCA video/audio connector
●
1 x CSI camera connector
●
4 x USB 2.0 ports
●
40 GPIO pins
●
microSD card slot
Raspberry Pi3
(Hardware)
Raspberry Pi3
(Serial pin out)
Debugging Essentials
Android Debug Bridge
●
A command line tool that lets you communicate with an emulator
or connected Android device
●
ADB commands cane be categorized as follows -
✔
General
✔
Debug
✔
Connection
✔
Package Manager
✔
File Manage
✔
Network
✔
Logcat
✔
System
Android Debug Bridge
(General)
Command Description
$ adb devices To list all the attached device instances
$ adb help Prints a list of supported adb commands
$ adb version Prints the adb version number
Example:
$ adb devices
$ adb version
$ adb help
Android Debug Bridge
(Connection)
Command Description
$ adb connect <ip > [:port] To connect to device specified with IP
$ adb usb Restarting ADB in USB mode
Example:
$ adb connect 192.168.32.199
Android Debug Bridge
(Disconnection)
Command Description
$ adb disconnect To disconnect from already connected
device
Example:
$ adb disconnect
Android Debug Bridge
(General)
Command Description
$ adb <option> <device-id> <command> If there are multiple devices
Options:
-d : attached usb device, -e : emulator, -s specific device/emulator
Example:
/* Device shell command */
$ adb -d shell ls
/* Emulator shell command */
$ adb -e shell ls
/* Specific device/emulator command */
$ adb -s ZI123 shell ls
Android Debug Bridge
(Debug)
forward
Syntax $ adb forward <local> <remote>
Example $ adb forward tcp:8000 tcp:9000
Description set up forwarding of host port 8000 to emulator/device port
9000
Pre-rquisite Enable USB debugging on the device
kill-server
Syntax $ adb kill-server
Example -
Description Terminates the adb server process
Pre-rquisite -
Android Debug Bridge
(Install a package)
install
$ adb install [option] <package-name> Installing a package
Options :
-l Forward lock application
-r Replace existing application
-t Allow test packages
-s Install application on sdcard
-d Allow version code downgrade
-p Partial application install
Example:
$ adb install -t mytest.apk
Android Debug Bridge
(Uninstall a package)
uninstall
$ adb uninstall [option] <package-name> Uninstalling a package
Options :
-k : to keep data and cached items
Example:
$ adb uninstall mytest.apk
Android Debug Bridge
(Package Manager)
shell
$ adb shell pm list packages Installing a package
$ adb shell pm path <package> Display path of package
$ adb shell pm clear <package> Clearing app data, cache
Example:
$ adb shell pm path com.android.phone
$ adb shell pm clear com.android.phone
Android Debug Bridge
(File Manager)
shell
$ adb pull <remote> [local] Download a specified file from an
emulator/device to your computer.
By default pulls in platform-tools
directory
$ adb push <local> [remote] Upload a specified file from your
computer to an emulator/device. By
default pushes from platform-tools
directory.
Example:
$ adb pull /sdcard/demo.mp4 .
$ adb push d:test.apk /sdcard
Android Debug Bridge
(File Manager)
Command Description
$ adb shell ls <path> List files in a directory
$ adb shell cd <path> Change directory
$ adb shell rm <file> Remove a file
$ adb shell mkdir <dir> Make directory
$ adb shell touch [Options] <file> Create empty file or change file
timestamps
$ adb shell pwd Print current working directory
location
$ adb shell cp <s-file> <d-file> Copy source file to destination file
$ adb shell mv <s-file> <d-file> Move source file to destination file
Example:
$ adb shell ls
$ adb shell mkdir test
$ adb shell rm -r test
Android Debug Bridge
(Network)
Command Description
$ adb shell netstat
$ adb shell ping <ip>
$ adb shell netcfg
$ adb shell ip
Example:
$ adb shell ping 192.168.32.71
Android Debug Bridge
(Logcat)
Command Description
$ adb logcat [option] [filter-specs] Prints logs to screen
*:V (Verbose) lowest priority, *:D (Debug), *:I (Info),
*:W (warning), *:E (Error), *:F (Fatal), *:S (Silent) highest priority
$ logcat -b <buffer : radio, event, main (default)>
$ adb logcat -c : Clears the entire log and exits
$ adb logcat -d : Dumps the log to the screen and exits
$ adb logcat -f test.logs : Writes log message output to test.logs
$ adb logcat -g : Prints the size of the specified log buffer and exits
$ adb logcat -v [option]
Example:
$ adb logcat *:V
$ logcat -b radio
$ adb logcat -v brief
Android Debug Bridge
(Screenshot)
Command Description
$ adb shell screencap <file> Taking a screenshot of a device
display
$ adb shell screenrecord [OPT] <file> Record video; press Ctrl-C to
stop recording
Example:
$ adb shell screencap /sdcard/screen.png
$ adb shell screenrecord /sdcard/demo.mp4
$ adb shell screenrecord --time-limit 180
* 180 => 3 minute
Android Debug Bridge
(System)
Command Description
$ adb root Run adb in root mode
$ adb sideload
$ adb reeboot Reboot the device
$ adb shell ps
$ adb shell top
$ adb shell getprop [OPTION] Get property via the android
property service
$ adb shell setprop <key> <value> Set property service
$ adb shell dumpsys [options] Dumps system data.
$ adb shell dumpstate Dumps state
Example:
$ adb shell setprop service.adb.tcp.port 5555
$ adb shell getprop ro.build.version.sdk
$ adb dumpsys battery
$ adb dumpstate > state_log.txt
Android Debug Bridge
(Re-mounting file system)
Command Description
$ adb remount Remount file system RW or RO
*remount command runs in root mode. adb daemon shall be restarted in
root mode ($ adb root)
Example:
$ adb remount /system,rw
$ adb remount /system,ro
$ adb mount -o rw, remount /system
$ adb shell su -c “remount /system,rw”
Android Debug Bridge
(Display)
Command Description
$ adb shell dumpsys display To dump display settings
$ adb shell wm density <DPI> To change the density
$ adb shell wm size <WxH> To set height and width
$ adb shell wm size reset To reset the size to default
$ adb shell wm density reset To reset the density to default
$ adb shell wm overscan reset To reset the overscan
$ adb shell dumpsys window To dump window setting
Example:
$ adb shell dumpsys display
$ adb shell wm size 1280x720
$ adb shell wm density 160
$ adb shell wm overscan reset BOTTOM
$ adb shell wm scaling auto
*overscan – used for TV
Android Debug Bridge
(svc commands)
Command Description
$ adb shell svc [cmd-options] To control power, wifi etc
Options:
power Control the power manager
data Control mobile data connectivity
wifi Control the Wi-Fi manager
usb Control Usb state
nfc Control NFC functions
Example:
$ adb shell svc power shutdown
$ adb shell svc power reboot
$ adb shell svc wifi enable
Android App Test Tools
• Robotium
• Monkey Runner
• Renorex
• Monkey Talk
• Appium
• UI Automator

Contenu connexe

Tendances

Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Opersys inc.
 
Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time Optimization
Kan-Ru Chen
 
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Opersys inc.
 

Tendances (20)

"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
 
Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot images
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System Server
 
Learning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessLearning AOSP - Android Booting Process
Learning AOSP - Android Booting Process
 
Android Binder: Deep Dive
Android Binder: Deep DiveAndroid Binder: Deep Dive
Android Binder: Deep Dive
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
Embedded Android Workshop with Pie
Embedded Android Workshop with PieEmbedded Android Workshop with Pie
Embedded Android Workshop with Pie
 
Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux Developers
 
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
 
Introduction Linux Device Drivers
Introduction Linux Device DriversIntroduction Linux Device Drivers
Introduction Linux Device Drivers
 
Scheduling in Android
Scheduling in AndroidScheduling in Android
Scheduling in Android
 
U-Boot presentation 2013
U-Boot presentation  2013U-Boot presentation  2013
U-Boot presentation 2013
 
Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time Optimization
 
Android's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALAndroid's HIDL: Treble in the HAL
Android's HIDL: Treble in the HAL
 
linux device driver
linux device driverlinux device driver
linux device driver
 
Android device driver structure introduction
Android device driver structure introductionAndroid device driver structure introduction
Android device driver structure introduction
 
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
 
Linux device drivers
Linux device drivers Linux device drivers
Linux device drivers
 

Similaire à Embedded Android : System Development - Part I

Android General information
Android General informationAndroid General information
Android General information
Prashant Gosai
 
Android seminar ppt
Android seminar pptAndroid seminar ppt
Android seminar ppt
chakrapani tripathi
 

Similaire à Embedded Android : System Development - Part I (20)

Android : Deep dive into developing MobileApp using Android
Android : Deep dive into developing MobileApp using AndroidAndroid : Deep dive into developing MobileApp using Android
Android : Deep dive into developing MobileApp using Android
 
Android General information
Android General informationAndroid General information
Android General information
 
My androidpresentation
My androidpresentationMy androidpresentation
My androidpresentation
 
Android Introduction
Android IntroductionAndroid Introduction
Android Introduction
 
01 03 - introduction to android
01  03 - introduction to android01  03 - introduction to android
01 03 - introduction to android
 
android
androidandroid
android
 
Android development
Android developmentAndroid development
Android development
 
Android understanding
Android understandingAndroid understanding
Android understanding
 
Android seminar ppt
Android seminar pptAndroid seminar ppt
Android seminar ppt
 
Android - Application Framework
Android - Application FrameworkAndroid - Application Framework
Android - Application Framework
 
Android OS
Android OSAndroid OS
Android OS
 
Android Anatomy
Android  AnatomyAndroid  Anatomy
Android Anatomy
 
Android v 1.1
Android v 1.1Android v 1.1
Android v 1.1
 
Introduction to android
Introduction to androidIntroduction to android
Introduction to android
 
Android quick talk
Android quick talkAndroid quick talk
Android quick talk
 
Introduction to android
Introduction to androidIntroduction to android
Introduction to android
 
Android development
Android developmentAndroid development
Android development
 
Introduction to Android
Introduction to Android Introduction to Android
Introduction to Android
 
Mobile app development using Android SDK
Mobile app development using Android SDKMobile app development using Android SDK
Mobile app development using Android SDK
 
Android technology
Android technology Android technology
Android technology
 

Plus de Emertxe Information Technologies Pvt Ltd

Plus de Emertxe Information Technologies Pvt Ltd (20)

premium post (1).pdf
premium post (1).pdfpremium post (1).pdf
premium post (1).pdf
 
Career Transition (1).pdf
Career Transition (1).pdfCareer Transition (1).pdf
Career Transition (1).pdf
 
10_isxdigit.pdf
10_isxdigit.pdf10_isxdigit.pdf
10_isxdigit.pdf
 
01_student_record.pdf
01_student_record.pdf01_student_record.pdf
01_student_record.pdf
 
02_swap.pdf
02_swap.pdf02_swap.pdf
02_swap.pdf
 
01_sizeof.pdf
01_sizeof.pdf01_sizeof.pdf
01_sizeof.pdf
 
07_product_matrix.pdf
07_product_matrix.pdf07_product_matrix.pdf
07_product_matrix.pdf
 
06_sort_names.pdf
06_sort_names.pdf06_sort_names.pdf
06_sort_names.pdf
 
05_fragments.pdf
05_fragments.pdf05_fragments.pdf
05_fragments.pdf
 
04_magic_square.pdf
04_magic_square.pdf04_magic_square.pdf
04_magic_square.pdf
 
03_endianess.pdf
03_endianess.pdf03_endianess.pdf
03_endianess.pdf
 
02_variance.pdf
02_variance.pdf02_variance.pdf
02_variance.pdf
 
01_memory_manager.pdf
01_memory_manager.pdf01_memory_manager.pdf
01_memory_manager.pdf
 
09_nrps.pdf
09_nrps.pdf09_nrps.pdf
09_nrps.pdf
 
11_pangram.pdf
11_pangram.pdf11_pangram.pdf
11_pangram.pdf
 
10_combinations.pdf
10_combinations.pdf10_combinations.pdf
10_combinations.pdf
 
08_squeeze.pdf
08_squeeze.pdf08_squeeze.pdf
08_squeeze.pdf
 
07_strtok.pdf
07_strtok.pdf07_strtok.pdf
07_strtok.pdf
 
06_reverserec.pdf
06_reverserec.pdf06_reverserec.pdf
06_reverserec.pdf
 
05_reverseiter.pdf
05_reverseiter.pdf05_reverseiter.pdf
05_reverseiter.pdf
 

Dernier

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Dernier (20)

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 

Embedded Android : System Development - Part I

  • 2.  Introduction to Android Architecture  History  Software stack  Directory structure  Environment Setup & Build ✔ Installing tools ✔ Downloading Android Source ✔ Android Build System ● Booting the device ● Debugging essentials  Linux Kernel  Overview of Linux Driver Eco system  Kernel Configuration & Compilation Table of Content
  • 3. What is Android? ● Android is an OS primarily designed for mobile devices ● Built on Linux Kernel ● Java, the main programming language ● Android is Open and Free ● Most of the code available under Apache License ● Developed and distributed by Google ● Managed by Open Handset Alliance (OHA) “Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in Java language environment” “Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in Java language environment”
  • 4. Version Release Date Features 1.6 (Donut) 15 Sep 2009 • Improved Android Market experience • Gallery now enables users to select multiple photos for deletion • Support for CDMA and GSM • Support for more screen sizes and resolutions • Quick search box with updated Voice Search, integration with native applications • Updated technology support text-to-speech engine 4 History (Version And Features)
  • 5. Version Release Date Features 2.0/2.1 (Eclair) 26 Oct 2009  New capabilities in Accounts, contacts & Sync Management  Quick Contact  Optimized hardware speed  New Browser UI and HTML 5 support  Improved Google Maps 3.1.2  MicrosoftExchage support  Built in flash support for Camera  MotionEvent class enhanced to track multi-touch events  Improved virtual keyboard  Bluetooth 2.1  Live Wallpapers/Folder 5 History (Version And Features)
  • 6. Version Release Date Features 2.2 (Froyo) 20 May 2010 • OS speed, memory, and performance optimizations • Dalivk JIT Complier • Improved application launcher with shortcuts to Phone and Browser applications • USB tethering and Wi-Fi hotspot functionality • Automatic App update • Quick switching between multiple keyboard languages and their dictionaries • Support for numeric and alphanumeric passwords • Support for file upload fields in the Browser application • Adobe Flash10.1 support 6 History (Version And Features)
  • 7. Version Release Date Features 2.3 (Gingerbread) 6 Dec 2010 • Updated user interface design • New audio effects • Support for Near Field Communication • Redesigned multi-touch software keyboard • Enhanced support for native code development • Audio, graphical, and input enhancements for game developers • Concurrent garbage collection for increased performance • Native support for more sensors (such as gyroscopes and barometers) • A download manager for long running downloads • Improved power management and application control 7 History (Version And Features)
  • 8. Version Release Date Features 3.1 and 3.3 (Honeycomb) 22 Feb 2011 • It was the first Android OS version which was specifically designed for tablets • It adds toolbars at top and bottom and incorporates tabbed browsing and other desktop features • • Honeycomb uses Microsoft's Media Transfer Protocol (MTP) for file transfer rather than connecting as a USB mass storage device History (Version And Features)
  • 9. Version Release Date Features 4.0(Ice Cream Sandwich) 19 Oct 2011  New typeface called Roboto  New Face unlock feature  Android Beam – A secure NFC powered content sharing platform  Re-arrangeable folders, Favorites Tray, Screenshots  Swipe to dismiss notifications, tasks and browser tabs  W-Fi Direct  Manage apps running in background  Revamped Gmail interface History (Version And Features)
  • 10. Version Release Date Features 4.1, 4.2 & 4.3 (Jelly Bean) 27 Jun 2012  User interface has been made faster and smoother under Project Butter  Notification center has been improved with expandable and actionable notifications  Off line voice recognition and typing facility  Better Google Voice Search  Support for external Braille input in enhanced Accessibility options  Android Beam with enhanced option to transfer photos and videos  Google Now  App encryption and Smart App updates History (Version And Features)
  • 11. Version Release Date Features 4.4 (KitKat) Nov 2013  Faster Multi-tasking  A smarter caller id  Print where ever, when ever.  Pick a file, any file History (Version And Features)
  • 12. Version Release Date Features 5.0 (Lollipop) Nov 2014  Support for 64-bit CPUs  Support for print previews  Audio input and output through USB devices  Android Runtime (ART) with ahead-of-time (AOT) compilation and improved garbage collection (GC), replacing Dalvik that uses just-in-time (JIT) compilation History (Version And Features)
  • 13. Version Release Date Features 6.0 (Marshmallow) 17 Aug 2015 • Android Pay • Fingerprint Scan Standardization • App Permission Control • App Links • Doze • Home Screen Rotation • Chrome Custom Tab • Auto backup and Store • Status bar icon removal History (Version And Features)
  • 15. Version Release Date Features Android N 22 Aug 2016 • Split Screen • Quick Switching beween apps • Notification redesigned • Customizable Quick Setting • Multi-language support • Seamless update History (Version And Features)
  • 16. Android Software Stack ● Android is built on Linux kernel ● Does not include full set of standard Linux utilities ● It has a core capability like – Security – Memory management – Process management – Network stack – Driver model – Abstraction Layer
  • 17. Android Software Stack Linux Kernel Dialer Email Cal Camera . . . Applications Managers Activity Location Package Notification Resource WindowTelephony Content Providers View System Java API Framework Android Runtime Core Libraries Native C/C++ Libraries WebkitOpen MAX AL Libc Media Framework . . .OpenGL ES Android Runtime Hardware Abstraction Layer Sensor WiFi Bluetooth Camera . . .
  • 18. Linux Kernel Drivers Audio Binder (IPC) Display Keyboard Bluetooth Shared MemoryCamers Power Management WiFi USBSensor . . . Flash Memory Linux Kernel ● It has a core capability like: – Display, Camera, Bluetooth, Flash Memory, USB Driver, Keypad, WiFi, Audio and Power Management
  • 19. Native C/C++ Libraries WebkitOpenMAX AL Libc Media Framework SSLOpenGL ES SQLite Vulkan Camera . . . Architectural Detail (Native Libraries) ● Native libraries are written in C/C++ ● Called through Java wrapper APIs (JNI) ● Current API level 24 ● Layer contains – OpenMAX AL, OpenGL ES, OpenSL ES – 2D and 3D (Vulkan) graphics – Media codecs (MPEG-4, H.264, MP3, etc.) – SQL database (SQLite) – A native web browser engine (WebKit)
  • 20. Functional Libraries (webkit) ● Open source WebKit browser: http://webkit.org ● Renders pages in full (desktop) view ● Full CSS, Javascript, DOM, AJAX support
  • 21. Functional Libraries (SQLite) ● Server less, transactional SQL database engine ● Most widely deployed SQL database engine in the world ● Light-weight transactional data store ● Back end for most platform data storage ● Transactions are Atomic, Consistent, Isolated and Durable (ACID) even after system crashes and power failures ● Zero-configuration - no setup or administration needed ● Complete database is stored in single cross-platform disk file ● Cross-platform support (Linux, OS X, Windows 10 mobile)
  • 22. Android Runtime Core Libraries Android Runtime Android Runtime (ART) ● Introduced in Android version 5.0 (API level 21) ● Each app runs in its own process and own instance of ART ● ART is written to run multiple virtual machines on low-memory devices by executing DEX files ● DEX is a bytecode format designed specially for Android that's optimized for minimal memory footprint ● Build toolchains, such as Jack, compile Java sources into DEX bytecode ● DEX was runtime prior to ART
  • 23. Android Runtime Core Libraries Android Runtime Android Runtime (ART) (Key features) ● Ahead-of-time (AOT) and just-in-time (JIT) compilation ● Optimized garbage collection (GC) ● Better debugging support – Dedicated sampling profiler – Detailed diagnostic exceptions and crash reporting – Ability to set watch points to monitor specific fields
  • 24. Components Description Content Providers Access, store and share application data Resource Manager Access to strings, graphics & layout files Notification Manager Display custom alerts in the status bar Activity Manager Manages life cycle of apps Window Manager Rendering view on the screen View System UI (lists, grids, text boxes, buttons) Package Manager Application formation Location Manager Location based services Java API Framework
  • 25. Dialer Email Cal Camera . . . Applications Application Layer ● Collection of built-in & 3rd party apps ● Built-in apps - Dialer, Web Browser ● 3rd party apps – Nova Launcher ● Same APIs & approval process for both ● Built-in apps can be stopped to use 3rd party apps
  • 26. Dalvik Runtime ● Dalvik is a virtual machine (VM) in Android OS ● Android apps are converted into compact Dalvik EXecutable (.dex) ● Dalvik VM is a register-based architecture ● A tool called dx is used to convert some (but not all) Java .class files into the .dex format
  • 27. Dalvik Runtime ● Multiple classes are included in a single .dex file ● Initially, Dalvik had a just-in-time compiler ● Being optimized for low memory requirements, Dalvik has some specific characteristics that differentiate it from other standard VMs: – VM was slimmed down to use less space – It uses its own bytecode, not Java bytecode – Moreover, Dalvik had been designed so that a device can run multiple instances of VM efficiently
  • 28. Dalvik Vs JVM ● Dalvik Virtual machine (DVM) – Register Architecture – Designed to run on low memory – Uses its own bytecode – Runs .dex file (Dalvik EXecutable) ● Java Virtual Machine (JVM) – Stack Architecture – Uses java bytecode – Runs .class file having JIT
  • 29. Android Runtime ● Each Android app is a process ● App process has an instance of Android Runtime ● ART can run multiple VMs efficiently ● Executes classes compiled by a Java language compiler that have been transformed into the .dex format ● Dalvik EXecutable (.dex) format is optimized for ART
  • 30. Android Bionic ● A Google developed C library ● Based on BSD standard C library ● Does not have full support of POSIX APIs ● Does not support full pthreads – Example : pthread_cancel not supported ● Has been kept simple, fast and lightweight ● GPL & LGPL code has been kept “out” of user space ● BSD license is provided
  • 31. Android Kernel Changes ● Wakelocks ● Binder IPC ● Klogger ● Anonymous Shared Memory (ashmem) ● Alarm Timers ● Low memory killer ● ION memory allocator ● Network Security ● Various drivers ● Various fixes
  • 32. Android Kernel Changes (Wakelocks) ● Linux has two power management methods – APM ( Advanced Power Management) – ACPI ( Advanced Configuration and Power Interface) ● Android uses none of them ● Android has its own Power Manager (app centric) ● Android Apps have to request “wakelock” ● Wakelock prevent host CPU to go to sleep mode ● If no wakelocks are held, PM will put device in sleep mode
  • 33. Wakelock CPU Screen Keypad PARTIAL_WAKE_LOCK ON OFF OFF SCREEN_DIM_WAKE_LOCK ON DIM OFF SCREEN_BRIGHT_WAKE_LOCK ON BRIGHT OFF FULL_WAKE_LOCK ON BRIGHT BRIGHT Android Kernel Changes (Wakelocks) *FULL_WAKE_LOCK : Deprecated in API level 17. App should use FLAG_KEEP_SCREEN_ON (As long as app window is in focus keep the screen BRIGHT.
  • 34. Android Kernel Changes (Binder IPC) ● Signals ● Semaphores ● Message Queues ● Pipes ● Sockets ● Shared Memory Linux System V IPC ● Binder (system wide) ● Sockets ● Ashmem Android IPC ● App : Android App component can be started by any process ● Stability : No other process shall get affected if a process misbehaves ● Security : Each process is sandboxed and runs under distinct system ID ● Memory : If not needed, processes can be removed to free memory ● System V IPC is prone to resource leak and instability in view of above requirements (Hence binder IPC is rewritten and used)
  • 35. Android Kernel Changes (Binder IPC) ● Binder IPC “Link to death” mechanism – built in reference counting of object and notification of death ● When a binder service is no longer referenced by any clients, its owner is automatically notified that it can dispose of it
  • 36. Android Kernel Changes (Klogger) ● syslog daemon to handle userspace logs ● Syslog () call over socket generates expensive task switching ● Exposed in /var/log directory ● dmesg command to get kernel logs ( printk() ) Linux ● A kernel driver ● Uses 4 circular buffers in kernel memory area ● Buffers are exposed in /dev/log directory ● Logcat command to access logs Android
  • 37. Android Kernel Changes (ashmem) ● Anonymous Shared Memory (ashmem) ● Open /dev/ashmem ● Supports reference counting so that kernel can reclaim resources which are no longer needed ● Discard shared memory units under memory pressure ● Allow kernel to shrink shared memory region under low memory pressure ● Linux IPC based on shared memory is prone to resource leak ● Can’t be downsized under low memory pressure
  • 38. Android Kernel Changes (Alarm timer) ● Linux has High Resolution Timers that can wake up a process but get missed when system is suspended ● Real Time Clock (RTC) can wake the suspended system but can’t wake a process ● Developed alarm timers by adding patches to RTC and High Resolution times so that suspended system can wake up and applications can accomplish its job
  • 39. Android Kernel Changes (ION memory allocator) ● Android Requirement : ✔ Unified memory management interface for ease of use (allocate memory in the system for most of the cases) ✔ Allow efficient (zero copy) sharing of memory between user space, kernel space & hardware devices
  • 40. Android Kernel Changes (ION memory allocator) ● Available memory management mechanisms ● DMABUF – from Linaro ● CMEM – from TI ● PMEM – from Qualcomm ● NVMAP – from NVIDIA ● Linux usually allocates buffer up to 512 pages (4 KiB / page) ● Linux available heaps (3 types) – vmalloc (virtual), kmalloc (physical) and pre-allocated (reserved) at boot
  • 41. Android Kernel Changes (ION memory allocator) ● ION is generalized memory manager ● Introduced in Android 4.0 ICS ● ION removes ARM specific dependencies ● Provides a common structure for how memory will be managed and used by GPU, Audio and Camera drivers ● Default ION driver offers three heaps ● ION_HEAP_TYPE_SYSTEM – allocation via vmalloc_user() ● ION_HEAP_TYPE_SYSTEM_CONTIG – allocation via kzalloc() ● ION_HEAP_TYPE_CARVEOUT - carveout memory is physically contiguous and set aside at boot ● Developers may choose to add more ION heaps ● ION_HEAP_TYPE_IOMMU was added by NVIDIA for hardware blocks equipped with an IOMMU ● User space programs shall open /dev/ion device before it can allocate memory from ION
  • 42. Android Kernel Changes (ION memory allocator) ● Memory sharing between user space, kernel & devices without copy ● This is achieved by sharing memory pages directly to avoid copying ● Once memory is allocated successfully from a heap, a file descriptor is returned to user space which can be subsequently used to invoke mmap() to map the allocated pages into user space ● Useful scenario, for Instance, OpenGL can manipulate the memory in user space easily and a GPU can also populate the same piece of physical memory with zero copying
  • 43. Android Kernel Changes (Paranoid Network Security) ● In Linux, any app can open the network connection ● Android needs strict policy for network access control ● Permission based network access ● Filtered with GID #define GID Capability AID_NET_BT_ADMIN 3001 Can create an RFCOMM, SCO, or L2CAPP Bluetooth socket AID_NET_BT 3002 Can create a Bluetooth socket AID_INET 3003 Can create IPv4 or IPv6 socket AID_NET_RAW 3004 Can create certain kinds of IPv4 sockets?? AID_NET_ADMIN* 3005 Allow CAP_NET_ADMIN permissions for process
  • 44. Patches in mainline Following patches/features are added in the mainline kernel (3.10 onward): ● Binder ● Alarm Timers (under the name POSIX Alarm Timers introduced in 2.6.38) ● Ashmem ● Klogger ● Timed GPIOs ● Low Memory Killer ● RAM Console (superseded by pstore RAM backend introduced in 3.5)
  • 45. Missing Patches Following patches/features are missing from the mainline kernel (As of 3.10 ) - ● Paranoid Networking ● ION Memory Allocator ● USB Gadget ● FIQ debugger ● pmem (removed in 3.3)
  • 47. Directory Structure (Android Root) Root Sub-directory Description android device Device specific (Samsung, HTC, LG, etc) stuff kernel Kernel tree for chipsets (msm, mediatek, etc..) platform Android platform source code product For variety of products, currently for brillo public-projects Empty (Android based public projects) toolchain jack, gcc, ndk, llvm, etc.. tools repo, aospstats trusty For trusted execution environment components (Google's Trusty OS)
  • 48. Directory Structure (Platform) # Directory Description 1 abi Not very clear, seems to be created for APIs for binary interface; currently it contains C++ files having APIs 2 art Android Runtime 3 bionic Android's standard C library 4 bootable Code samples (bootloader, diskinstaller, recovery) 5 build The main entry point of the build system 6 cts contains compatibility test suite 7 dalvik Dalvik tools and core libraries 8 developers Not clear, build, demos, samples, docs etc.. 9 development Platform engineering tools and sample apps 10 docs AOSP documents 11 external Contains source code for all external open source projects
  • 49. Directory Structure (Platform) # Directory Description 12 frameworks Contains sources of all the frameworks 13 hardware Hardware related source code such as HAL 14 libcore Test code for dalvik, DOM, JSON, LUNI (lang util net io) and other support files 15 libnativehelper VM-agnostic native helper functions 16 ndk build scripts & helper files for building the NDK 17 out Build generated directory, output is placed here 18 packages Standard android apps of AOSP 19 pdk Reduced set of Android release provided to chipset vendors and OEMs to migrate to new release 20 prebuilts cross compilations toolchains for different development machines 21 sdk To compile the SDK. Lot of tools are moved to prebuilts
  • 50. Directory Structure (Platform) # Directory Description 22 system System core files (commands, debugging, bootstat) 23 toolchain To build and install GNU tools 24 tools libraries that are sourced in tools/base and tools/swt are converted to prebuilts which are located in prebuilts/devtools 25 vendor Initially created for vendors (HTC); It seems to be discontinued
  • 51. Setting up Build Environment
  • 52. System Requirements ● Intel core i5 or higher ● RAM – 4 ~ 8 GB – Recommended 8GB ● HDD – 100 ~ 500 GB – Recommended 300GB ● Ubuntu 14.04 LTS or higher – Recommended 16.04 ● Swap partition - 8 GB ● Optionally enable ccache – Recommended for servers
  • 53. Check your system ● CPU configuration – $ lscpu ● Available memory – $ free -h ● Linux Version – $ uname -a ● OS distribution – $ lsb_release -a ● Running processes – $ top ● IP address – $ ifconfig
  • 54. Major Steps ● Choose a branch to build ● Setup Linux build environment – Install openJDK (JAVA 8) – Installing git – Install repo ● Download source (repo sync) ● Install arm toolchain
  • 55. *https://source.android.com/source/initializing.html Installing essential packages ● Installing essential packages $ sudo apt-get install git-core gnupg flex bison gperf build- essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip ● $ sudo apt-get install gtkterm ● $ sudo apt-get install adb
  • 56. *https://source.android.com/source/initializing.html Configuring USB access ● $ wget -S -O - http://source.android.com/source/51- android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
  • 57. Check Java version ● Verify Java version (if you already have) – $ java -version ● You should get following message :- openjdk version "1.8.0_111" OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-3~14.04.1-b14) OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)
  • 58. *Skip this slide if you already have openJDK 8 Installing openJDK8 ● Installing PPA – $ sudo add-apt-repository ppa:openjdk-r/ppa – $ sudo apt-get update – $ sudo apt-get install openjdk-8-jdk ● If you have more than one java versions then use update- alternatives command – $ sudo update-alternatives --config java ● Set the correct version number – $ sudo update-alternatives --config javac ● Finally, verify the installed version with below command – $ java -version
  • 59. https://help.ubuntu.com/lts/serverguide/git.html Installing git (ubuntu) ● Run following command – $ sudo apt-get install git ● Configure git with your real name and email address; you will need an email address that is connected with a registered Google account – $ git config --global user.email "you@example.com" – $ git config --global user.name "Your Name" ● Verify the configuration with following command – $ git config -l
  • 60. *https://source.android.com/source/downloading.html Installing repo tool ● Repo tool is required to work with Git to work with Android ● Create a bin directory in home folder – $ mkdir ~/bin – $ export PATH=~/bin:$PATH ● (or edit .bashrc file and add path) ● Download repo tool and make sure it is executable – $ curl https://storage.googleapis.com/git-repo- downloads/repo > ~/bin/repo – $ chmod a+x ~/bin/repo
  • 61. Initializing repo client ● Create a working directory in home folder – $ mkdir ~/android – $ cd android – $ repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.2_r4 ● On successful initialization .repo folder shall be created – $ cd .repo ● Clone git repository – $ git clone https://github.com/android-rpi/local_manifests
  • 62. Repo Sync ● Download the Android source – $ repo sync ● Syncing with repository would take few hours ● Time depends on your connection speed and server usage ● Ensure there are no or few interruptions in connectivity
  • 63. Checking GCC version ● Verify gcc version installed in your machine – $ gcc --version ● You should get follwing message :- gcc (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4 Copyright (C) 2015 Free Software Foundation, Inc.
  • 64. Skip this slide if you already have gcc 4.9 installed Installing gcc/g++ ● Installing – $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test – $ sudo apt-get update – $ sudo apt-get install gcc-4.9 g++-4.9 ● Removing old links to gcc-4.8 or lesser – $ sudo rm /usr/bin/gcc – $ sudo rm /usr/bin/g++ ● Creating soft-links to gcc-4.9 – $ ln -s /usr/bin/gcc-4.9 /usr/bin/gcc – $ ln -s /usr/bin/g++-4.9 /usr/bin/g++
  • 65. ARM toolchain ● Check following directory (you must have toolchain) – $ ls android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi- 4.9/bin/ ● Otherwise, download from Android Developer web site – https://android.googlesource.com/platform/prebuilts/gcc/linux- x86/arm/arm-linux-androideabi-4.9/+/android-7.1.2_r4 ● Set the toolchain path (if stored in custom user directory) – $ export PATH=<toolchain directory> : $PATH ● Or edit “.bashrc” and add above export command
  • 66. Install python mako ● Install python mako module – $ sudo apt-get install python-mako ● Python is used by build system
  • 67. Make Hierarchy Makefile Root working directory Top level make file main.mk build/core/ Top level build configuration file config.mk definitions.mk dex_preopt.mk build/core/ Includes all other sub .mk file Standard flag definitions Dalvik default options
  • 68. ● Android.mk – Platform configuration; to include & build sources for your device ● AndroidBoard.mk – Kernel configuration; build system uses that to drop the kernel image in place ● AndroidProducts.mk - specify appropriate product make file to be used for building. Example – device/brcm/rpi3/AndroidProducts.mk ● device_codename.mk - Every device has a codename, and there is a file named as the codename of device. It specifies the properties and extras to copy over into the final output. Example: device/brcm/rpi3/rpi3.mk ● BoardConfig.mk - This is where compiler conditional flags are set, partition layouts, boot addresses, ramdisk size etc.. Example : device/brcm/rpi3/BoardConfig.mk Make configuration
  • 69. Build Commands ● Builds only the package, instead of going through entire build – $ make <package-name> ● Cleans all files generated by previous compilations – $ make clean ● Removes all files generated by compilation of given package – $ make clean-<package> ● Execute 'make' from top of the tree (even if your current directory is somewhere else) – $ m ● Builds all of the modules in current directory – $ mm ● Build all of the modules in supplied directory – $ mmm <dir-path>
  • 71. Kernel Compilation ● $ cd kernel/rpi ● $ ARCH=arm scripts/kconfig/merge_config.sh arch/arm/configs/bcm2709_defconfig android/configs/android-base.cfg android/configs/android- recommended.cfg ● $ ARCH=arm CROSS_COMPILE=arm-linux-androideabi- make zImage -j4 ● $ ARCH=arm CROSS_COMPILE=arm-linux-androideabi- make dtbs -j4
  • 72. Android Compilation (envsetup.sh) ● Modifies the current environment, it adds many useful shell macros; these macros will serve several purposes: – Configure and set up the build system – Ease the navigation in the source code – Ease the development process – Some macros will modify the environment variables, to be used by the build system later on
  • 73. Android Compilation (lunch) ● “lunch” is a shell function defined in build/envsetup.sh ● It sets the environment variables needed for the build ● TARGET_PRODUCT – Which product to build. To build for the emulator, you will have aosp_<arch> ● TARGET_BUILD_VARIANT – Either user, userdebug or eng ● TARGET_BUILD_TYPE – Either release or debug
  • 74. Android Compilation (TARGET_BUILD_VARIANT) ● TARGET_BUILD_VARIANT := user – Secure, No root access – “adb” disabled – Modules marked as user are included – Set for production phones ● TARGET_BUILD_VARIANT := userdebug – Secure, No root access – “adb” enabled – Modules marked as “user” and “debug” are included in binary – Set during app development ● TARGET_BUILD_VARIANT := eng (This is default make flavour) – Not secure, By default root access is enabled – “adb” is enabled – Modules marked as “user”, “debug” and “eng” are included – Set during initial board bring up and native development
  • 75. Android Compilation (LOCAL_MODULE_TAGS) ● LOCAL_MODULE_TAGS := user – Module will be included in user, userdebug & eng ● LOCAL_MODULE_TAGS := debug – Module will be included in userdebug & eng builds ● LOCAL_MODULE_TAGS := eng – Module will be included in “eng” build only ● LOCAL_MODULE_TAGS := optional – Module will be included in the build only if listed in PRODUCT_PACKAGES section of product makefile *debug and eng modules could be modules used for testing is different stages of product development
  • 76. Android Compilation (TARGET_BUILD_TYPE) ● TARGET_BUILD_TYPE := debug – Set for development binary – Debug options across whole system enabled ● TARGET_BUILD_TYPE := release – Set for production binary – Debug options are disabled
  • 77. Android Compilation (Resource Overlays) ● PRODUCT_PACKAGE_OVERLAYS := <relative- overlay-path> ● Resource overlays specify resource files that are applied on top of the defaults ● The most commonly customized settings are contained in the file frameworks/base/core/res/res/config.xml ● Example : device/brcm/rpi3/overlay/frameworks/base/core/res/r es/config.xml
  • 78. Android Asset Packaging Tool ● This tool is part of SDK (build system) ● It is used to view, create, and update Zip- compatible archives (zip, jar, apk) ● It can also compile resources into binary assets
  • 79. Android Compilation ● $ source build/envsetup.sh ● $ lunch rpi3-eng ● Make -j4
  • 80. Jack Server Settings ● Try following if build stops due to jack server ● Set Xmx to higher number (depends on available RAM) – $ export JACK_SERVER_VM_ARGUMENTS="-Xmx4g -Dfile.encoding=UTF-8 -XX:+TieredCompilation" ● $ jack-admin kill-server ● $ jack-admin start-server ● Make -j2
  • 81. Verify output files ● Android System image (system.img) – $ ls out/target/product/rpi3 ● Boot files (Raspberry Pi firmware) – $ ls device/brcm/rpi3/boot – bootcode.bin (bootloader), start.elf, fixup.dat, config.txt, cmdline.txt ● Linux Kernel Image (zImage) – $ ls kernel/rpi/arch/arm/boot/ ● RPI device tree binary – $ ls kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb – $ ls kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo ● Ramdisk image – $ ls out/target/product/rpi3/ramdisk.img
  • 82. Knowing firmware files ● “bootcode.bin” – Is a second stage bootloader – Executed on VideoCore IV GPU – Loads the third stage bootloader – start.elf – Start GPU ● “start.elf” – GPU firmware (3rd stage bootloader) – Reads config.txt and cmdline.txt – Loads Linux kernel image – Start CPU
  • 83. Knowing firmware files ● GPU runs it's own simple OS, called VCOS (Video Core Operating System) ● 1st stage bootloader is programmed in BCM2835 SoC; It mounts FAT32 boot partition on the SD card so that the second stage bootloader can be accessed ● After Linux is started, code on GPU is not unloaded; GPU still can communicate to CPU through a protocol
  • 84. Knowing firmware files ● “config.txt” - Containing configuration parameters for – VideoCore IV GPU (Video/HDMI modes, memory, console frame buffers etc) – Linux Kernel (load addresses, device tree, uart/console baud rates etc) ● “cmdline.txt” – Contains kernel command line parameters to be passed to Linux kernel at boot ● “fixup.dat” – To configure the SDRAM partition between GPU & CPU
  • 85. Knowing firmware files ● RPI device tree binary $ ls kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb $ ls kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo
  • 86. Prepare SD card ● Partitions of the card should be set-up like followings p1 512MB for BOOT : Do fdisk : W95 FAT32(LBA) & Bootable, mkfs.vfat p2 512MB for /system : Do fdisk, new primary partition p3 512MB for /cache : Do fdisk, mkfs.ext4 p4 remainings for /data : Do fdisk, mkfs.ex4 ● Set volume label for each partition - system, cache, userdata ● Use -L option of mkfs.ext4, e2label command, or -n option of mkfs.vfat
  • 87. Prepare SD card (check mount points) ● Check mount points for sdcard (Usually /dev/sdb<n>) $ mount ● Unmount the partitions $ sudo umount /dev/sdb1 $ sudo umount /dev/sdb2 ● Validate whether all partitions are unmounted $ mount
  • 88. Prepare SD card (Create partitions) ● Create new partitions $ sudo fdisk /dev/sdb ● List partions using p command ● Delete partions using d command ● Create partions using n command (Create all as primary (use p)) ● Sizes (P1, P2, P3, P4): +512M, +3G, +512M, rest will be default ● Change partion type using t command (select c (FAT32 format) for p1 here) ● Define p1 as active using a command ● !!! Make sure to save the partion table using w
  • 89. Prepare SD card (Format partitions) ● Partion 1 is FAT32 format $ sudo mkfs.vfat -n boot /dev/sdb1 ● All others are ext4 $ sudo mkfs.ext4 -L system /dev/sdb2 $ sudo mkfs.ext4 -L cache /dev/sdb3 $ sudo mkfs.ext4 -L userdata /dev/sdb4
  • 90. Copy images to SD card ● Copy system image $ cd out/target/product/rpi3 $ sudo dd if=system.img of=/dev/<p2> bs=4M ● Copy Boot partition, kernel & ramdisk $ cp device/brcm/rpi3/boot/* to p1:/ $ cp kernel/rpi/arch/arm/boot/zImage to p1:/ $ cp kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb to p1:/ $ cp kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo to p1:/overlays/vc4-kms-v3d.dtbo $ cp out/target/product/rpi3/ramdisk.img to p1:/ ● To preserve permissions $ sudo cp -a /path-to-working-system-part/* /media/emertxe/system/
  • 91. Bootloader ● Is a small piece of code executed before any operating system becomes ready to run ● Bootloader start running before any other software; therefore it is highly processor specific and board specific ● Bootloaders usually starts from ROM ● When a board is switched on CPU jumps to a hardcoded/predecided address which is the beginning of bootloader instructions ● First task of bootloader (generally) to map RAM to predefined addresses; After RAM is mapped Stack Pointer (SP) is setup
  • 92. Bootloader ● Bootloader is responsible for ✔ Basic hardware initialization (RAM, Serial port, Screen, Keyboard etc..) ✔ Loading kernel image (from flash, network or other storage) to RAM ✔ Decomprerss kernel image ✔ Execute kernel
  • 93. Boot Sequence (PC) BIOS (from ROM) Power-on Stage 1 boot (from RAM) Stage 2 boot (from RAM) Kernel boot 1. Basic Input/Output System 2. Runs POST stands for Power on Self Test 3. Initializes monitor and keyboard 4. Loads 1st stage bootloader from HDD/CD- ROM/Floppy in RAM 1. Example MBR (Master Boot Record) 2. Typically, stored in 1st sector of HDD or CD-ROM 3. Size is less than 512 bytes 4. Loads 2nd stage bootloader in RAM 1. Example GRUB (Grand Unified Bootlader) 2. Has knowledge of file system 3. Decompress & loads Kernel image & initrd in RAM 1. Mounts RFS 2. Executes /sbin/init program
  • 94. Boot Sequence (Embedded) Boot ROM (from ROM) Power-on 1st stage Bootloader (from SRAM) Kernel boot 1. Board specific bootloader 2. Initialize minimal hardware 3. Load first stage bootloader (MMC, SPI flash) in SRAM 1. Initialize DRAM, NAND, SPI controller 2. Load 2nd stage bootloader 2nd stage Bootloader (from RAM) 1. Example U-boot or Barebox Initialize other hardware (USB, NW) 2. Load Kernel image and Ramdisk 1. Mounts RFS 2. Executes /sbin/init program
  • 95. Android Bootup Bootloader - Initialize minimal HW - Initialize RAM - Load kernel, Ramdisk Kernel boot - Init Kernel sub-system - Init Drivers - Mount RFS - Start “Init” process Zygote’s man() - register Zygote socket - preload Java classes - preload resources - start system_server - Listen to connections system_server - Init service - Register w/ service Manager Activity Manager - Init Self - send intent CATEGORY_HOME Init - Mount /dev, /sys etc - SELinux Setup - Run init.rc script - start native Daemons Native Daemons - rild - netd - adbd - bluetoothd - debuggerd - servicemanager - mediaserver - app_process (Zygote) runtime - start dalvikvm - call Zygote’s main () App fork() startViaZygote() Launcher - Init self - register onClick() handlers Click
  • 96. Zygote ● Zygote is a daemon whose goal is to launch Apps ● Zygote is the parent of all App process ● The startup of the process is triggered by Init.rc ● It is actually started by app_process
  • 97. Zygote ● app_process launches – Zygote – Creates first Dalvik VM – Calls Zygote’s main () method ● Zygote – Preloads all necessary Java classes and resources – Starts System Server – Opens a socket /dev/socket/zygote to listen for requests for starting apps ● System Server is a detached process from it’s parent – Initializes different System Services and starts Activity Manager
  • 98. Zygote ● Zygote receives a request to launch an App through /dev/socket/zygote ● Zygote can be by adding keyword “disabled” in init.rc
  • 100. Raspberry Pi3 (specifications) ● Broadcom BCM2837 chipset running at 1.2 GHz ● 64-bit quad-core ARM Cortex-A53 ● 802.11 b/g/n Wireless LAN ● Bluetooth 4.1 (Classic & Low Energy) ● Dual core Videocore IV® Multimedia co-processor ● 1 GB LPDDR2 memory ● microUSB connector for 2.5 A power supply ● 1 x 10/100 Ethernet port ● 1 x HDMI video/audio connector ● 1 x RCA video/audio connector ● 1 x CSI camera connector ● 4 x USB 2.0 ports ● 40 GPIO pins ● microSD card slot
  • 104. Android Debug Bridge ● A command line tool that lets you communicate with an emulator or connected Android device ● ADB commands cane be categorized as follows - ✔ General ✔ Debug ✔ Connection ✔ Package Manager ✔ File Manage ✔ Network ✔ Logcat ✔ System
  • 105. Android Debug Bridge (General) Command Description $ adb devices To list all the attached device instances $ adb help Prints a list of supported adb commands $ adb version Prints the adb version number Example: $ adb devices $ adb version $ adb help
  • 106. Android Debug Bridge (Connection) Command Description $ adb connect <ip > [:port] To connect to device specified with IP $ adb usb Restarting ADB in USB mode Example: $ adb connect 192.168.32.199
  • 107. Android Debug Bridge (Disconnection) Command Description $ adb disconnect To disconnect from already connected device Example: $ adb disconnect
  • 108. Android Debug Bridge (General) Command Description $ adb <option> <device-id> <command> If there are multiple devices Options: -d : attached usb device, -e : emulator, -s specific device/emulator Example: /* Device shell command */ $ adb -d shell ls /* Emulator shell command */ $ adb -e shell ls /* Specific device/emulator command */ $ adb -s ZI123 shell ls
  • 109. Android Debug Bridge (Debug) forward Syntax $ adb forward <local> <remote> Example $ adb forward tcp:8000 tcp:9000 Description set up forwarding of host port 8000 to emulator/device port 9000 Pre-rquisite Enable USB debugging on the device kill-server Syntax $ adb kill-server Example - Description Terminates the adb server process Pre-rquisite -
  • 110. Android Debug Bridge (Install a package) install $ adb install [option] <package-name> Installing a package Options : -l Forward lock application -r Replace existing application -t Allow test packages -s Install application on sdcard -d Allow version code downgrade -p Partial application install Example: $ adb install -t mytest.apk
  • 111. Android Debug Bridge (Uninstall a package) uninstall $ adb uninstall [option] <package-name> Uninstalling a package Options : -k : to keep data and cached items Example: $ adb uninstall mytest.apk
  • 112. Android Debug Bridge (Package Manager) shell $ adb shell pm list packages Installing a package $ adb shell pm path <package> Display path of package $ adb shell pm clear <package> Clearing app data, cache Example: $ adb shell pm path com.android.phone $ adb shell pm clear com.android.phone
  • 113. Android Debug Bridge (File Manager) shell $ adb pull <remote> [local] Download a specified file from an emulator/device to your computer. By default pulls in platform-tools directory $ adb push <local> [remote] Upload a specified file from your computer to an emulator/device. By default pushes from platform-tools directory. Example: $ adb pull /sdcard/demo.mp4 . $ adb push d:test.apk /sdcard
  • 114. Android Debug Bridge (File Manager) Command Description $ adb shell ls <path> List files in a directory $ adb shell cd <path> Change directory $ adb shell rm <file> Remove a file $ adb shell mkdir <dir> Make directory $ adb shell touch [Options] <file> Create empty file or change file timestamps $ adb shell pwd Print current working directory location $ adb shell cp <s-file> <d-file> Copy source file to destination file $ adb shell mv <s-file> <d-file> Move source file to destination file Example: $ adb shell ls $ adb shell mkdir test $ adb shell rm -r test
  • 115. Android Debug Bridge (Network) Command Description $ adb shell netstat $ adb shell ping <ip> $ adb shell netcfg $ adb shell ip Example: $ adb shell ping 192.168.32.71
  • 116. Android Debug Bridge (Logcat) Command Description $ adb logcat [option] [filter-specs] Prints logs to screen *:V (Verbose) lowest priority, *:D (Debug), *:I (Info), *:W (warning), *:E (Error), *:F (Fatal), *:S (Silent) highest priority $ logcat -b <buffer : radio, event, main (default)> $ adb logcat -c : Clears the entire log and exits $ adb logcat -d : Dumps the log to the screen and exits $ adb logcat -f test.logs : Writes log message output to test.logs $ adb logcat -g : Prints the size of the specified log buffer and exits $ adb logcat -v [option] Example: $ adb logcat *:V $ logcat -b radio $ adb logcat -v brief
  • 117. Android Debug Bridge (Screenshot) Command Description $ adb shell screencap <file> Taking a screenshot of a device display $ adb shell screenrecord [OPT] <file> Record video; press Ctrl-C to stop recording Example: $ adb shell screencap /sdcard/screen.png $ adb shell screenrecord /sdcard/demo.mp4 $ adb shell screenrecord --time-limit 180 * 180 => 3 minute
  • 118. Android Debug Bridge (System) Command Description $ adb root Run adb in root mode $ adb sideload $ adb reeboot Reboot the device $ adb shell ps $ adb shell top $ adb shell getprop [OPTION] Get property via the android property service $ adb shell setprop <key> <value> Set property service $ adb shell dumpsys [options] Dumps system data. $ adb shell dumpstate Dumps state Example: $ adb shell setprop service.adb.tcp.port 5555 $ adb shell getprop ro.build.version.sdk $ adb dumpsys battery $ adb dumpstate > state_log.txt
  • 119. Android Debug Bridge (Re-mounting file system) Command Description $ adb remount Remount file system RW or RO *remount command runs in root mode. adb daemon shall be restarted in root mode ($ adb root) Example: $ adb remount /system,rw $ adb remount /system,ro $ adb mount -o rw, remount /system $ adb shell su -c “remount /system,rw”
  • 120. Android Debug Bridge (Display) Command Description $ adb shell dumpsys display To dump display settings $ adb shell wm density <DPI> To change the density $ adb shell wm size <WxH> To set height and width $ adb shell wm size reset To reset the size to default $ adb shell wm density reset To reset the density to default $ adb shell wm overscan reset To reset the overscan $ adb shell dumpsys window To dump window setting Example: $ adb shell dumpsys display $ adb shell wm size 1280x720 $ adb shell wm density 160 $ adb shell wm overscan reset BOTTOM $ adb shell wm scaling auto *overscan – used for TV
  • 121. Android Debug Bridge (svc commands) Command Description $ adb shell svc [cmd-options] To control power, wifi etc Options: power Control the power manager data Control mobile data connectivity wifi Control the Wi-Fi manager usb Control Usb state nfc Control NFC functions Example: $ adb shell svc power shutdown $ adb shell svc power reboot $ adb shell svc wifi enable
  • 122. Android App Test Tools • Robotium • Monkey Runner • Renorex • Monkey Talk • Appium • UI Automator