aboutsummaryrefslogtreecommitdiff
path: root/examples/ex1_standalone_app/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'examples/ex1_standalone_app/README.md')
-rw-r--r--examples/ex1_standalone_app/README.md108
1 files changed, 108 insertions, 0 deletions
diff --git a/examples/ex1_standalone_app/README.md b/examples/ex1_standalone_app/README.md
new file mode 100644
index 0000000..5d68e34
--- /dev/null
+++ b/examples/ex1_standalone_app/README.md
@@ -0,0 +1,108 @@
+# Standalone Snippet App Example
+
+This tutorial shows you how to create a standalone Mobly snippet app. To create
+a snippet app that controls (instruments) another app under test, please see
+[Example 2](../ex2_espresso/README.md).
+
+## Tutorial
+
+1. Use Android Studio to create a new app project.
+
+1. Link against Mobly Snippet Lib in your `build.gradle` file
+
+ ```
+ dependencies {
+ implementation 'com.google.android.mobly:mobly-snippet-lib:1.3.1'
+ }
+ ```
+
+1. Write a Java class implementing `Snippet` and add methods to trigger the
+ behaviour that you want. Annotate them with `@Rpc`
+
+ ```java
+ package com.my.app;
+ ...
+ public class ExampleSnippet implements Snippet {
+ @Rpc(description='Returns a string containing the given number.')
+ public String getFoo(Integer input) {
+ return "foo " + input;
+ }
+
+ @Override
+ public void shutdown() {}
+ }
+ ```
+
+1. Add any classes that implement the `Snippet` interface in your
+ `AndroidManifest.xml` application section as `meta-data`
+
+ ```xml
+ <manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.my.app">
+ <application>
+ <meta-data
+ android:name="mobly-snippets"
+ android:value="com.my.app.test.MySnippet1,
+ com.my.app.test.MySnippet2" />
+ ...
+ ```
+
+
+1. Add an `instrumentation` tag to your `AndroidManifest.xml` so that the
+ framework can launch your server through an `instrument` command.
+
+ ```xml
+ <manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.my.app">
+ <application>...</application>
+ <instrumentation
+ android:name="com.google.android.mobly.snippet.ServerRunner"
+ android:targetPackage="com.my.app" />
+ </manifest>
+ ```
+
+1. Build your apk and install it on your phone
+
+1. In your Mobly python test, connect to your snippet .apk in `setup_class`
+
+ ```python
+ class HelloWorldTest(base_test.BaseTestClass):
+ def setup_class(self):
+ self.ads = self.register_controller(android_device)
+ self.dut1 = self.ads[0]
+ self.dut1.load_snippet(name='snippet', package='com.my.app.test')
+ ```
+
+6. Invoke your needed functionality within your test
+
+ ```python
+ def test_get_foo(self):
+ actual_foo = self.dut1.snippet.getFoo(5)
+ asserts.assert_equal("foo 5", actual_foo)
+ ```
+
+## Running the example code
+
+This folder contains a fully working example of a standalone snippet apk.
+
+1. Compile the example
+
+ ./gradlew examples:ex1_standalone_app:assembleDebug
+
+1. Install the apk on your phone
+
+ adb install -r ./examples/ex1_standalone_app/build/outputs/apk/debug/ex1_standalone_app-debug.apk
+
+1. Use `snippet_shell` from mobly to trigger `getFoo()`:
+
+ snippet_shell.py com.google.android.mobly.snippet.example1
+
+ >>> print(s.help())
+ Known methods:
+ getBar(String) returns String // Returns the given string with the prefix "bar"
+ getFoo(Integer) returns String // Returns the given integer with the prefix "foo"
+
+ >>> s.getFoo(5)
+ u'foo 5'