diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e054c15..f89093b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ on: branches: [ main, devel, 'release/**' ] paths: - 'wildedge/**' - - 'sample/**' + - 'samples/**' - 'gradle/**' - 'gradle.properties' - 'detekt.yml' @@ -14,7 +14,7 @@ on: branches: [ main, devel ] paths: - 'wildedge/**' - - 'sample/**' + - 'samples/**' - 'gradle/**' - 'gradle.properties' - 'detekt.yml' @@ -92,3 +92,27 @@ jobs: with: name: detekt-results path: build/reports/detekt/ + + proguard: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + + - uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: true + + - name: Build release APK + run: ./gradlew :samples:image-classification:assembleRelease --no-daemon + + - name: Upload release APK + if: always() + uses: actions/upload-artifact@v4 + with: + name: release-apk + path: samples/image-classification/build/outputs/apk/release/ diff --git a/samples/image-classification/build.gradle.kts b/samples/image-classification/build.gradle.kts index 5a0c7be..f2d3529 100644 --- a/samples/image-classification/build.gradle.kts +++ b/samples/image-classification/build.gradle.kts @@ -25,6 +25,16 @@ android { resValue("string", "wildedge_dsn", localProps.getProperty("wildedge.dsn", "")) } + buildTypes { + release { + // No extra rules: relies on the library's consumer-rules.pro. + // If R8 strips or renames anything the app references, the build fails. + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + signingConfig = signingConfigs.getByName("debug") + } + } + buildFeatures { viewBinding = true } diff --git a/samples/image-classification/proguard-rules.pro b/samples/image-classification/proguard-rules.pro new file mode 100644 index 0000000..a3536d7 --- /dev/null +++ b/samples/image-classification/proguard-rules.pro @@ -0,0 +1,7 @@ +# compileOnly framework dependencies used by example files included via sourceSets. +# These classes are not in the APK at runtime, so suppress R8 missing-class warnings. +-dontwarn com.google.ai.client.generativeai.** +-dontwarn com.google.ai.edge.litertlm.** +-dontwarn ai.onnxruntime.** +-dontwarn com.google.android.gms.tasks.** +-dontwarn com.google.mlkit.** diff --git a/wildedge/consumer-rules.pro b/wildedge/consumer-rules.pro index e69de29..6ad8c98 100644 --- a/wildedge/consumer-rules.pro +++ b/wildedge/consumer-rules.pro @@ -0,0 +1,38 @@ +# WildEdge Android SDK — consumer ProGuard / R8 rules. +# Gradle merges this file into the host app's minification config automatically. + +# ---- Core API ---- +-keep class dev.wildedge.sdk.WildEdge { *; } +-keep interface dev.wildedge.sdk.WildEdgeClient { *; } +-keep class dev.wildedge.sdk.ModelHandle { public *; } +-keep class dev.wildedge.sdk.ModelInfo { *; } +-keep enum dev.wildedge.sdk.InputModality { *; } +-keep enum dev.wildedge.sdk.OutputModality { *; } +-keep class dev.wildedge.sdk.Accelerator { *; } +-keep class dev.wildedge.sdk.FeedbackType { *; } +-keep class dev.wildedge.sdk.FeedbackType$* { *; } +-keep class dev.wildedge.sdk.MemoryWarningLevel { *; } +-keep class dev.wildedge.sdk.MemoryWarningLevel$* { *; } +-keep enum dev.wildedge.sdk.SpanKind { *; } +-keep enum dev.wildedge.sdk.SpanStatus { *; } +-keep class dev.wildedge.sdk.Span { *; } +-keep class dev.wildedge.sdk.SpanContext { *; } + +# ContentProvider used for auto-init — Android instantiates it by class name from the manifest. +-keep class dev.wildedge.sdk.WildEdgeInitProvider + +# ---- Event meta classes ---- +# These data classes are constructed by host app code and passed to trackInference via toMap(). +-keep class dev.wildedge.sdk.events.** { *; } + +# ---- Integration decorators ---- +-keep class dev.wildedge.sdk.integrations.TFLiteDecorator { *; } +-keep class dev.wildedge.sdk.integrations.OrtDecorator { *; } +-keep class dev.wildedge.sdk.integrations.LiteRtEngineDecorator { *; } +-keep class dev.wildedge.sdk.integrations.PlayServicesTfliteDecorator { *; } + +# ---- Kotlin extension functions ---- +# Kotlin compiles file-level functions to static methods on a class named after the file (*Kt). +# Without these rules, R8 renames or removes the classes and all extension calls break. +-keep class dev.wildedge.sdk.*Kt { *; } +-keep class dev.wildedge.sdk.integrations.*Kt { *; }