| # Android App to Run an IREE Bytecode Module |
| |
| This directory contains configuration to create an Android application that |
| executes a single IREE module as a native activity. |
| |
| Note that this app is **purely** for benchmarking/profiling IREE itself. |
| This is not the expected integration path for a real Android application, |
| for which we expect to provide proper Java API and build support. |
| |
| ## Native Activity |
| |
| The app uses Android [`NativeActivity`][native-activity] to bridge IREE core |
| libraries together with the Android system. Native activity allows one to |
| implement an Android Activity purely in C/C++. There are |
| [tutorials][native-activity-tutorial] and [examples][native-activity-example] |
| one can follow to learn about Native Activity. |
| |
| ## Android Studio |
| |
| This app does not contain Gradle configurations. The reason is that we need |
| to package both IREE native libraries and a specific VM module invocation |
| into the app. The procedure cannot be automated much by Android Studio; rather |
| one might need to copy files from different places, rename them, and wire up |
| the build. It's inconvenient. For a developer tool we would like to avoid |
| such friction and thus improve velocity. So a script, |
| [`build_apk.sh`](./build_apk.sh), is provided to automate the process. |
| |
| But the script itself requires an Android SDK/NDK installation structure that |
| matches Android Studio. So it's easier to just install Android Studio to |
| manage Android SDK/NDK. The script will use proper tools in Android SDK/NDK |
| to build and package the final APK file. |
| |
| ## Build the APK |
| |
| In general, we need to |
| |
| 1. Build the `iree_run_module_app` shared library following normal C++ build |
| process. |
| 1. Package the shared library together with an IREE VM FlatBuffer, its entry |
| function, input buffers, and the HAL driver into an Android app, following |
| a certain directory hierarchy. Specifically, |
| 1. Generate `AndroidManifest.xml` from the |
| [template](./AndroidManifest.xml.template) by providing the proper target |
| Android API level. |
| 1. Copy the VM FlatBuffer as `assets/module.vmfb`, write the entry function |
| input buffers, and HAL driver into `assets/entry_function.txt`, |
| `assets/inputs.txt`, and `assets/device.txt`, respectively. |
| 1. Copy the shared library under `lib/<android-abi>/`. |
| 1. Compile resources under [`res/`](./res) directory into an Android DEX |
| file. |
| 1. Package all of the above into an APK file. |
| 1. Properly align and sign the APK file. |
| |
| ## Run on Android |
| |
| When started on Android, the app will read the contents in `assets` to get the |
| VM FlatBuffer and invocation information and run it. |
| |
| [native-activity]: https://developer.android.com/reference/android/app/NativeActivity |
| [native-activity-example]: https://github.com/android/ndk-samples/tree/master/native-activity |
| [native-activity-tutorial]: https://medium.com/androiddevelopers/getting-started-with-c-and-android-native-activities-2213b402ffff |