This repo is dedicated to showcase the KMP usage with on-device model and GEN AI. It forked the Pexels as a template to demonstrate the basic KMP workflow and then link to a new AI chat screen to demonstrate the on-device model capability.
It's the sample project for my speech on Google I/O Extended XiaMen and GuangZhou 2024.
Take below steps to set up the repo:
- Follow the original Pexels's README to setup the KMP dependencies including JDK 17, Android Studio (with Android SDK), XCode (with iOS SDK) and Cocoapods.
- Download 2 models, gemma-1.1-2b-it-gpu-int4 and gemma-1.1-2b-it-cpu-int8, from Kaggle respectively.
- Execute below command to push models to Android device respectively (must be physical device)
adb push /the/path/to/gemma-2b-it-gpu-int4.bin data/local/tmp/llm/ - Move models to iOS project respectively by dragging the model to the "iosApp" target and select "create folder reference".
- Open the project via Android Studio, create a
local.properties, put the android sdk path and cocoapods executable path.
sdk.dir=/Users/xxxx/Library/Android/sdk
kotlin.apple.cocoapods.bin=/opt/homebrew/lib/ruby/gems/3.3.0/bin/pod
- You can run the Android target just like normal application, and iOS target within the Android Studio via Kotlin Multiplatform IDE Plugin or the XCode running button. The sample enables Android and iOS only since the llm inference of mediapipe is only available on Android/iOS/Web, you can implement the web version by yourself.
A multiplatform client for Pexels photos, powered by Compose Multiplatform
| Platform | Supported | Screenshot |
|---|---|---|
| Desktop(Linux, Windows, macOS) | ✅ | |
| Web | ✅ | |
| iOS | ✅ | |
| Android | ✅ |
You can download prebuilt app file here
Web version: https://linroid.github.io/Pexels/
- Pagination
- Pull to refresh
- Adaptive UI
- Photo zoom in and zoom out
- Transition
- Cached photo list data
- ktor: A multiplatform asynchronous HTTP client, which allows you to make requests and handle responses.
- kotlinx.serialization: A multiplatform JSON serialization library.
- koin: A pragmatic lightweight dependency injection framework for Kotlin & Kotlin Multiplatform.
- Voyager: A pragmatic navigation library for Compose.
- Build Config: A plugin for generating BuildConstants.
- KStore: A tiny Kotlin multiplatform library that assists in saving and restoring objects to and from disk.
- Napier: A logger library for Kotlin Multiplatform.
- coil: Image loading for Compose Multiplatform.
PexelsApiTestObjectStoreTest
- check your system with KDoctor
- install JDK 17 or higher on your machine
- add
local.propertiesfile to the project root and set a path to Android SDK there
To run the application on android device/emulator:
- open project in Android Studio and run imported android run configuration
To build the application bundle:
- run
./gradlew :composeApp:assembleDebug - find
.apkfile incomposeApp/build/outputs/apk/debug/composeApp-debug.apkRun android simulator UI tests:./gradlew :composeApp:pixel5Check
Run the desktop application: ./gradlew :composeApp:run
Run desktop UI tests: ./gradlew :composeApp:jvmTest
To run the application on iPhone device/simulator:
- Open
iosApp/iosApp.xcprojectin Xcode and run standard configuration - Or use Kotlin Multiplatform Mobile plugin for Android Studio
Run iOS simulator UI tests:
./gradlew :composeApp:iosSimulatorArm64Test
Run the browser application: ./gradlew :composeApp:wasmJsBrowserDevelopmentRun --continue
Run browser UI tests: ./gradlew :composeApp:wasmJsBrowserTest