\subsection{Toolbox}

\begin{frame}
  \frametitle{Whole Android Stack}
  \begin{center}
    \includegraphics[height=0.85\textheight]{slides/android-native-layer-toolbox/android-stack-toolbox.pdf}
  \end{center}
\end{frame}

\begin{frame}
  \frametitle{Why Toolbox?}
  \begin{itemize}
  \item A Linux system needs a basic set of programs to work
    \begin{itemize}
    \item An init program
    \item A shell
    \item Various basic utilities for file manipulation and system
      configuration
    \end{itemize}
  \item In normal Linux systems, these programs are provided by
    different projects
    \begin{itemize}
    \item \code{coreutils}, \code{bash}, \code{grep}, \code{sed},
      \code{tar}, \code{wget}, \code{modutils}, etc. are all different
      projects
    \item Many different components to integrate
    \item Components not designed with embedded systems constraints in
      mind: they are not very configurable and have a wide range of
      features
    \end{itemize}
  \item Busybox is an alternative solution, extremely common on
    embedded systems
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{General purpose toolbox: BusyBox}
  \begin{itemize}
  \item Rewrite of many useful Unix command line utilities
    \begin{itemize}
    \item Integrated into a single project, which makes it easy to
      work with
    \item Designed with embedded systems in mind: highly configurable,
      no unnecessary features
    \end{itemize}
  \item All the utilities are compiled into a single executable,
    \code{/bin/busybox}
    \begin{itemize}
    \item Symbolic links to \code{/bin/busybox} are created for each
      application integrated into Busybox
    \end{itemize}
  \item For a fairly featureful configuration, less than 500 KB
    (statically compiled with uClibc) or less than 1 MB (statically
    compiled with glibc).
  \item   \url{http://www.busybox.net/}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{BusyBox commands!}
  Commands available in BusyBox 1.13
  \begin{spacing}{0}
    \tiny
    \code{[, [[, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, basename, bbconfig, bbsh, brctl, bunzip2, busybox, bzcat, bzip2, cal, cat, catv, chat, chattr, chcon, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devfsd, df, dhcprelay, diff, dirname, dmesg, dnsd, dos2unix, dpkg, dpkg_deb, du, dumpkmap, dumpleases, e2fsck, echo, ed, egrep, eject, env, envdir, envuidgid, ether_wake, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fetchmail, fgrep, find, findfs, fold, free, freeramdisk, fsck, fsck_minix, ftpget, ftpput, fuser, getenforce, getopt, getsebool, getty, grep, gunzip, gzip, halt, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifup, inetd, init, inotifyd, insmod, install, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, lash, last, length, less, linux32, linux64, linuxrc, ln, load_policy, loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, makedevs, man, matchpathcon, md5sum, mdev, mesg, microcom, mkdir, mke2fs, mkfifo, mkfs_minix, mknod, mkswap, mktemp, modprobe, more, mount, mountpoint, msh, mt, mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, parse, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, poweroff, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath, reboot, renice, reset, resize, restorecon, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run_parts, runcon, runlevel, runsv, runsvdir, rx, script, sed, selinuxenabled, sendmail, seq, sestatus, setarch, setconsole, setenforce, setfiles, setfont, setkeycodes, setlogcons, setsebool, setsid, setuidgid, sh, sha1sum, showkey, slattach, sleep, softlimit, sort, split, start_stop_daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, top, touch, tr, traceroute, true, tty, ttysize, tune2fs, udhcpc, udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip}
  \end{spacing}
\end{frame}

\begin{frame}
  \frametitle{Toolbox}
  \begin{itemize}
  \item As Busybox is under the GPL, Google developed an equivalent
    tool, under the BSD license
  \item Much fewer UNIX commands implemented than Busybox, but other
    commands to use the Android-specifics mechanism, such as
    \code{alarm}, \code{getprop} or a modified \code{log}
  \end{itemize}
  Commands available in Toolbox in Jelly Bean
  \begin{spacing}{0}
    \tiny
    \code{alarm, cat, chcon, chmod, chown, cmp, cp, date, dd, df, dmesg, du, dynarray, exists, getenforce, getevent, getprop, getsebool, grep, hd, id, ifconfig, iftop, insmod, ioctl, ionice, kill, ln, load_policy, log, ls, lsmod, lsof, lsusb, md5, mkdir, mount, mv, nandread, netstat, newfs_msdos, notify, printenv, ps, r, readtty, reboot, renice, restorecon, rm, rmdir, rmmod, rotatefb, route, runcon, schedtop, sendevent, setconsole, setenforce, setkey, setprop, setsebool, sleep, smd, start, stop, sync, syren, top, touch, umount, uptime, vmstat, watchprops, wipe}
  \end{spacing}
  \vfill
  \begin{itemize}
  \item The shell is provided by an external project, \code{mksh},
    which is a BSD-licenced implementation of \code{ksh}
  \end{itemize}
\end{frame}
