blob: 9f7ae4d26b3d94f0d28858a417c9bcdfb9bed2b3 [file] [log] [blame] [view]
# 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