diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index d8876f55..e086d3f9 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -9,7 +9,7 @@ on:
     inputs:
       apis:
         description: 'CSV of apis to build and test'
-        default: 'admob,analytics,auth,database,dynamic_links,firestore,functions,gma,messaging,remote_config,storage'
+        default: 'analytics,auth,database,dynamic_links,firestore,functions,gma,messaging,remote_config,storage'
         required: true
 
 env:
@@ -32,7 +32,7 @@ jobs:
         if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
           apis="${{ github.event.inputs.apis }}"
         else
-          apis="admob,analytics,auth,database,dynamic_links,firestore,functions,gma,messaging,remote_config,storage"
+          apis="analytics,auth,database,dynamic_links,firestore,functions,gma,messaging,remote_config,storage"
         fi
         echo apis:  ${apis}
         echo "::set-output name=apis::${apis}"
diff --git a/admob/testapp/AndroidManifest.xml b/admob/testapp/AndroidManifest.xml
deleted file mode 100644
index e62e6385..00000000
--- a/admob/testapp/AndroidManifest.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.google.android.admob.testapp"
-          android:versionCode="1"
-          android:versionName="1.0">
-  <uses-permission android:name="android.permission.INTERNET" />
-  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-  <uses-permission android:name="android.permission.WAKE_LOCK" />
-  <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
-  <application android:label="@string/app_name">
-    <!-- You may replace the sample Admob App ID below with your own App ID. -->
-    <meta-data
-        android:name="com.google.android.gms.ads.APPLICATION_ID"
-        android:value="YOUR_ANDROID_ADMOB_APP_ID"/>
-    <activity android:name="android.app.NativeActivity"
-      android:screenOrientation="portrait"
-      android:configChanges="orientation|screenSize">
-      <meta-data android:name="android.app.lib_name"
-                 android:value="android_main" />
-      <intent-filter>
-        <action android:name="android.intent.action.MAIN" />
-        <category android:name="android.intent.category.LAUNCHER" />
-      </intent-filter>
-    </activity>
-  </application>
-</manifest>
diff --git a/admob/testapp/CMakeLists.txt b/admob/testapp/CMakeLists.txt
deleted file mode 100644
index 3a7d02dd..00000000
--- a/admob/testapp/CMakeLists.txt
+++ /dev/null
@@ -1,111 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-
-# User settings for Firebase samples.
-# Path to Firebase SDK.
-# Try to read the path to the Firebase C++ SDK from an environment variable.
-if (NOT "$ENV{FIREBASE_CPP_SDK_DIR}" STREQUAL "")
-  set(DEFAULT_FIREBASE_CPP_SDK_DIR "$ENV{FIREBASE_CPP_SDK_DIR}")
-else()
-  set(DEFAULT_FIREBASE_CPP_SDK_DIR "firebase_cpp_sdk")
-endif()
-if ("${FIREBASE_CPP_SDK_DIR}" STREQUAL "")
-  set(FIREBASE_CPP_SDK_DIR ${DEFAULT_FIREBASE_CPP_SDK_DIR})
-endif()
-if(NOT EXISTS ${FIREBASE_CPP_SDK_DIR})
-  message(FATAL_ERROR "The Firebase C++ SDK directory does not exist: ${FIREBASE_CPP_SDK_DIR}. See the readme.md for more information")
-endif()
-
-# Sample source files.
-set(FIREBASE_SAMPLE_COMMON_SRCS
-  src/main.h
-  src/common_main.cc
-)
-
-# The include directory for the testapp.
-include_directories(src)
-
-# Sample uses some features that require C++ 11, such as lambdas.
-set (CMAKE_CXX_STANDARD 11)
-
-if(ANDROID)
-  # Build an Android application.
-
-  # Source files used for the Android build.
-  set(FIREBASE_SAMPLE_ANDROID_SRCS
-    src/android/android_main.cc
-  )
-
-  # Build native_app_glue as a static lib
-  add_library(native_app_glue STATIC
-    ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
-
-  # Export ANativeActivity_onCreate(),
-  # Refer to: https://github.com/android-ndk/ndk/issues/381.
-  set(CMAKE_SHARED_LINKER_FLAGS
-      "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
-
-  # Define the target as a shared library, as that is what gradle expects.
-  set(target_name "android_main")
-  add_library(${target_name} SHARED
-    ${FIREBASE_SAMPLE_ANDROID_SRCS}
-    ${FIREBASE_SAMPLE_COMMON_SRCS}
-  )
-
-  target_link_libraries(${target_name}
-    log android atomic native_app_glue
-  )
-
-  target_include_directories(${target_name} PRIVATE
-    ${ANDROID_NDK}/sources/android/native_app_glue)
-
-  set(ADDITIONAL_LIBS)
-else()
-  # Build a desktop application.
-
-  # Windows runtime mode, either MD or MT depending on whether you are using
-  # /MD or /MT. For more information see:
-  # https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
-  set(MSVC_RUNTIME_MODE MD)
-
-  # Platform abstraction layer for the desktop sample.
-  set(FIREBASE_SAMPLE_DESKTOP_SRCS
-    src/desktop/desktop_main.cc
-  )
-
-  set(target_name "desktop_testapp")
-  add_executable(${target_name}
-    ${FIREBASE_SAMPLE_DESKTOP_SRCS}
-    ${FIREBASE_SAMPLE_COMMON_SRCS}
-  )
-
-  if(APPLE)
-    set(ADDITIONAL_LIBS pthread)
-  elseif(MSVC)
-    set(ADDITIONAL_LIBS)
-  else()
-    set(ADDITIONAL_LIBS pthread)
-  endif()
-
-  # If a config file is present, copy it into the binary location so that it's
-  # possible to create the default Firebase app.
-  set(FOUND_JSON_FILE FALSE)
-  foreach(config "google-services-desktop.json" "google-services.json")
-    if (EXISTS ${config})
-      add_custom_command(
-        TARGET ${target_name} POST_BUILD
-        COMMAND ${CMAKE_COMMAND} -E copy
-          ${config} $<TARGET_FILE_DIR:${target_name}>)
-      set(FOUND_JSON_FILE TRUE)
-      break()
-    endif()
-  endforeach()
-  if(NOT FOUND_JSON_FILE)
-    message(WARNING "Failed to find either google-services-desktop.json or google-services.json. See the readme.md for more information.")
-  endif()
-endif()
-
-# Add the Firebase libraries to the target using the function from the SDK.
-add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL)
-# Note that firebase_app needs to be last in the list.
-set(firebase_libs firebase_admob firebase_app)
-target_link_libraries(${target_name} "${firebase_libs}" ${ADDITIONAL_LIBS})
diff --git a/admob/testapp/LICENSE b/admob/testapp/LICENSE
deleted file mode 100644
index d6456956..00000000
--- a/admob/testapp/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/admob/testapp/LaunchScreen.storyboard b/admob/testapp/LaunchScreen.storyboard
deleted file mode 100644
index 673e0f7e..00000000
--- a/admob/testapp/LaunchScreen.storyboard
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
-    <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
-    </dependencies>
-    <scenes/>
-</document>
diff --git a/admob/testapp/Podfile b/admob/testapp/Podfile
deleted file mode 100644
index 9759f528..00000000
--- a/admob/testapp/Podfile
+++ /dev/null
@@ -1,6 +0,0 @@
-source 'https://github.com/CocoaPods/Specs.git'
-platform :ios, '8.0'
-# AdMob test application.
-target 'testapp' do
-  pod 'Firebase/AdMob', '7.0.0'
-end
diff --git a/admob/testapp/build.gradle b/admob/testapp/build.gradle
deleted file mode 100644
index a6697fca..00000000
--- a/admob/testapp/build.gradle
+++ /dev/null
@@ -1,64 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-buildscript {
-  repositories {
-    mavenLocal()
-    maven { url 'https://maven.google.com'  }
-    jcenter()
-  }
-  dependencies {
-    classpath 'com.android.tools.build:gradle:3.3.3'
-    classpath 'com.google.gms:google-services:4.0.1'
-  }
-}
-
-allprojects {
-  repositories {
-    mavenLocal()
-    maven { url 'https://maven.google.com'  }
-    jcenter()
-  }
-}
-
-apply plugin: 'com.android.application'
-
-android {
-  compileSdkVersion 28
-  buildToolsVersion '28.0.3'
-
-  sourceSets {
-    main {
-      jniLibs.srcDirs = ['libs']
-      manifest.srcFile 'AndroidManifest.xml'
-      java.srcDirs = ['src/android/java']
-      res.srcDirs = ['res']
-    }
-  }
-
-  defaultConfig {
-    applicationId 'com.google.android.admob.testapp'
-    minSdkVersion 26
-    targetSdkVersion 28
-    versionCode 1
-    versionName '1.0'
-    externalNativeBuild.cmake {
-      arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir"
-    }
-  }
-  externalNativeBuild.cmake {
-    path 'CMakeLists.txt'
-  }
-  buildTypes {
-    release {
-      minifyEnabled true
-      proguardFile getDefaultProguardFile('proguard-android.txt')
-      proguardFile file('proguard.pro')
-    }
-  }
-}
-
-apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
-firebaseCpp.dependencies {
-  admob
-}
-
-apply plugin: 'com.google.gms.google-services'
diff --git a/admob/testapp/gradle/wrapper/gradle-wrapper.jar b/admob/testapp/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 8c0fb64a..00000000
Binary files a/admob/testapp/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/admob/testapp/gradle/wrapper/gradle-wrapper.properties b/admob/testapp/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 9e09cdb6..00000000
--- a/admob/testapp/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Mon Nov 27 14:03:45 PST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip
diff --git a/admob/testapp/gradlew b/admob/testapp/gradlew
deleted file mode 100755
index 91a7e269..00000000
--- a/admob/testapp/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
-    echo "$*"
-}
-
-die ( ) {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-esac
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched.
-if $cygwin ; then
-    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >&-
-APP_HOME="`pwd -P`"
-cd "$SAVED" >&-
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/admob/testapp/gradlew.bat b/admob/testapp/gradlew.bat
deleted file mode 100644
index 8a0b282a..00000000
--- a/admob/testapp/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/admob/testapp/proguard.pro b/admob/testapp/proguard.pro
deleted file mode 100644
index 54cd248b..00000000
--- a/admob/testapp/proguard.pro
+++ /dev/null
@@ -1,2 +0,0 @@
--ignorewarnings
--keep,includedescriptorclasses public class com.google.firebase.example.LoggingUtils { *; }
diff --git a/admob/testapp/readme.md b/admob/testapp/readme.md
deleted file mode 100644
index e8f45f80..00000000
--- a/admob/testapp/readme.md
+++ /dev/null
@@ -1,200 +0,0 @@
-Firebase AdMob Quickstart
-==============================
-
-The Firebase AdMob Test Application (testapp) demonstrates loading and showing
-banners and interstitials using the Firebase AdMob C++ SDK. The application
-has no user interface and simply logs actions it's performing to the console
-while displaying the ads.
-
-Introduction
-------------
-
-- [Read more about Firebase AdMob](https://firebase.google.com/docs/admob)
-
-Getting Started
----------------
-
-### iOS
- - Link your iOS app to the Firebase libraries.
-    - Get CocoaPods version 1 or later by running,
-        ```
-        sudo gem install cocoapods --pre
-        ```
-    - From the testapp directory, install the CocoaPods listed in the Podfile
-      by running,
-        ```
-        pod install
-        ```
-    - Open the generated Xcode workspace (which now has the CocoaPods),
-        ```
-        open testapp.xcworkspace
-        ```
-    - For further details please refer to the
-      [general instructions for setting up an iOS app with Firebase](https://firebase.google.com/docs/ios/setup).
-  - Register your iOS app with Firebase.
-    - Create a new app on the [Firebase console](https://firebase.google.com/console/),
-      and attach your iOS app to it.
-      - You can use "com.google.ios.admob.testapp" as the iOS Bundle ID
-        while you're testing. You can omit App Store ID while testing.
-  - Download the Firebase C++ SDK linked from
-    [https://firebase.google.com/docs/cpp/setup](https://firebase.google.com/docs/cpp/setup)
-    and unzip it to a directory of your choice.
-  - Add the following frameworks from the Firebase C++ SDK to the project:
-    - frameworks/ios/universal/firebase.framework
-    - frameworks/ios/universal/firebase_admob.framework
-    - You will need to either,
-       1. Check "Copy items if needed" when adding the frameworks, or
-       2. Add the framework path in "Framework Search Paths"
-          - For example, if you downloaded the Firebase C++ SDK to
-            `/Users/me/firebase_cpp_sdk`,
-            then you would add the path
-            `/Users/me/firebase_cpp_sdk/frameworks/ios/universal`.
-          - To add the path, in Xcode, select your project in the project
-            navigator, then select your target in the main window.
-            Select the "Build Settings" tab, and click "All" to see all
-            the build settings. Scroll down to "Search Paths", and add
-            your path to "Framework Search Paths".
-  - Update the AdMob App ID:
-    - In the `src/common_main.cc`, update `kAdMobAppID` with the app ID for
-      your iOS app, replacing 'YOUR_IOS_ADMOB_APP_ID'.
-    - In the `testapp/Info.plist`, update `GADApplicationIdentifier` with the
-      same app ID, replacing 'YOUR_IOS_ADMOB_APP_ID'.
-    - For more information, see
-      [Update your Info.plist](https://developers.google.com/admob/ios/quick-start#manual_download)
-  - In Xcode, build & run the sample on an iOS device or simulator.
-  - The testapp displays a banner ad and an interstitial ad. You can dismiss
-    the interstitial ad to see the banner ad.
-  - Afterwards, the testapp will display a Rewarded Video test ad.
-  - The output of the app can be viewed onscreen or via the console. To view
-    the console in Xcode, select "View --> Debug Area --> Activate Console"
-    from the menu.
-
-### Android
-  - Register your Android app with Firebase.
-    - Create a new app on the [Firebase console](https://firebase.google.com/console/),
-      and attach your Android app to it.
-      - You can use "com.google.android.admob.testapp" as the Package Name
-        while you're testing.
-      - To [generate a SHA1](https://developers.google.com/android/guides/client-auth)
-        run this command on Mac and Linux,
-        ```
-        keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
-        ```
-        or this command on Windows,
-        ```
-        keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
-        ```
-      - If keytool reports that you do not have a debug.keystore, you can
-        [create one with](http://developer.android.com/tools/publishing/app-signing.html#signing-manually),
-        ```
-        keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"
-        ```
-    - Add the `google-services.json` file that you downloaded from Firebase
-      console to the root directory of testapp. This file identifies your
-      Android app to the Firebase backend.
-    - For further details please refer to the
-      [general instructions for setting up an Android app with Firebase](https://firebase.google.com/docs/android/setup).
-  - Download the Firebase C++ SDK linked from
-    [https://firebase.google.com/docs/cpp/setup](https://firebase.google.com/docs/cpp/setup)
-    and unzip it to a directory of your choice.
-  - Configure the location of the Firebase C++ SDK by setting the
-    firebase\_cpp\_sdk.dir Gradle property to the SDK install directory.
-    For example, in the project directory:
-      ```
-      echo "systemProp.firebase\_cpp\_sdk.dir=/User/$USER/firebase\_cpp\_sdk" >> gradle.properties
-      ```
-  - Ensure the Android SDK and NDK locations are set in Android Studio.
-    - From the Android Studio launch menu, go to `File/Project Structure...` or
-      `Configure/Project Defaults/Project Structure...`
-      (Shortcut: Control + Alt + Shift + S on windows,  Command + ";" on a mac)
-      and download the SDK and NDK if the locations are not yet set.
-  - Open *build.gradle* in Android Studio.
-    - From the Android Studio launch menu, "Open an existing Android Studio
-      project", and select `build.gradle`.
-  - Install the SDK Platforms that Android Studio reports missing.
-  - Update the AdMob App ID:
-    - In the `src/common_main.cc`, update `kAdMobAppID` with the app ID for
-      your Android app, replacing 'YOUR_ANDROID_ADMOB_APP_ID'.
-    - In the `AndroidManifest.xml`, update
-      `com.google.android.gms.ads.APPLICATION_ID` with the same app ID,
-      replacing 'YOUR_ANDROID_ADMOB_APP_ID'.
-    - For more information, see
-      [Update your AndroidManifest.xml](https://developers.google.com/admob/android/quick-start#update_your_androidmanifestxml)
-  - Build the testapp and run it on an Android device or emulator.
-  - The testapp will initialize AdMob, then load and display a test banner and
-    a test interstitial.
-  - Tapping on an ad to verify the clickthrough process is possible, and the
-    interstitial will wait to be closed by the user.
-  - Afterwards, the testapp will display a Rewarded Video test ad.
-  - While this is happening, information from the device log will be written
-    to an onscreen TextView.
-    - Logcat can also be used as normal.
-
-### Desktop
-  - Register your app with Firebase.
-    - Create a new app on the [Firebase console](https://firebase.google.com/console/),
-      following the above instructions for Android or iOS.
-    - If you have an Android project, add the `google-services.json` file that
-      you downloaded from the Firebase console to the root directory of the
-      testapp.
-    - If you have an iOS project, and don't wish to use an Android project,
-      you can use the Python script `generate_xml_from_google_services_json.py --plist`,
-      located in the Firebase C++ SDK, to convert your `GoogleService-Info.plist`
-      file into a `google-services-desktop.json` file, which can then be
-      placed in the root directory of the testapp.
-  - Download the Firebase C++ SDK linked from
-    [https://firebase.google.com/docs/cpp/setup](https://firebase.google.com/docs/cpp/setup)
-    and unzip it to a directory of your choice.
-  - Configure the testapp with the location of the Firebase C++ SDK.
-    This can be done a couple different ways:
-    - When invoking cmake, pass in the location with
-      -DFIREBASE_CPP_SDK_DIR=/path/to/firebase_cpp_sdk.
-    - Set an environment variable for FIREBASE_CPP_SDK_DIR to the path to use.
-    - Edit the CMakeLists.txt file, changing the FIREBASE_CPP_SDK_DIR path
-      to the appropriate location.
-  - From the testapp directory, generate the build files by running,
-      ```
-      cmake .
-      ```
-    If you want to use XCode, you can use -G"Xcode" to generate the project.
-    Similarly, to use Visual Studio, -G"Visual Studio 15 2017". For more
-    information, see
-    [CMake generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html).
-  - Build the testapp, by either opening the generated project file based on
-    the platform, or running,
-      ```
-      cmake --build .
-      ```
-  - Execute the testapp by running,
-      ```
-      ./desktop_testapp
-      ```
-    Note that the executable might be under another directory, such as Debug.
-  - The testapp has no user interface, but the output can be viewed via the
-    console. Note that Admob uses a stubbed implementation on desktop,
-    so functionality is not expected.
-
-Support
--------
-
-[https://firebase.google.com/support/](https://firebase.google.com/support/)
-
-License
--------
-
-Copyright 2016 Google, Inc.
-
-Licensed to the Apache Software Foundation (ASF) under one or more contributor
-license agreements.  See the NOTICE file distributed with this work for
-additional information regarding copyright ownership.  The ASF licenses this
-file to you under the Apache License, Version 2.0 (the "License"); you may not
-use this file except in compliance with the License.  You may obtain a copy of
-the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
-License for the specific language governing permissions and limitations under
-the License.
diff --git a/admob/testapp/res/values/strings.xml b/admob/testapp/res/values/strings.xml
deleted file mode 100644
index 8589bd2c..00000000
--- a/admob/testapp/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-  <string name="app_name">Firebase AdMob Test</string>
-</resources>
diff --git a/admob/testapp/settings.gradle b/admob/testapp/settings.gradle
deleted file mode 100644
index 2a543b93..00000000
--- a/admob/testapp/settings.gradle
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-def firebase_cpp_sdk_dir = System.getProperty('firebase_cpp_sdk.dir')
-if (firebase_cpp_sdk_dir == null || firebase_cpp_sdk_dir.isEmpty()) {
-  firebase_cpp_sdk_dir = System.getenv('FIREBASE_CPP_SDK_DIR')
-  if (firebase_cpp_sdk_dir == null || firebase_cpp_sdk_dir.isEmpty()) {
-    if ((new File('firebase_cpp_sdk')).exists()) {
-      firebase_cpp_sdk_dir = 'firebase_cpp_sdk'
-    } else {
-      throw new StopActionException(
-        'firebase_cpp_sdk.dir property or the FIREBASE_CPP_SDK_DIR ' +
-        'environment variable must be set to reference the Firebase C++ ' +
-        'SDK install directory.  This is used to configure static library ' +
-        'and C/C++ include paths for the SDK.')
-    }
-  }
-}
-if (!(new File(firebase_cpp_sdk_dir)).exists()) {
-  throw new StopActionException(
-    sprintf('Firebase C++ SDK directory %s does not exist',
-            firebase_cpp_sdk_dir))
-}
-gradle.ext.firebase_cpp_sdk_dir = "$firebase_cpp_sdk_dir"
-includeBuild "$firebase_cpp_sdk_dir"
\ No newline at end of file
diff --git a/admob/testapp/src/android/android_main.cc b/admob/testapp/src/android/android_main.cc
deleted file mode 100644
index 73cb30e7..00000000
--- a/admob/testapp/src/android/android_main.cc
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <stdarg.h>
-#include <stdio.h>
-
-#include <android/log.h>
-#include <android_native_app_glue.h>
-#include <pthread.h>
-#include <cassert>
-
-#include "main.h"  // NOLINT
-
-// This implementation is derived from http://github.com/google/fplutil
-
-extern "C" int common_main(int argc, const char* argv[]);
-
-static struct android_app* g_app_state = nullptr;
-static bool g_destroy_requested = false;
-static bool g_started = false;
-static bool g_restarted = false;
-static pthread_mutex_t g_started_mutex;
-
-// Handle state changes from via native app glue.
-static void OnAppCmd(struct android_app* app, int32_t cmd) {
-  g_destroy_requested |= cmd == APP_CMD_DESTROY;
-}
-
-// Process events pending on the main thread.
-// Returns true when the app receives an event requesting exit.
-bool ProcessEvents(int msec) {
-  struct android_poll_source* source = nullptr;
-  int events;
-  int looperId = ALooper_pollAll(msec, nullptr, &events,
-                                 reinterpret_cast<void**>(&source));
-  if (looperId >= 0 && source) {
-    source->process(g_app_state, source);
-  }
-  return g_destroy_requested | g_restarted;
-}
-
-// Get the activity.
-jobject GetActivity() { return g_app_state->activity->clazz; }
-
-// Get the window context. For Android, it's a jobject pointing to the Activity.
-jobject GetWindowContext() { return g_app_state->activity->clazz; }
-
-// Find a class, attempting to load the class if it's not found.
-jclass FindClass(JNIEnv* env, jobject activity_object, const char* class_name) {
-  jclass class_object = env->FindClass(class_name);
-  if (env->ExceptionCheck()) {
-    env->ExceptionClear();
-    // If the class isn't found it's possible NativeActivity is being used by
-    // the application which means the class path is set to only load system
-    // classes.  The following falls back to loading the class using the
-    // Activity before retrieving a reference to it.
-    jclass activity_class = env->FindClass("android/app/Activity");
-    jmethodID activity_get_class_loader = env->GetMethodID(
-        activity_class, "getClassLoader", "()Ljava/lang/ClassLoader;");
-
-    jobject class_loader_object =
-        env->CallObjectMethod(activity_object, activity_get_class_loader);
-
-    jclass class_loader_class = env->FindClass("java/lang/ClassLoader");
-    jmethodID class_loader_load_class =
-        env->GetMethodID(class_loader_class, "loadClass",
-                         "(Ljava/lang/String;)Ljava/lang/Class;");
-    jstring class_name_object = env->NewStringUTF(class_name);
-
-    class_object = static_cast<jclass>(env->CallObjectMethod(
-        class_loader_object, class_loader_load_class, class_name_object));
-
-    if (env->ExceptionCheck()) {
-      env->ExceptionClear();
-      class_object = nullptr;
-    }
-    env->DeleteLocalRef(class_name_object);
-    env->DeleteLocalRef(class_loader_object);
-  }
-  return class_object;
-}
-
-// Vars that we need available for appending text to the log window:
-class LoggingUtilsData {
- public:
-  LoggingUtilsData()
-      : logging_utils_class_(nullptr),
-        logging_utils_add_log_text_(0),
-        logging_utils_init_log_window_(0) {}
-
-  ~LoggingUtilsData() {
-    JNIEnv* env = GetJniEnv();
-    assert(env);
-    if (logging_utils_class_) {
-      env->DeleteGlobalRef(logging_utils_class_);
-    }
-  }
-
-  void Init() {
-    JNIEnv* env = GetJniEnv();
-    assert(env);
-
-    jclass logging_utils_class = FindClass(
-        env, GetActivity(), "com/google/firebase/example/LoggingUtils");
-    assert(logging_utils_class != 0);
-
-    // Need to store as global references so it don't get moved during garbage
-    // collection.
-    logging_utils_class_ =
-        static_cast<jclass>(env->NewGlobalRef(logging_utils_class));
-    env->DeleteLocalRef(logging_utils_class);
-
-    logging_utils_init_log_window_ = env->GetStaticMethodID(
-        logging_utils_class_, "initLogWindow", "(Landroid/app/Activity;)V");
-    logging_utils_add_log_text_ = env->GetStaticMethodID(
-        logging_utils_class_, "addLogText", "(Ljava/lang/String;)V");
-
-    env->CallStaticVoidMethod(logging_utils_class_,
-                              logging_utils_init_log_window_, GetActivity());
-  }
-
-  void AppendText(const char* text) {
-    if (logging_utils_class_ == 0) return;  // haven't been initted yet
-    JNIEnv* env = GetJniEnv();
-    assert(env);
-    jstring text_string = env->NewStringUTF(text);
-    env->CallStaticVoidMethod(logging_utils_class_, logging_utils_add_log_text_,
-                              text_string);
-    env->DeleteLocalRef(text_string);
-  }
-
- private:
-  jclass logging_utils_class_;
-  jmethodID logging_utils_add_log_text_;
-  jmethodID logging_utils_init_log_window_;
-};
-
-LoggingUtilsData* g_logging_utils_data;
-
-// Checks if a JNI exception has happened, and if so, logs it to the console.
-void CheckJNIException() {
-  JNIEnv* env = GetJniEnv();
-  if (env->ExceptionCheck()) {
-    // Get the exception text.
-    jthrowable exception = env->ExceptionOccurred();
-    env->ExceptionClear();
-
-    // Convert the exception to a string.
-    jclass object_class = env->FindClass("java/lang/Object");
-    jmethodID toString =
-        env->GetMethodID(object_class, "toString", "()Ljava/lang/String;");
-    jstring s = (jstring)env->CallObjectMethod(exception, toString);
-    const char* exception_text = env->GetStringUTFChars(s, nullptr);
-
-    // Log the exception text.
-    __android_log_print(ANDROID_LOG_INFO, FIREBASE_TESTAPP_NAME,
-                        "-------------------JNI exception:");
-    __android_log_print(ANDROID_LOG_INFO, FIREBASE_TESTAPP_NAME, "%s",
-                        exception_text);
-    __android_log_print(ANDROID_LOG_INFO, FIREBASE_TESTAPP_NAME,
-                        "-------------------");
-
-    // Also, assert fail.
-    assert(false);
-
-    // In the event we didn't assert fail, clean up.
-    env->ReleaseStringUTFChars(s, exception_text);
-    env->DeleteLocalRef(s);
-    env->DeleteLocalRef(exception);
-  }
-}
-
-// Log a message that can be viewed in "adb logcat".
-void LogMessage(const char* format, ...) {
-  static const int kLineBufferSize = 100;
-  char buffer[kLineBufferSize + 2];
-
-  va_list list;
-  va_start(list, format);
-  int string_len = vsnprintf(buffer, kLineBufferSize, format, list);
-  string_len = string_len < kLineBufferSize ? string_len : kLineBufferSize;
-  // append a linebreak to the buffer:
-  buffer[string_len] = '\n';
-  buffer[string_len + 1] = '\0';
-
-  __android_log_vprint(ANDROID_LOG_INFO, FIREBASE_TESTAPP_NAME, format, list);
-  g_logging_utils_data->AppendText(buffer);
-  CheckJNIException();
-  va_end(list);
-}
-
-// Get the JNI environment.
-JNIEnv* GetJniEnv() {
-  JavaVM* vm = g_app_state->activity->vm;
-  JNIEnv* env;
-  jint result = vm->AttachCurrentThread(&env, nullptr);
-  return result == JNI_OK ? env : nullptr;
-}
-
-// Execute common_main(), flush pending events and finish the activity.
-extern "C" void android_main(struct android_app* state) {
-  // native_app_glue spawns a new thread, calling android_main() when the
-  // activity onStart() or onRestart() methods are called.  This code handles
-  // the case where we're re-entering this method on a different thread by
-  // signalling the existing thread to exit, waiting for it to complete before
-  // reinitializing the application.
-  if (g_started) {
-    g_restarted = true;
-    // Wait for the existing thread to exit.
-    pthread_mutex_lock(&g_started_mutex);
-    pthread_mutex_unlock(&g_started_mutex);
-  } else {
-    g_started_mutex = PTHREAD_MUTEX_INITIALIZER;
-  }
-  pthread_mutex_lock(&g_started_mutex);
-  g_started = true;
-
-  // Save native app glue state and setup a callback to track the state.
-  g_destroy_requested = false;
-  g_app_state = state;
-  g_app_state->onAppCmd = OnAppCmd;
-
-  // Create the logging display.
-  g_logging_utils_data = new LoggingUtilsData();
-  g_logging_utils_data->Init();
-
-  // Execute cross platform entry point.
-  static const char* argv[] = {FIREBASE_TESTAPP_NAME};
-  int return_value = common_main(1, argv);
-  (void)return_value;  // Ignore the return value.
-  ProcessEvents(10);
-
-  // Clean up logging display.
-  delete g_logging_utils_data;
-  g_logging_utils_data = nullptr;
-
-  // Finish the activity.
-  if (!g_restarted) ANativeActivity_finish(state->activity);
-
-  g_app_state->activity->vm->DetachCurrentThread();
-  g_started = false;
-  g_restarted = false;
-  pthread_mutex_unlock(&g_started_mutex);
-}
diff --git a/admob/testapp/src/android/java/com/google/firebase/example/LoggingUtils.java b/admob/testapp/src/android/java/com/google/firebase/example/LoggingUtils.java
deleted file mode 100644
index 11d67c5b..00000000
--- a/admob/testapp/src/android/java/com/google/firebase/example/LoggingUtils.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.firebase.example;
-
-import android.app.Activity;
-import android.os.Handler;
-import android.os.Looper;
-import android.view.Window;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-/**
- * A utility class, encapsulating the data and methods required to log arbitrary
- * text to the screen, via a non-editable TextView.
- */
-public class LoggingUtils {
-  public static TextView sTextView = null;
-
-  public static void initLogWindow(Activity activity) {
-    LinearLayout linearLayout = new LinearLayout(activity);
-    ScrollView scrollView = new ScrollView(activity);
-    TextView textView = new TextView(activity);
-    textView.setTag("Logger");
-    linearLayout.addView(scrollView);
-    scrollView.addView(textView);
-    Window window = activity.getWindow();
-    window.takeSurface(null);
-    window.setContentView(linearLayout);
-    sTextView = textView;
-  }
-
-  public static void addLogText(final String text) {
-    new Handler(Looper.getMainLooper()).post(new Runnable() {
-        @Override
-        public void run() {
-          if (sTextView != null) {
-            sTextView.append(text);
-          }
-        }
-      });
-  }
-}
diff --git a/admob/testapp/src/common_main.cc b/admob/testapp/src/common_main.cc
deleted file mode 100644
index eae4f5c4..00000000
--- a/admob/testapp/src/common_main.cc
+++ /dev/null
@@ -1,359 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "firebase/admob.h"
-#include "firebase/admob/banner_view.h"
-#include "firebase/admob/interstitial_ad.h"
-#include "firebase/admob/rewarded_video.h"
-#include "firebase/admob/types.h"
-#include "firebase/app.h"
-#include "firebase/future.h"
-
-// Thin OS abstraction layer.
-#include "main.h"  // NOLINT
-
-// A simple listener that logs changes to a BannerView.
-class LoggingBannerViewListener : public firebase::admob::BannerView::Listener {
- public:
-  LoggingBannerViewListener() {}
-  void OnPresentationStateChanged(
-      firebase::admob::BannerView* banner_view,
-      firebase::admob::BannerView::PresentationState state) override {
-    ::LogMessage("BannerView PresentationState has changed to %d.", state);
-  }
-  void OnBoundingBoxChanged(firebase::admob::BannerView* banner_view,
-                            firebase::admob::BoundingBox box) override {
-    ::LogMessage(
-        "BannerView BoundingBox has changed to (x: %d, y: %d, width: %d, "
-        "height %d).",
-        box.x, box.y, box.width, box.height);
-  }
-};
-
-// A simple listener that logs changes to an InterstitialAd.
-class LoggingInterstitialAdListener
-    : public firebase::admob::InterstitialAd::Listener {
- public:
-  LoggingInterstitialAdListener() {}
-  void OnPresentationStateChanged(
-      firebase::admob::InterstitialAd* interstitial_ad,
-      firebase::admob::InterstitialAd::PresentationState state) override {
-    ::LogMessage("InterstitialAd PresentationState has changed to %d.", state);
-  }
-};
-
-// A simple listener that logs changes to rewarded video state.
-class LoggingRewardedVideoListener
-    : public firebase::admob::rewarded_video::Listener {
- public:
-  LoggingRewardedVideoListener() {}
-  void OnRewarded(firebase::admob::rewarded_video::RewardItem reward) override {
-    ::LogMessage("Rewarding user with %f %s.", reward.amount,
-                 reward.reward_type.c_str());
-  }
-  void OnPresentationStateChanged(
-      firebase::admob::rewarded_video::PresentationState state) override {
-    ::LogMessage("Rewarded video PresentationState has changed to %d.", state);
-  }
-};
-
-// The AdMob app IDs for the test app.
-#if defined(__ANDROID__)
-// If you change the AdMob app ID for your Android app, make sure to change it
-// in AndroidManifest.xml as well.
-const char* kAdMobAppID = "YOUR_ANDROID_ADMOB_APP_ID";
-#else
-// If you change the AdMob app ID for your iOS app, make sure to change the
-// value for "GADApplicationIdentifier" in your Info.plist as well.
-const char* kAdMobAppID = "YOUR_IOS_ADMOB_APP_ID";
-#endif
-
-// These ad units IDs have been created specifically for testing, and will
-// always return test ads.
-#if defined(__ANDROID__)
-const char* kBannerAdUnit = "ca-app-pub-3940256099942544/6300978111";
-const char* kInterstitialAdUnit = "ca-app-pub-3940256099942544/1033173712";
-const char* kRewardedVideoAdUnit = "ca-app-pub-3940256099942544/5224354917";
-#else
-const char* kBannerAdUnit = "ca-app-pub-3940256099942544/2934735716";
-const char* kInterstitialAdUnit = "ca-app-pub-3940256099942544/4411468910";
-const char* kRewardedVideoAdUnit = "ca-app-pub-3940256099942544/1712485313";
-#endif
-
-// Standard mobile banner size is 320x50.
-static const int kBannerWidth = 320;
-static const int kBannerHeight = 50;
-
-// Sample keywords to use in making the request.
-static const char* kKeywords[] = {"AdMob", "C++", "Fun"};
-
-// Sample test device IDs to use in making the request.
-static const char* kTestDeviceIDs[] = {"2077ef9a63d2b398840261c8221a0c9b",
-                                       "098fe087d987c9a878965454a65654d7"};
-
-// Sample birthday value to use in making the request.
-static const int kBirthdayDay = 10;
-static const int kBirthdayMonth = 11;
-static const int kBirthdayYear = 1976;
-
-static void WaitForFutureCompletion(firebase::FutureBase future) {
-  while (!ProcessEvents(1000)) {
-    if (future.status() != firebase::kFutureStatusPending) {
-      break;
-    }
-  }
-
-  if (future.error() != firebase::admob::kAdMobErrorNone) {
-    LogMessage("ERROR: Action failed with error code %d and message \"%s\".",
-               future.error(), future.error_message());
-  }
-}
-
-// Execute all methods of the C++ admob API.
-extern "C" int common_main(int argc, const char* argv[]) {
-  firebase::App* app;
-  LogMessage("Initializing the AdMob library.");
-
-#if defined(__ANDROID__)
-  app = ::firebase::App::Create(GetJniEnv(), GetActivity());
-#else
-  app = ::firebase::App::Create();
-#endif  // defined(__ANDROID__)
-
-  LogMessage("Created the Firebase App %x.",
-             static_cast<int>(reinterpret_cast<intptr_t>(app)));
-
-  LogMessage("Initializing the AdMob with Firebase API.");
-  firebase::admob::Initialize(*app, kAdMobAppID);
-
-  firebase::admob::AdRequest request;
-  // If the app is aware of the user's gender, it can be added to the targeting
-  // information. Otherwise, "unknown" should be used.
-  request.gender = firebase::admob::kGenderUnknown;
-
-  // This value allows publishers to specify whether they would like the request
-  // to be treated as child-directed for purposes of the Children’s Online
-  // Privacy Protection Act (COPPA).
-  // See http://business.ftc.gov/privacy-and-security/childrens-privacy.
-  request.tagged_for_child_directed_treatment =
-      firebase::admob::kChildDirectedTreatmentStateTagged;
-
-  // The user's birthday, if known. Note that months are indexed from one.
-  request.birthday_day = kBirthdayDay;
-  request.birthday_month = kBirthdayMonth;
-  request.birthday_year = kBirthdayYear;
-
-  // Additional keywords to be used in targeting.
-  request.keyword_count = sizeof(kKeywords) / sizeof(kKeywords[0]);
-  request.keywords = kKeywords;
-
-  // "Extra" key value pairs can be added to the request as well. Typically
-  // these are used when testing new features.
-  static const firebase::admob::KeyValuePair kRequestExtras[] = {
-      {"the_name_of_an_extra", "the_value_for_that_extra"}};
-  request.extras_count = sizeof(kRequestExtras) / sizeof(kRequestExtras[0]);
-  request.extras = kRequestExtras;
-
-  // This example uses ad units that are specially configured to return test ads
-  // for every request. When using your own ad unit IDs, however, it's important
-  // to register the device IDs associated with any devices that will be used to
-  // test the app. This ensures that regardless of the ad unit ID, those
-  // devices will always receive test ads in compliance with AdMob policy.
-  //
-  // Device IDs can be obtained by checking the logcat or the Xcode log while
-  // debugging. They appear as a long string of hex characters.
-  request.test_device_id_count =
-      sizeof(kTestDeviceIDs) / sizeof(kTestDeviceIDs[0]);
-  request.test_device_ids = kTestDeviceIDs;
-
-  // Create an ad size for the BannerView.
-  firebase::admob::AdSize banner_ad_size;
-  banner_ad_size.ad_size_type = firebase::admob::kAdSizeStandard;
-  banner_ad_size.width = kBannerWidth;
-  banner_ad_size.height = kBannerHeight;
-
-  LogMessage("Creating the BannerView.");
-  firebase::admob::BannerView* banner = new firebase::admob::BannerView();
-  banner->Initialize(GetWindowContext(), kBannerAdUnit, banner_ad_size);
-
-  WaitForFutureCompletion(banner->InitializeLastResult());
-
-  // Set the listener.
-  LoggingBannerViewListener banner_listener;
-  banner->SetListener(&banner_listener);
-
-  // Load the banner ad.
-  LogMessage("Loading a banner ad.");
-  banner->LoadAd(request);
-
-  WaitForFutureCompletion(banner->LoadAdLastResult());
-
-  // Make the BannerView visible.
-  LogMessage("Showing the banner ad.");
-  banner->Show();
-
-  WaitForFutureCompletion(banner->ShowLastResult());
-
-  // Move to each of the six pre-defined positions.
-  LogMessage("Moving the banner ad to top-center.");
-  banner->MoveTo(firebase::admob::BannerView::kPositionTop);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Moving the banner ad to top-left.");
-  banner->MoveTo(firebase::admob::BannerView::kPositionTopLeft);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Moving the banner ad to top-right.");
-  banner->MoveTo(firebase::admob::BannerView::kPositionTopRight);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Moving the banner ad to bottom-center.");
-  banner->MoveTo(firebase::admob::BannerView::kPositionBottom);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Moving the banner ad to bottom-left.");
-  banner->MoveTo(firebase::admob::BannerView::kPositionBottomLeft);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Moving the banner ad to bottom-right.");
-  banner->MoveTo(firebase::admob::BannerView::kPositionBottomRight);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  // Try some coordinate moves.
-  LogMessage("Moving the banner ad to (100, 300).");
-  banner->MoveTo(100, 300);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Moving the banner ad to (100, 400).");
-  banner->MoveTo(100, 400);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  // Try hiding and showing the BannerView.
-  LogMessage("Hiding the banner ad.");
-  banner->Hide();
-
-  WaitForFutureCompletion(banner->HideLastResult());
-
-  LogMessage("Showing the banner ad.");
-  banner->Show();
-
-  WaitForFutureCompletion(banner->ShowLastResult());
-
-  // A few last moves after showing it again.
-  LogMessage("Moving the banner ad to (100, 300).");
-  banner->MoveTo(100, 300);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Moving the banner ad to (100, 400).");
-  banner->MoveTo(100, 400);
-
-  WaitForFutureCompletion(banner->MoveToLastResult());
-
-  LogMessage("Hiding the banner ad now that we're done with it.");
-  banner->Hide();
-
-  WaitForFutureCompletion(banner->HideLastResult());
-
-  // Create and test InterstitialAd.
-  LogMessage("Creating the InterstitialAd.");
-  firebase::admob::InterstitialAd* interstitial =
-      new firebase::admob::InterstitialAd();
-  interstitial->Initialize(GetWindowContext(), kInterstitialAdUnit);
-
-  WaitForFutureCompletion(interstitial->InitializeLastResult());
-
-  // Set the listener.
-  LoggingInterstitialAdListener interstitial_listener;
-  interstitial->SetListener(&interstitial_listener);
-
-  // When the InterstitialAd is initialized, load an ad.
-  LogMessage("Loading an interstitial ad.");
-  interstitial->LoadAd(request);
-
-  WaitForFutureCompletion(interstitial->LoadAdLastResult());
-
-  // When the InterstitialAd has loaded an ad, show it.
-  LogMessage("Showing the interstitial ad.");
-  interstitial->Show();
-
-  WaitForFutureCompletion(interstitial->ShowLastResult());
-
-  // Wait for the user to close the interstitial.
-  while (interstitial->presentation_state() !=
-         firebase::admob::InterstitialAd::PresentationState::
-             kPresentationStateHidden) {
-    ProcessEvents(1000);
-  }
-
-  // Start up rewarded video ads and associated mediation adapters.
-  LogMessage("Initializing rewarded video.");
-  namespace rewarded_video = firebase::admob::rewarded_video;
-  rewarded_video::Initialize();
-
-  WaitForFutureCompletion(rewarded_video::InitializeLastResult());
-
-  LogMessage("Setting rewarded video listener.");
-  LoggingRewardedVideoListener rewarded_listener;
-  rewarded_video::SetListener(&rewarded_listener);
-
-  LogMessage("Loading a rewarded video ad.");
-  rewarded_video::LoadAd(kRewardedVideoAdUnit, request);
-
-  WaitForFutureCompletion(rewarded_video::LoadAdLastResult());
-
-  // If an ad has loaded, show it. If the user watches all the way through, the
-  // LoggingRewardedVideoListener will log a reward!
-  if (rewarded_video::LoadAdLastResult().error() ==
-      firebase::admob::kAdMobErrorNone) {
-    LogMessage("Showing a rewarded video ad.");
-    rewarded_video::Show(GetWindowContext());
-
-    WaitForFutureCompletion(rewarded_video::ShowLastResult());
-
-    // Normally Pause and Resume would be called in response to the app pausing
-    // or losing focus. This is just a test.
-    LogMessage("Pausing.");
-    rewarded_video::Pause();
-
-    WaitForFutureCompletion(rewarded_video::PauseLastResult());
-
-    LogMessage("Resuming.");
-    rewarded_video::Resume();
-
-    WaitForFutureCompletion(rewarded_video::ResumeLastResult());
-  }
-
-  LogMessage("Done!");
-
-  // Wait until the user kills the app.
-  while (!ProcessEvents(1000)) {
-  }
-
-  delete banner;
-  delete interstitial;
-  rewarded_video::Destroy();
-  firebase::admob::Terminate();
-  delete app;
-
-  return 0;
-}
diff --git a/admob/testapp/src/desktop/desktop_main.cc b/admob/testapp/src/desktop/desktop_main.cc
deleted file mode 100644
index 0220c688..00000000
--- a/admob/testapp/src/desktop/desktop_main.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#ifdef _WIN32
-#include <direct.h>
-#define chdir _chdir
-#else
-#include <unistd.h>
-#endif  // _WIN32
-
-#ifdef _WIN32
-#include <windows.h>
-#endif  // _WIN32
-
-#include <algorithm>
-#include <string>
-
-#include "main.h"  // NOLINT
-
-// The TO_STRING macro is useful for command line defined strings as the quotes
-// get stripped.
-#define TO_STRING_EXPAND(X) #X
-#define TO_STRING(X) TO_STRING_EXPAND(X)
-
-// Path to the Firebase config file to load.
-#ifdef FIREBASE_CONFIG
-#define FIREBASE_CONFIG_STRING TO_STRING(FIREBASE_CONFIG)
-#else
-#define FIREBASE_CONFIG_STRING ""
-#endif  // FIREBASE_CONFIG
-
-extern "C" int common_main(int argc, const char* argv[]);
-
-static bool quit = false;
-
-#ifdef _WIN32
-static BOOL WINAPI SignalHandler(DWORD event) {
-  if (!(event == CTRL_C_EVENT || event == CTRL_BREAK_EVENT)) {
-    return FALSE;
-  }
-  quit = true;
-  return TRUE;
-}
-#else
-static void SignalHandler(int /* ignored */) { quit = true; }
-#endif  // _WIN32
-
-bool ProcessEvents(int msec) {
-#ifdef _WIN32
-  Sleep(msec);
-#else
-  usleep(msec * 1000);
-#endif  // _WIN32
-  return quit;
-}
-
-std::string PathForResource() {
-  return std::string();
-}
-
-void LogMessage(const char* format, ...) {
-  va_list list;
-  va_start(list, format);
-  vprintf(format, list);
-  va_end(list);
-  printf("\n");
-  fflush(stdout);
-}
-
-WindowContext GetWindowContext() { return nullptr; }
-
-// Change the current working directory to the directory containing the
-// specified file.
-void ChangeToFileDirectory(const char* file_path) {
-  std::string path(file_path);
-  std::replace(path.begin(), path.end(), '\\', '/');
-  auto slash = path.rfind('/');
-  if (slash != std::string::npos) {
-    std::string directory = path.substr(0, slash);
-    if (!directory.empty()) chdir(directory.c_str());
-  }
-}
-
-int main(int argc, const char* argv[]) {
-  ChangeToFileDirectory(
-      FIREBASE_CONFIG_STRING[0] != '\0' ?
-        FIREBASE_CONFIG_STRING : argv[0]);  // NOLINT
-#ifdef _WIN32
-  SetConsoleCtrlHandler((PHANDLER_ROUTINE)SignalHandler, TRUE);
-#else
-  signal(SIGINT, SignalHandler);
-#endif  // _WIN32
-  return common_main(argc, argv);
-}
-
-#if defined(_WIN32)
-// Returns the number of microseconds since the epoch.
-int64_t WinGetCurrentTimeInMicroseconds() {
-  FILETIME file_time;
-  GetSystemTimeAsFileTime(&file_time);
-
-  ULARGE_INTEGER now;
-  now.LowPart = file_time.dwLowDateTime;
-  now.HighPart = file_time.dwHighDateTime;
-
-  // Windows file time is expressed in 100s of nanoseconds.
-  // To convert to microseconds, multiply x10.
-  return now.QuadPart * 10LL;
-}
-#endif
diff --git a/admob/testapp/src/ios/ios_main.mm b/admob/testapp/src/ios/ios_main.mm
deleted file mode 100644
index 6ccb2de5..00000000
--- a/admob/testapp/src/ios/ios_main.mm
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#import <UIKit/UIKit.h>
-
-#include <stdarg.h>
-
-#include "main.h"
-
-extern "C" int common_main(int argc, const char* argv[]);
-
-@interface AppDelegate : UIResponder<UIApplicationDelegate>
-
-@property(nonatomic, strong) UIWindow *window;
-
-@end
-
-@interface FTAViewController : UIViewController
-
-@end
-
-static int g_exit_status = 0;
-static bool g_shutdown = false;
-static NSCondition *g_shutdown_complete;
-static NSCondition *g_shutdown_signal;
-static UITextView *g_text_view;
-static UIView *g_parent_view;
-
-@implementation FTAViewController
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-  g_parent_view = self.view;
-  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-    const char *argv[] = {FIREBASE_TESTAPP_NAME};
-    [g_shutdown_signal lock];
-    g_exit_status = common_main(1, argv);
-    [g_shutdown_complete signal];
-  });
-}
-
-@end
-
-bool ProcessEvents(int msec) {
-  [g_shutdown_signal
-      waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:static_cast<float>(msec) / 1000.0f]];
-  return g_shutdown;
-}
-
-WindowContext GetWindowContext() {
-  return g_parent_view;
-}
-
-// Log a message that can be viewed in the console.
-void LogMessage(const char* format, ...) {
-  va_list args;
-  NSString *formatString = @(format);
-
-  va_start(args, format);
-  NSString *message = [[NSString alloc] initWithFormat:formatString arguments:args];
-  va_end(args);
-
-  NSLog(@"%@", message);
-  message = [message stringByAppendingString:@"\n"];
-
-  dispatch_async(dispatch_get_main_queue(), ^{
-    g_text_view.text = [g_text_view.text stringByAppendingString:message];
-  });
-}
-
-int main(int argc, char* argv[]) {
-  @autoreleasepool {
-    UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
-  }
-  return g_exit_status;
-}
-
-@implementation AppDelegate
-
-- (BOOL)application:(UIApplication*)application
-    didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
-  g_shutdown_complete = [[NSCondition alloc] init];
-  g_shutdown_signal = [[NSCondition alloc] init];
-  [g_shutdown_complete lock];
-
-  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
-  FTAViewController *viewController = [[FTAViewController alloc] init];
-  self.window.rootViewController = viewController;
-  [self.window makeKeyAndVisible];
-
-  g_text_view = [[UITextView alloc] initWithFrame:viewController.view.bounds];
-
-  g_text_view.editable = NO;
-  g_text_view.scrollEnabled = YES;
-  g_text_view.userInteractionEnabled = YES;
-
-  [viewController.view addSubview:g_text_view];
-
-  return YES;
-}
-
-- (void)applicationWillTerminate:(UIApplication *)application {
-  g_shutdown = true;
-  [g_shutdown_signal signal];
-  [g_shutdown_complete wait];
-}
-
-@end
diff --git a/admob/testapp/src/main.h b/admob/testapp/src/main.h
deleted file mode 100644
index 2eda2c10..00000000
--- a/admob/testapp/src/main.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef FIREBASE_TESTAPP_MAIN_H_  // NOLINT
-#define FIREBASE_TESTAPP_MAIN_H_  // NOLINT
-
-#if defined(__ANDROID__)
-#include <android/native_activity.h>
-#include <jni.h>
-#elif defined(__APPLE__)
-extern "C" {
-#include <objc/objc.h>
-}  // extern "C"
-#endif  // __ANDROID__
-
-// Defined using -DANDROID_MAIN_APP_NAME=some_app_name when compiling this
-// file.
-#ifndef FIREBASE_TESTAPP_NAME
-#define FIREBASE_TESTAPP_NAME "android_main"
-#endif  // FIREBASE_TESTAPP_NAME
-
-// Cross platform logging method.
-// Implemented by android/android_main.cc or ios/ios_main.mm.
-extern "C" void LogMessage(const char* format, ...);
-
-// Platform-independent method to flush pending events for the main thread.
-// Returns true when an event requesting program-exit is received.
-bool ProcessEvents(int msec);
-
-// WindowContext represents the handle to the parent window.  It's type
-// (and usage) vary based on the OS.
-#if defined(__ANDROID__)
-typedef jobject WindowContext;  // A jobject to the Java Activity.
-#elif defined(__APPLE__)
-typedef id WindowContext;  // A pointer to an iOS UIView.
-#else
-typedef void* WindowContext;  // A void* for any other environments.
-#endif
-
-#if defined(__ANDROID__)
-// Get the JNI environment.
-JNIEnv* GetJniEnv();
-// Get the activity.
-jobject GetActivity();
-#endif  // defined(__ANDROID__)
-
-// Returns a variable that describes the window context for the app. On Android
-// this will be a jobject pointing to the Activity. On iOS, it's an id pointing
-// to the root view of the view controller.
-WindowContext GetWindowContext();
-
-#endif  // FIREBASE_TESTAPP_MAIN_H_  // NOLINT
diff --git a/admob/testapp/testapp.xcodeproj/project.pbxproj b/admob/testapp/testapp.xcodeproj/project.pbxproj
deleted file mode 100644
index 14a0af7f..00000000
--- a/admob/testapp/testapp.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,312 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		4A7C015A1CEAA2480011C504 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A7C01591CEAA2480011C504 /* Images.xcassets */; };
-		520BC0391C869159008CFBC3 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 520BC0381C869159008CFBC3 /* GoogleService-Info.plist */; };
-		529226D61C85F68000C89379 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529226D51C85F68000C89379 /* Foundation.framework */; };
-		529226D81C85F68000C89379 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529226D71C85F68000C89379 /* CoreGraphics.framework */; };
-		529226DA1C85F68000C89379 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529226D91C85F68000C89379 /* UIKit.framework */; };
-		529227211C85FB6A00C89379 /* common_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = 5292271F1C85FB6A00C89379 /* common_main.cc */; };
-		529227241C85FB7600C89379 /* ios_main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 529227221C85FB7600C89379 /* ios_main.mm */; };
-		D66B16871CE46E8900E5638A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D66B16861CE46E8900E5638A /* LaunchScreen.storyboard */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
-		4A7C01591CEAA2480011C504 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = testapp/Images.xcassets; sourceTree = "<group>"; };
-		520BC0381C869159008CFBC3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
-		529226D21C85F68000C89379 /* testapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = testapp.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		529226D51C85F68000C89379 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		529226D71C85F68000C89379 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
-		529226D91C85F68000C89379 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
-		529226EE1C85F68000C89379 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
-		5292271F1C85FB6A00C89379 /* common_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common_main.cc; path = src/common_main.cc; sourceTree = "<group>"; };
-		529227201C85FB6A00C89379 /* main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = main.h; path = src/main.h; sourceTree = "<group>"; };
-		529227221C85FB7600C89379 /* ios_main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ios_main.mm; path = src/ios/ios_main.mm; sourceTree = "<group>"; };
-		52FD1FF81C85FFA000BC68E3 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = testapp/Info.plist; sourceTree = "<group>"; };
-		D66B16861CE46E8900E5638A /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		529226CF1C85F68000C89379 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				529226D81C85F68000C89379 /* CoreGraphics.framework in Frameworks */,
-				529226DA1C85F68000C89379 /* UIKit.framework in Frameworks */,
-				529226D61C85F68000C89379 /* Foundation.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		529226C91C85F68000C89379 = {
-			isa = PBXGroup;
-			children = (
-				4A7C01591CEAA2480011C504 /* Images.xcassets */,
-				D66B16861CE46E8900E5638A /* LaunchScreen.storyboard */,
-				520BC0381C869159008CFBC3 /* GoogleService-Info.plist */,
-				52FD1FF81C85FFA000BC68E3 /* Info.plist */,
-				5292271D1C85FB5500C89379 /* src */,
-				529226D41C85F68000C89379 /* Frameworks */,
-				529226D31C85F68000C89379 /* Products */,
-			);
-			sourceTree = "<group>";
-		};
-		529226D31C85F68000C89379 /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				529226D21C85F68000C89379 /* testapp.app */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		529226D41C85F68000C89379 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				529226D51C85F68000C89379 /* Foundation.framework */,
-				529226D71C85F68000C89379 /* CoreGraphics.framework */,
-				529226D91C85F68000C89379 /* UIKit.framework */,
-				529226EE1C85F68000C89379 /* XCTest.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
-		5292271D1C85FB5500C89379 /* src */ = {
-			isa = PBXGroup;
-			children = (
-				5292271F1C85FB6A00C89379 /* common_main.cc */,
-				529227201C85FB6A00C89379 /* main.h */,
-				5292271E1C85FB5B00C89379 /* ios */,
-			);
-			name = src;
-			sourceTree = "<group>";
-		};
-		5292271E1C85FB5B00C89379 /* ios */ = {
-			isa = PBXGroup;
-			children = (
-				529227221C85FB7600C89379 /* ios_main.mm */,
-			);
-			name = ios;
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
-		529226D11C85F68000C89379 /* testapp */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 529226F91C85F68000C89379 /* Build configuration list for PBXNativeTarget "testapp" */;
-			buildPhases = (
-				529226CE1C85F68000C89379 /* Sources */,
-				529226CF1C85F68000C89379 /* Frameworks */,
-				529226D01C85F68000C89379 /* Resources */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = testapp;
-			productName = testapp;
-			productReference = 529226D21C85F68000C89379 /* testapp.app */;
-			productType = "com.apple.product-type.application";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		529226CA1C85F68000C89379 /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastUpgradeCheck = 0640;
-				ORGANIZATIONNAME = Google;
-				TargetAttributes = {
-					529226D11C85F68000C89379 = {
-						CreatedOnToolsVersion = 6.4;
-					};
-				};
-			};
-			buildConfigurationList = 529226CD1C85F68000C89379 /* Build configuration list for PBXProject "testapp" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 0;
-			knownRegions = (
-				en,
-			);
-			mainGroup = 529226C91C85F68000C89379;
-			productRefGroup = 529226D31C85F68000C89379 /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				529226D11C85F68000C89379 /* testapp */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		529226D01C85F68000C89379 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				D66B16871CE46E8900E5638A /* LaunchScreen.storyboard in Resources */,
-				4A7C015A1CEAA2480011C504 /* Images.xcassets in Resources */,
-				520BC0391C869159008CFBC3 /* GoogleService-Info.plist in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		529226CE1C85F68000C89379 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				529227241C85FB7600C89379 /* ios_main.mm in Sources */,
-				529227211C85FB6A00C89379 /* common_main.cc in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
-		529226F71C85F68000C89379 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				COPY_PHASE_STRIP = NO;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.4;
-				MTL_ENABLE_DEBUG_INFO = YES;
-				ONLY_ACTIVE_ARCH = YES;
-				SDKROOT = iphoneos;
-				TARGETED_DEVICE_FAMILY = "1,2";
-			};
-			name = Debug;
-		};
-		529226F81C85F68000C89379 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				COPY_PHASE_STRIP = NO;
-				ENABLE_NS_ASSERTIONS = NO;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.4;
-				MTL_ENABLE_DEBUG_INFO = NO;
-				SDKROOT = iphoneos;
-				TARGETED_DEVICE_FAMILY = "1,2";
-				VALIDATE_PRODUCT = YES;
-			};
-			name = Release;
-		};
-		529226FA1C85F68000C89379 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
-					"\"$(SRCROOT)/src\"",
-				);
-				INFOPLIST_FILE = testapp/Info.plist;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				WRAPPER_EXTENSION = app;
-			};
-			name = Debug;
-		};
-		529226FB1C85F68000C89379 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
-					"\"$(SRCROOT)/src\"",
-				);
-				INFOPLIST_FILE = testapp/Info.plist;
-				PRODUCT_NAME = "$(TARGET_NAME)";
-				WRAPPER_EXTENSION = app;
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		529226CD1C85F68000C89379 /* Build configuration list for PBXProject "testapp" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				529226F71C85F68000C89379 /* Debug */,
-				529226F81C85F68000C89379 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		529226F91C85F68000C89379 /* Build configuration list for PBXNativeTarget "testapp" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				529226FA1C85F68000C89379 /* Debug */,
-				529226FB1C85F68000C89379 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = 529226CA1C85F68000C89379 /* Project object */;
-}
diff --git a/admob/testapp/testapp/Images.xcassets/AppIcon.appiconset/Contents.json b/admob/testapp/testapp/Images.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index eeea76c2..00000000
--- a/admob/testapp/testapp/Images.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "40x40",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "40x40",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "60x60",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "iphone",
-      "size" : "60x60",
-      "scale" : "3x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "76x76",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "76x76",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "ipad",
-      "size" : "83.5x83.5",
-      "scale" : "2x"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  }
-}
\ No newline at end of file
diff --git a/admob/testapp/testapp/Images.xcassets/LaunchImage.launchimage/Contents.json b/admob/testapp/testapp/Images.xcassets/LaunchImage.launchimage/Contents.json
deleted file mode 100644
index a0ad363c..00000000
--- a/admob/testapp/testapp/Images.xcassets/LaunchImage.launchimage/Contents.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "images" : [
-    {
-      "orientation" : "portrait",
-      "idiom" : "ipad",
-      "extent" : "full-screen",
-      "minimum-system-version" : "7.0",
-      "scale" : "1x"
-    },
-    {
-      "orientation" : "landscape",
-      "idiom" : "ipad",
-      "extent" : "full-screen",
-      "minimum-system-version" : "7.0",
-      "scale" : "1x"
-    },
-    {
-      "orientation" : "portrait",
-      "idiom" : "ipad",
-      "extent" : "full-screen",
-      "minimum-system-version" : "7.0",
-      "scale" : "2x"
-    },
-    {
-      "orientation" : "landscape",
-      "idiom" : "ipad",
-      "extent" : "full-screen",
-      "minimum-system-version" : "7.0",
-      "scale" : "2x"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  }
-}
\ No newline at end of file
diff --git a/admob/testapp/testapp/Info.plist b/admob/testapp/testapp/Info.plist
deleted file mode 100644
index 3f0f944e..00000000
--- a/admob/testapp/testapp/Info.plist
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>GADApplicationIdentifier</key>
-	<string>YOUR_IOS_ADMOB_APP_ID</string>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>$(EXECUTABLE_NAME)</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.google.ios.admob.testapp</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>$(PRODUCT_NAME)</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleVersion</key>
-	<string>1</string>
-	<key>LSRequiresIPhoneOS</key>
-	<true/>
-	<key>UILaunchStoryboardName</key>
-	<string>LaunchScreen</string>
-</dict>
-</plist>
diff --git a/scripts/build_scripts/build_testapps.json b/scripts/build_scripts/build_testapps.json
index 7dc1d078..5b5ef2d1 100644
--- a/scripts/build_scripts/build_testapps.json
+++ b/scripts/build_scripts/build_testapps.json
@@ -1,18 +1,5 @@
 {
     "apis": [
-      {
-        "name": "admob",
-        "full_name": "FirebaseAdmob",
-        "bundle_id": "com.google.ios.admob.testapp",
-        "ios_target": "testapp",
-        "tvos_target": "",
-        "testapp_path": "admob/testapp",
-        "frameworks": [
-          "firebase_admob.xcframework",
-          "firebase.xcframework"
-        ],
-        "provision": "Google_Development.mobileprovision"
-      },
       {
         "name": "analytics",
         "full_name": "FirebaseAnalytics",
diff --git a/scripts/build_scripts/config_reader.py b/scripts/build_scripts/config_reader.py
index a24f5d7a..8979d5c3 100644
--- a/scripts/build_scripts/config_reader.py
+++ b/scripts/build_scripts/config_reader.py
@@ -37,19 +37,6 @@
         "firebase.framework"
       ],
       "provision": "Google_Development.mobileprovision"
-    },
-    {
-      "name": "admob",
-      "full_name": "FirebaseAdmob",
-      "bundle_id": "com.google.ios.admob.testapp",
-      "ios_target": "testapp",
-      "tvos_target": "",
-      "testapp_path": "admob/testapp",
-      "frameworks": [
-        "firebase_admob.framework",
-        "firebase.framework"
-      ],
-      "provision": "Google_Development.mobileprovision"
     }
   ],
   "dev_team": "ABCDEFGHIJK"
diff --git a/scripts/gha-encrypted/admob/GoogleService-Info.plist.gpg b/scripts/gha-encrypted/admob/GoogleService-Info.plist.gpg
deleted file mode 100644
index 7a8dd56b..00000000
Binary files a/scripts/gha-encrypted/admob/GoogleService-Info.plist.gpg and /dev/null differ
diff --git a/scripts/gha-encrypted/admob/google-services.json.gpg b/scripts/gha-encrypted/admob/google-services.json.gpg
deleted file mode 100644
index b62f63cb..00000000
Binary files a/scripts/gha-encrypted/admob/google-services.json.gpg and /dev/null differ