diff --git a/example/.gitignore b/example/.gitignore
new file mode 100644
index 0000000..1ffc05a
--- /dev/null
+++ b/example/.gitignore
@@ -0,0 +1,14 @@
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
+
+# Ignore Gradle local properties
+local.properties
+
+# Ignore Idea workspace files
+.idea
+
+# ignore cmake builds
+*.cxx
diff --git a/example/.run/assembleSubmissionSources.run.xml b/example/.run/assembleSubmissionSources.run.xml
new file mode 100644
index 0000000..b6f979e
--- /dev/null
+++ b/example/.run/assembleSubmissionSources.run.xml
@@ -0,0 +1,24 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="assembleSubmissionSources" type="GradleRunConfiguration" factoryName="Gradle">
+    <ExternalSystemSettings>
+      <option name="executionName" />
+      <option name="externalProjectPath" value="$PROJECT_DIR$/submission" />
+      <option name="externalSystemIdString" value="GRADLE" />
+      <option name="scriptParameters" value="" />
+      <option name="taskDescriptions">
+        <list />
+      </option>
+      <option name="taskNames">
+        <list>
+          <option value="assembleSubmissionSources" />
+        </list>
+      </option>
+      <option name="vmOptions" />
+    </ExternalSystemSettings>
+    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
+    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
+    <DebugAllEnabled>false</DebugAllEnabled>
+    <RunAsTest>false</RunAsTest>
+    <method v="2" />
+  </configuration>
+</component>
diff --git a/example/.run/assembleSubmissionZip.run.xml b/example/.run/assembleSubmissionZip.run.xml
new file mode 100644
index 0000000..f3edeeb
--- /dev/null
+++ b/example/.run/assembleSubmissionZip.run.xml
@@ -0,0 +1,24 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="assembleSubmissionZip" type="GradleRunConfiguration" factoryName="Gradle">
+    <ExternalSystemSettings>
+      <option name="executionName" />
+      <option name="externalProjectPath" value="$PROJECT_DIR$/submission" />
+      <option name="externalSystemIdString" value="GRADLE" />
+      <option name="scriptParameters" value="" />
+      <option name="taskDescriptions">
+        <list />
+      </option>
+      <option name="taskNames">
+        <list>
+          <option value="assembleSubmissionZip" />
+        </list>
+      </option>
+      <option name="vmOptions" />
+    </ExternalSystemSettings>
+    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
+    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
+    <DebugAllEnabled>false</DebugAllEnabled>
+    <RunAsTest>false</RunAsTest>
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/example/.run/autorepro_nonroot_arm64.run.xml b/example/.run/autorepro_nonroot_arm64.run.xml
new file mode 100644
index 0000000..b605143
--- /dev/null
+++ b/example/.run/autorepro_nonroot_arm64.run.xml
@@ -0,0 +1,11 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="autorepro_nonroot_arm64" type="JarApplication">
+    <option name="JAR_PATH" value="$PROJECT_DIR$/submission/build/test_suites_arm64/android-sts/tools/sts-tradefed.jar" />
+    <option name="PROGRAM_PARAMETERS" value="run commandAndExit autorepro-nonroot --log-level debug --log-level-display debug" />
+    <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH" />
+    <method v="2">
+      <option name="Gradle.BeforeRunTask" enabled="false" tasks="assembleAutoReproTradefed-test_suites_arm64" externalProjectPath="$PROJECT_DIR$/submission" vmOptions="" scriptParameters="" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/example/.run/autorepro_nonroot_x86_64.run.xml b/example/.run/autorepro_nonroot_x86_64.run.xml
new file mode 100644
index 0000000..257c1cc
--- /dev/null
+++ b/example/.run/autorepro_nonroot_x86_64.run.xml
@@ -0,0 +1,11 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="autorepro_nonroot_x86_64" type="JarApplication">
+    <option name="JAR_PATH" value="$PROJECT_DIR$/submission/build/test_suites_arm64/android-sts/tools/sts-tradefed.jar" />
+    <option name="PROGRAM_PARAMETERS" value="run commandAndExit autorepro-nonroot --log-level debug --log-level-display debug" />
+    <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH" />
+    <method v="2">
+      <option name="Gradle.BeforeRunTask" enabled="false" tasks="assembleAutoReproTradefed-test_suites_x86_64" externalProjectPath="$PROJECT_DIR$/submission" vmOptions="" scriptParameters="" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/example/.run/autorepro_root_arm64.run.xml b/example/.run/autorepro_root_arm64.run.xml
new file mode 100644
index 0000000..6a43191
--- /dev/null
+++ b/example/.run/autorepro_root_arm64.run.xml
@@ -0,0 +1,11 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="autorepro_root_arm64" type="JarApplication">
+    <option name="JAR_PATH" value="$PROJECT_DIR$/submission/build/test_suites_arm64/android-sts/tools/sts-tradefed.jar" />
+    <option name="PROGRAM_PARAMETERS" value="run commandAndExit autorepro-root --log-level debug --log-level-display debug" />
+    <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH" />
+    <method v="2">
+      <option name="Gradle.BeforeRunTask" enabled="false" tasks="assembleAutoReproTradefed-test_suites_arm64" externalProjectPath="$PROJECT_DIR$/submission" vmOptions="" scriptParameters="" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/example/.run/autorepro_root_x86_64.run.xml b/example/.run/autorepro_root_x86_64.run.xml
new file mode 100644
index 0000000..2f628fa
--- /dev/null
+++ b/example/.run/autorepro_root_x86_64.run.xml
@@ -0,0 +1,11 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="autorepro_root_x86_64" type="JarApplication">
+    <option name="JAR_PATH" value="$PROJECT_DIR$/submission/build/test_suites_arm64/android-sts/tools/sts-tradefed.jar" />
+    <option name="PROGRAM_PARAMETERS" value="run commandAndExit autorepro-root --log-level debug --log-level-display debug" />
+    <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH" />
+    <method v="2">
+      <option name="Gradle.BeforeRunTask" enabled="false" tasks="assembleAutoReproTradefed-test_suites_x86_64" externalProjectPath="$PROJECT_DIR$/submission" vmOptions="" scriptParameters="" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/example/.run/copyInvocationResultsToSubmission.run.xml b/example/.run/copyInvocationResultsToSubmission.run.xml
new file mode 100644
index 0000000..45ee95c
--- /dev/null
+++ b/example/.run/copyInvocationResultsToSubmission.run.xml
@@ -0,0 +1,24 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="copyInvocationResultsToSubmission" type="GradleRunConfiguration" factoryName="Gradle">
+    <ExternalSystemSettings>
+      <option name="executionName" />
+      <option name="externalProjectPath" value="$PROJECT_DIR$/submission" />
+      <option name="externalSystemIdString" value="GRADLE" />
+      <option name="scriptParameters" value="" />
+      <option name="taskDescriptions">
+        <list />
+      </option>
+      <option name="taskNames">
+        <list>
+          <option value="copyInvocationResultsToSubmission" />
+        </list>
+      </option>
+      <option name="vmOptions" />
+    </ExternalSystemSettings>
+    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
+    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
+    <DebugAllEnabled>false</DebugAllEnabled>
+    <RunAsTest>false</RunAsTest>
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/example/gradle.properties b/example/gradle.properties
new file mode 100644
index 0000000..cc18a0c
--- /dev/null
+++ b/example/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/example/gradle/wrapper/gradle-wrapper.jar b/example/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..033e24c
--- /dev/null
+++ b/example/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/example/gradle/wrapper/gradle-wrapper.properties b/example/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..bb5a3af
--- /dev/null
+++ b/example/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,8 @@
+#Wed Aug 07 16:22:12 UTC 2024
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/example/gradlew b/example/gradlew
new file mode 100755
index 0000000..fcb6fca
--- /dev/null
+++ b/example/gradlew
@@ -0,0 +1,248 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# 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
+#
+#      https://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.
+#
+
+##############################################################################
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+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
+    if ! command -v java >/dev/null 2>&1
+    then
+        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
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC3045
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC3045
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command;
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+#     shell script including quotes and variable substitutions, so put them in
+#     double quotes to make sure that they get re-expanded; and
+#   * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+    die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/example/gradlew.bat b/example/gradlew.bat
new file mode 100644
index 0000000..6689b85
--- /dev/null
+++ b/example/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@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
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@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="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+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 execute
+
+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
+
+: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 %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 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!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/example/settings.gradle.kts b/example/settings.gradle.kts
new file mode 100644
index 0000000..c9b346f
--- /dev/null
+++ b/example/settings.gradle.kts
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * 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.
+ */
+
+// repositories of plugins
+pluginManagement {
+    repositories {
+        mavenLocal()
+        gradlePluginPortal()
+        google()
+        mavenCentral()
+    }
+}
+
+// repositories of project dependencies
+dependencyResolutionManagement {
+    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
+plugins {
+    // Apply the foojay-resolver plugin to allow automatic download of JDKs
+    id("org.gradle.toolchains.foojay-resolver-convention") version "0.4.0"
+    id("com.android.security.autorepro.submission") version "1.0.0-alpha1" apply false
+}
+
+rootProject.name = "autorepro-example"
+
+// glob and include gradle projects
+fileTree(rootDir) {
+        // only include subprojects of ":submission"
+        include("submission/**/build.gradle*")
+        // don't include subprojects from build directories
+        exclude("**/build")
+    }
+    .forEach {
+        val path = rootDir.toPath().relativize(it.toPath().getParent())
+        val gradlePath = ":${path.joinToString(":")}"
+        include(gradlePath)
+    }
diff --git a/example/submission/appTest/build.gradle.kts b/example/submission/appTest/build.gradle.kts
new file mode 100644
index 0000000..ee315d0
--- /dev/null
+++ b/example/submission/appTest/build.gradle.kts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * 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.
+ */
+plugins { id("com.android.security.autorepro.apptest") }
+
+// Note: the Gradle package name is appended to the namespace "com.android.security"
+appTest {}
diff --git a/example/submission/appTest/src/main/AndroidManifest.xml b/example/submission/appTest/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..13807ea
--- /dev/null
+++ b/example/submission/appTest/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2024 The Android Open Source Project
+
+  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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    android:versionCode="1"
+    android:versionName="1.0">
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="${applicationId}" />
+    <application
+        android:supportsRtl="true">
+        <activity
+            android:name=".PocActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/example/submission/appTest/src/main/java/com/android/security/DeviceTest.java b/example/submission/appTest/src/main/java/com/android/security/DeviceTest.java
new file mode 100644
index 0000000..f825625
--- /dev/null
+++ b/example/submission/appTest/src/main/java/com/android/security/DeviceTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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.android.security;
+
+import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.util.Log;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * An example device test that starts an activity and uses broadcasts to wait for the artifact
+ * proving vulnerability
+ */
+@RunWith(AndroidJUnit4.class)
+public class DeviceTest {
+    private static final String TAG = DeviceTest.class.getSimpleName();
+    Context mContext;
+
+    /** Test broadcast action */
+    public static final String ACTION_BROADCAST = "action_security_test_broadcast";
+
+    /** Broadcast intent extra name for artifacts */
+    public static final String INTENT_ARTIFACT = "artifact";
+
+    /** Device test */
+    @Test
+    public void testDeviceSideMethod() throws Exception {
+        mContext = getApplicationContext();
+
+        AtomicReference<String> actual = new AtomicReference<>();
+        final Semaphore broadcastReceived = new Semaphore(0);
+        BroadcastReceiver broadcastReceiver =
+                new BroadcastReceiver() {
+                    @Override
+                    public void onReceive(Context context, Intent intent) {
+                        try {
+                            if (!intent.getAction().equals(ACTION_BROADCAST)) {
+                                Log.i(
+                                        TAG,
+                                        String.format(
+                                                "got a broadcast that we didn't expect: %s",
+                                                intent.getAction()));
+                            }
+                            actual.set(intent.getStringExtra(INTENT_ARTIFACT));
+                            broadcastReceived.release();
+                        } catch (Exception e) {
+                            Log.e(TAG, "got an exception when handling broadcast", e);
+                        }
+                    }
+                };
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ACTION_BROADCAST);
+        mContext.registerReceiver(broadcastReceiver, filter, Context.RECEIVER_EXPORTED);
+
+        // start the target app
+        try {
+            Log.d(TAG, "starting local activity");
+            Intent newActivityIntent = new Intent(mContext, PocActivity.class);
+            newActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            // this could be startActivityForResult, but is generic for illustrative purposes
+            mContext.startActivity(newActivityIntent);
+        } finally {
+            getInstrumentation().getUiAutomation().dropShellPermissionIdentity();
+        }
+        assertTrue(
+                "Timed out when getting result from other activity",
+                broadcastReceived.tryAcquire(/* TIMEOUT_MS */ 5000, TimeUnit.MILLISECONDS));
+        assertEquals("The target artifact should have been 'secure'", "secure", actual.get());
+    }
+}
diff --git a/example/submission/appTest/src/main/java/com/android/security/PocActivity.java b/example/submission/appTest/src/main/java/com/android/security/PocActivity.java
new file mode 100644
index 0000000..9f2e26d
--- /dev/null
+++ b/example/submission/appTest/src/main/java/com/android/security/PocActivity.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.android.security;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+public class PocActivity extends Activity {
+    private static final String TAG = PocActivity.class.getSimpleName();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        Log.d(TAG, "poc activity started");
+
+        // Collect the artifact representing vulnerability here.
+        // Change this to whatever type best fits the vulnerable artifact; consider using a bundle
+        // if there are multiple artifacts necessary to prove the security vulnerability.
+        String artifact = "vulnerable";
+
+        Intent vulnerabilityDescriptionIntent = new Intent(DeviceTest.ACTION_BROADCAST);
+        vulnerabilityDescriptionIntent.putExtra(DeviceTest.INTENT_ARTIFACT, artifact);
+        this.sendBroadcast(vulnerabilityDescriptionIntent);
+    }
+}
diff --git a/example/submission/appTest/src/main/res/layout/activity_main.xml b/example/submission/appTest/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..0edbaae
--- /dev/null
+++ b/example/submission/appTest/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2024 The Android Open Source Project
+
+  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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+</LinearLayout>
+
diff --git a/example/submission/appTest2/build.gradle.kts b/example/submission/appTest2/build.gradle.kts
new file mode 100644
index 0000000..cf91cdf
--- /dev/null
+++ b/example/submission/appTest2/build.gradle.kts
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * 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.
+ */
+plugins { id("com.android.security.autorepro.apptest") }
+
+appTest {}
diff --git a/example/submission/appTest2/src/main/AndroidManifest.xml b/example/submission/appTest2/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..13807ea
--- /dev/null
+++ b/example/submission/appTest2/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2024 The Android Open Source Project
+
+  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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    android:versionCode="1"
+    android:versionName="1.0">
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="${applicationId}" />
+    <application
+        android:supportsRtl="true">
+        <activity
+            android:name=".PocActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/example/submission/appTest2/src/main/java/com/android/security/PocActivity.java b/example/submission/appTest2/src/main/java/com/android/security/PocActivity.java
new file mode 100644
index 0000000..d2e9d4d
--- /dev/null
+++ b/example/submission/appTest2/src/main/java/com/android/security/PocActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.android.security;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+public class PocActivity extends Activity {
+    private static final String TAG = PocActivity.class.getSimpleName();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        Log.d(TAG, "poc activity started");
+    }
+}
diff --git a/example/submission/appTest2/src/main/res/layout/activity_main.xml b/example/submission/appTest2/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..0edbaae
--- /dev/null
+++ b/example/submission/appTest2/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2024 The Android Open Source Project
+
+  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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+</LinearLayout>
+
diff --git a/example/submission/build.gradle.kts b/example/submission/build.gradle.kts
new file mode 100644
index 0000000..9f62006
--- /dev/null
+++ b/example/submission/build.gradle.kts
@@ -0,0 +1,26 @@
+plugins { id("com.android.security.autorepro.submission") }
+
+fun getSubprojects(): List<Project> {
+    // glob for gradle direct subprojects
+    return fileTree(projectDir) { include("*/build.gradle*") }
+        .map {
+            val path = projectDir.toPath().relativize(it.toPath().getParent())
+            val gradlePath = path.toString().replace('/', ':')
+            gradlePath
+        }
+        .filter({
+            // filter out self build.gradle*
+            !it.isEmpty()
+        })
+        .map { project(it) }
+}
+
+// NOTE! all AutoRepro dependencies must be subprojects
+dependencies {
+    // Automatically add each subproject as an AutoRepro Test Resource
+    getSubprojects().forEach { testResource(it) }
+}
+
+submission {
+    // Please configure your submission attributes here
+}
diff --git a/example/submission/hostTest/build.gradle.kts b/example/submission/hostTest/build.gradle.kts
new file mode 100644
index 0000000..7222155
--- /dev/null
+++ b/example/submission/hostTest/build.gradle.kts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * 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.
+ */
+plugins { id("com.android.security.autorepro.javahosttest") }
diff --git a/example/submission/hostTest/src/main/java/com/android/security/autorepro_placeholder/HostsideTest.java b/example/submission/hostTest/src/main/java/com/android/security/autorepro_placeholder/HostsideTest.java
new file mode 100644
index 0000000..3d936ae
--- /dev/null
+++ b/example/submission/hostTest/src/main/java/com/android/security/autorepro_placeholder/HostsideTest.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.android.security.autorepro_placeholder;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.sts.common.CommandUtil;
+import com.android.sts.common.MallocDebug;
+import com.android.sts.common.NativePoc;
+import com.android.sts.common.NativePocCrashAsserter;
+import com.android.sts.common.NativePocStatusAsserter;
+import com.android.sts.common.ProcessUtil;
+import com.android.sts.common.RegexUtils;
+import com.android.sts.common.SystemUtil;
+import com.android.sts.common.UserUtils;
+import com.android.sts.common.tradefed.testtype.NonRootSecurityTestCase;
+import com.android.sts.common.util.TombstoneUtils;
+import com.android.tradefed.device.IFileEntry;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class HostsideTest extends NonRootSecurityTestCase {
+
+    // Set from the Gradle project for the AppTest plugins.
+    static final String TEST_APP = "appTest_AutoReproPlaceholder.apk";
+    // The Gradle project name is appended to the namespace "com.android.security".
+    static final String TEST_PKG = "com.android.security.appTest_AutoReproPlaceholder";
+    // The class name will be different from the application ID but will match the source code.
+    static final String TEST_CLASS = "com.android.security.DeviceTest";
+
+    /** An app test, which uses this host Java test to launch an Android instrumented test */
+    @Test
+    public void testWithApp() throws Exception {
+        ITestDevice device = getDevice();
+        assertTrue("could not disable root", device.disableAdbRoot());
+        uninstallPackage(device, TEST_PKG);
+
+        installPackage(TEST_APP);
+        runDeviceTests(TEST_PKG, TEST_CLASS, "testDeviceSideMethod");
+    }
+
+    /**
+     * A native PoC test, which uses this host Java test to push an executable with resources and
+     * execute with environment variables and more. This API uses a "NativePocAsserter" that handles
+     * the most common ways to retrieve data from the native PoC. It can be overloaded to handle the
+     * specific side-effect that your PoC generates.
+     */
+    @Test
+    public void testWithNativePoc() throws Exception {
+        NativePoc.builder()
+                // the name of the PoC
+                .pocName("ndkTest_AutoReproPlaceholder")
+                // extra files pushed to the device
+                .resources("AutoReproPlaceholder/res.txt")
+                // command-line arguments for the PoC
+                .args("res.txt", "vulnerable")
+                // other options allow different linker paths for library shims
+                .useDefaultLdLibraryPath(true)
+                // test ends with ASSUMPTION_FAILURE if not EXIT_OK
+                .assumePocExitSuccess(true)
+                // run code after the PoC is executed for cleanup or other
+                .after(r -> getDevice().executeShellV2Command("ls -l /"))
+                // fail if the poc returns exit status 113
+                .asserter(NativePocStatusAsserter.assertNotVulnerableExitCode())
+                .build()
+                .run(this);
+    }
+
+    /** Run native PoCs with Malloc Debug memory checking enabled */
+    @Test
+    public void testWithMallocDebug() throws Exception {
+        // Set up Malloc Debug for this test, which may be required if the vulnerability needs
+        // memory checking to crash. This is useful when an ASan/HWASan/MTE build is not available.
+        // https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.md
+        // Note: enabling malloc debug requires root but it can be turned off after
+        assumeTrue("could not enable root for malloc debug", getDevice().enableAdbRoot());
+        try (AutoCloseable mallocDebug =
+                MallocDebug.withLibcMallocDebugOnNewProcess(
+                        getDevice(),
+                        "backtrace guard", // malloc debug options
+                        "ndkTest_AutoReproPlaceholder" // process name
+                        )) {
+            assumeTrue("could not disable root", getDevice().disableAdbRoot());
+
+            // run a native PoC
+            NativePoc.builder()
+                    .pocName("ndkTest_AutoReproPlaceholder")
+                    .args("memory_corrupt")
+                    .build() // add more as needed
+                    .run(this);
+        }
+    }
+
+    /** Run code after applying device settings */
+    @Test
+    public void testWithSetting() throws Exception {
+        // allow reflection, which is not a security boundary
+        try (AutoCloseable setting =
+                SystemUtil.withSetting(getDevice(), "global", "hidden_api_policy", "1")) {
+            // run app
+            installPackage(TEST_APP);
+            runDeviceTests(TEST_PKG, TEST_CLASS, "testDeviceSideMethod");
+        }
+    }
+
+    /** Link a native PoC against a vulnerable system library */
+    @Test
+    public void testWithVulnerableLibrary() throws Exception {
+        // get the path of the vulnerable library
+        assumeTrue("could not enable root to find library path", getDevice().enableAdbRoot());
+        Optional<IFileEntry> libFileEntry =
+                ProcessUtil.findFileLoadedByProcess(
+                        getDevice(),
+                        "mediaserver",
+                        Pattern.compile(Pattern.quote("libmediaplayerservice.so")));
+        assumeTrue("shared library not loaded by target process", libFileEntry.isPresent());
+        assumeTrue("could not disable root", getDevice().disableAdbRoot());
+
+        // attack the service
+        NativePoc.builder()
+                .pocName("ndkTest_AutoReproPlaceholder")
+                // pass the library path to the PoC
+                .args(libFileEntry.get().getFullPath())
+                .assumePocExitSuccess(false) // example returns EXIT_FAILURE if not enough args
+                .asserter(
+                        NativePocCrashAsserter.assertNoCrash(
+                                new TombstoneUtils.Config()
+                                        // Because the vulnerability is in the shared library, the
+                                        // process crash is the PoC.
+                                        .setProcessPatterns(
+                                                Pattern.compile("ndkTest_AutoReproPlaceholder"))))
+                .build()
+                .run(this);
+    }
+
+    /** Match a log against a known vulnerable pattern regex */
+    @Test
+    public void testWithLogMessage() throws Exception {
+        // this is only for dmesg/logcat messages that are not controlled by the test.
+
+        // attack the device, which can be native poc, echo to socket, send intent, app, etc
+        NativePoc.builder()
+                .pocName("ndkTest_AutoReproPlaceholder")
+                .assumePocExitSuccess(false) // example returns EXIT_FAILURE if no args
+                .build() // add more as needed
+                .run(this);
+
+        assumeTrue("could not enable root to collect dmesg", getDevice().enableAdbRoot());
+        String dmesg = CommandUtil.runAndCheck(getDevice(), "dmesg -c").getStdout();
+        assumeTrue("could not disable root", getDevice().disableAdbRoot());
+
+        // It's preferred to use this for matching text because the regex has a timeout to
+        // protect against catastrophic backtracking. It also formats the test assert message.
+        RegexUtils.assertNotContainsMultiline(
+                "Call trace:.*?__arm_lpae_unmap.*?kgsl_iommu_unmap", dmesg);
+    }
+
+    /** Install and run an app as a secondary user */
+    @Test
+    public void testWithSecondaryUser() throws Exception {
+        try (AutoCloseable su = new UserUtils.SecondaryUser(getDevice()).withUser()) {
+            installPackage(TEST_APP);
+            runDeviceTests(TEST_PKG, TEST_CLASS, "testDeviceSideMethod");
+        }
+    }
+}
diff --git a/example/submission/hostTest/src/main/resources/AutoReproPlaceholder/res.txt b/example/submission/hostTest/src/main/resources/AutoReproPlaceholder/res.txt
new file mode 100644
index 0000000..330ce8c
--- /dev/null
+++ b/example/submission/hostTest/src/main/resources/AutoReproPlaceholder/res.txt
@@ -0,0 +1 @@
+Android Security
diff --git a/example/submission/ndkTest/CMakeLists.txt b/example/submission/ndkTest/CMakeLists.txt
new file mode 100644
index 0000000..0f84092
--- /dev/null
+++ b/example/submission/ndkTest/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.22.1)
+
+project("ndkTest")
+
+add_executable(
+        ndkTest
+        src/native-sample.cpp
+)
+
+find_library( # Sets the name of the path variable.
+        log-lib
+        log)
diff --git a/example/submission/ndkTest/build.gradle.kts b/example/submission/ndkTest/build.gradle.kts
new file mode 100644
index 0000000..60ddb7a
--- /dev/null
+++ b/example/submission/ndkTest/build.gradle.kts
@@ -0,0 +1,9 @@
+plugins {
+    id("com.android.security.autorepro.ndktest")
+}
+
+nativeTest {
+    minSdk = 33
+    targetSdk = 33
+    compileSdk = 33
+}
diff --git a/example/submission/ndkTest/src/native-sample.cpp b/example/submission/ndkTest/src/native-sample.cpp
new file mode 100644
index 0000000..a3eb1ab
--- /dev/null
+++ b/example/submission/ndkTest/src/native-sample.cpp
@@ -0,0 +1,40 @@
+#include <iostream>
+#include <fstream>
+
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+#define EXIT_VULNERABLE 113
+
+int main(int argc, char *argv[]) {
+    if (argc == 2) {
+        std::string expected = "memory_corrupt";
+        if (expected.compare(argv[1]) != 0) {
+            std::cout << "unknown command" << std::endl;
+            return EXIT_FAILURE;
+        }
+        std::cout << "attempting a memory access violation" << std::endl;
+        *((unsigned int*)0x00000074726630b0) = 0xBAD;
+        return EXIT_SUCCESS;
+    }
+
+    if (argc != 3) {
+        std::cout << "unknown commands" << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    std::ifstream f(argv[1]);
+    if (f.is_open()) {
+        // the host test can either check exit code or stdout
+        std::cout << "Hello " << f.rdbuf() << "! " << argv[2] << std::endl;
+        // please don't use a test-controlled value in a security report
+        std::string expected = "secure";
+        if (expected.compare(argv[2]) != 0) {
+            return EXIT_VULNERABLE;
+        } else {
+            return EXIT_SUCCESS;
+        }
+    } else {
+        std::cout << "could not open file" << std::endl;
+        return EXIT_FAILURE;
+    }
+}
