What does the error "Failed resolution of: Lorg/tensorflow/lite/gpu/GpuDelegateFactory$Options" mean?

Viewed 38

I'm trying to run a TensorflowLite object detection app with custom model on emulator (Pixel_2_API_30) in Android Studio. Earlier I tried to run the app on real device (Redmi Note 5) and everything worked fine. When I launch on virtual device firstly I see the background of my MainActivity and then everything disappears. I don't get any errors. In order to find the error log I had to detele filters. Here is the error:

2022-09-17 15:30:45.849 8131-8131/org.tensorflow.lite.examples.detection E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.tensorflow.lite.examples.detection, PID: 8131
    java.lang.NoClassDefFoundError: Failed resolution of: Lorg/tensorflow/lite/gpu/GpuDelegateFactory$Options;
        at org.tensorflow.lite.gpu.GpuDelegate.<init>(GpuDelegate.java:52)
        at org.tensorflow.lite.examples.detection.tflite.YoloV4Classifier.create(YoloV4Classifier.java:106)
        at org.tensorflow.lite.examples.detection.MainActivity.initBox(MainActivity.java:556)
        at org.tensorflow.lite.examples.detection.MainActivity.onCreate(MainActivity.java:172)
        at android.app.Activity.performCreate(Activity.java:8000)
        at android.app.Activity.performCreate(Activity.java:7984)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.tensorflow.lite.gpu.GpuDelegateFactory$Options" on path: DexPathList[[zip file "/data/app/~~RuidL0T-Xrm76Ba2iYwkEg==/org.tensorflow.lite.examples.detection-j7P9_Ul8AM0EKw12bQCN8g==/base.apk"],nativeLibraryDirectories=[/data/app/~~RuidL0T-Xrm76Ba2iYwkEg==/org.tensorflow.lite.examples.detection-j7P9_Ul8AM0EKw12bQCN8g==/lib/x86, /data/app/~~RuidL0T-Xrm76Ba2iYwkEg==/org.tensorflow.lite.examples.detection-j7P9_Ul8AM0EKw12bQCN8g==/base.apk!/lib/x86, /system/lib, /system_ext/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at org.tensorflow.lite.gpu.GpuDelegate.<init>(GpuDelegate.java:52) 
        at org.tensorflow.lite.examples.detection.tflite.YoloV4Classifier.create(YoloV4Classifier.java:106) 
        at org.tensorflow.lite.examples.detection.MainActivity.initBox(MainActivity.java:556) 
        at org.tensorflow.lite.examples.detection.MainActivity.onCreate(MainActivity.java:172) 
        at android.app.Activity.performCreate(Activity.java:8000) 
        at android.app.Activity.performCreate(Activity.java:7984) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

Here is my manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.tensorflow.lite.examples.detection">

    <uses-sdk />

    <uses-permission android:name="android.permission.CAMERA" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/tfe_od_app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.ObjectDetection">
        <activity
            android:name=".CalculationActivity"
            android:exported="false"
            android:parentActivityName=".AllValuesActivity"/>
        <activity
            android:name=".AllValuesActivity"
            android:exported="false"
            android:parentActivityName=".MainActivity"/>
        <activity
            android:name=".DetectorActivity"
            android:label="@string/tfe_od_app_name"
            android:screenOrientation="portrait" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

And here is build.gradle file:

apply plugin: 'com.android.application'
apply plugin: 'de.undercouch.download'

android {
    compileSdkVersion 33
    //buildToolsVersion '28.0.3'
    defaultConfig {
        applicationId "org.tensorflow.lite.examples.detection"
        minSdkVersion 21
        targetSdkVersion 32
        versionCode 1
        versionName "1.0"

        javaCompileOptions {
            annotationProcessorOptions {
                //includeCompileClasspath true
            }
        }

//        ndk {
//            abiFilters 'armeabi-v7a', 'arm64-v8a'
//        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    aaptOptions {
        noCompress "tflite"
    }
    compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }
    lintOptions {
        abortOnError false
    }
}



// import DownloadModels task
project.ext.ASSET_DIR = projectDir.toString() + '/src/main/assets'
project.ext.TMP_DIR = project.buildDir.toString() + '/downloads'

// Download default models; if you wish to use your own models then
// place them in the "assets" directory and comment out this line.
//apply from: "download_model.gradle"

apply from: 'download_model.gradle'

dependencies {

    api 'com.google.android.material:material:1.8.0-alpha01'
    implementation 'com.android.volley:volley:1.2.1'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'

    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0'
    implementation 'com.google.android.material:material:1.6.1'
    //implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
    //implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
    //implementation 'org.tensorflow:tensorflow-lite:2.5.0'
    //implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-gpu-experimental'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'com.google.code.gson:gson:2.9.0'

    implementation 'androidx.room:room-runtime:2.5.0-alpha03'
    annotationProcessor  'androidx.room:room-compiler:2.5.0-alpha03'

    implementation 'androidx.compose.material3:material3:1.0.0-beta01'

    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
    androidTestImplementation 'com.google.truth:truth:1.0.1'

    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    implementation 'androidx.cardview:cardview:1.0.0'

    implementation "android.arch.lifecycle:extensions:1.1.1"
    implementation "android.arch.lifecycle:viewmodel:1.1.1"
    //implementation 'com.savvi.datepicker:rangepicker:1.2.0'
}

Could somebody please help me to find how to fix it? Thanks in advance.

1 Answers

It sounds like Proguard removed that class during compilation. Can you try setting minifyEnabled=false in your gradle, and see if the problem guess away?

If it does, you'll need to add some Proguard rules to keep that class intact

Related