\subsection{Introduction}
\begin{frame}
  \frametitle{ADB}
  \begin{itemize}
  \item Usually on embedded devices, debugging is done either
    through a serial port on the device or JTAG for low-level
    debugging
  \item This setup works well when developing a new product that will
    have a static system. You develop and debug a system on a product
    with serial and JTAG ports, and remove these ports from the final
    product.
  \item For mobile devices, where you will have applications
    developers that are not in-house, this is not enough.
  \item To address that issue, Google developed ADB, that runs on top
    of USB, so that another developer can still have debugging and
    low-level interaction with a production device.
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Implementation}
  \begin{itemize}
  \item The code is split in 3 components:
    \begin{itemize}
    \item ADBd, the part that runs on the device
    \item ADB server, which is run on the host, acts as a proxy and
      manages the connection to ADBd
    \item ADB clients, which are also run on the host, and are
      what is used to send commands to the device
    \end{itemize}
  \item ADBd can work either on top of TCP or USB.
    \begin{itemize}
    \item For USB, Google has implemented a driver using the USB
      gadget and the USB composite frameworks as it implements either
      the ADB protocol and the USB Mass Storage mechanism.
    \item For TCP, ADBd just opens a socket
    \end{itemize}
  \item ADB can also be used as a transport layer between the
    development platform and the device, disregarding whether it uses
    USB or TCP as underneath layer
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{ADB Architecture}
  \begin{center}
    \includegraphics[width=\textwidth]{slides/android-adb-introduction/adb-arch.pdf}
  \end{center}
\end{frame}
