Skip to content

Liveness Doesn't Support < Android 8 #273

@yogeshelevn

Description

@yogeshelevn

Before creating a new issue, please confirm:

Which UI component?

Liveness

Gradle script dependencies

 coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'

    // FaceLivenessDetector dependency
    implementation 'com.amplifyframework.ui:liveness:1.6.0'

    // Amplify Auth dependency (unnecessary if using your own credentials provider)
    implementation 'com.amplifyframework:aws-auth-cognito:2.29.0'

    // Material3 dependency for theming FaceLivenessDetector
    implementation 'androidx.compose.material3:material3:1.1.2'
    // Support for Java 8 features
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'

    
    implementation "androidx.activity:activity-ktx:1.8.1"
    implementation 'androidx.activity:activity-compose:1.4.0'
    implementation "com.android.billingclient:billing:6.1.0"

Environment information

------------------------------------------------------------
Gradle 8.10.2
------------------------------------------------------------

Build time:    2024-09-23 21:28:39 UTC
Revision:      415adb9e06a516c44b391edff552fd42139443f7

Kotlin:        1.9.24
Groovy:        3.0.22
Ant:           Apache Ant(TM) version 1.10.14 compiled on August 16 2023
Launcher JVM:  23.0.2 (Homebrew 23.0.2)
Daemon JVM:    /opt/homebrew/Cellar/openjdk/23.0.2/libexec/openjdk.jdk/Contents/Home (no JDK specified, using current Java home)
OS:            Mac OS X 15.1 aarch64

Please include any relevant guides or documentation you're referencing

No response

Describe the bug

Android flutter app is crashing on starting AWS liveness verification. issue is related to TensorFlow Failed to load native TensorFlow Lite methods. Check that the correct native libraries are present, and, if using a custom native library, have been properly loaded via System.loadLibrary(): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtod_l" referenced by "/data/app/com.elevn.prod-1/split_config.arm64_v8a.apk!/lib/arm64-v8a/libtensorflowlite_jni.so".

Reproduction steps (if applicable)

No response

Code Snippet

package com.elevn.dating

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Snackbar
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.amplifyframework.auth.cognito.AWSCognitoAuthPlugin
import com.amplifyframework.core.Amplify
import com.amplifyframework.ui.liveness.ui.FaceLivenessDetector
import com.amplifyframework.ui.liveness.ui.LivenessColorScheme

class LiveVerificationActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val sessionId = intent.getStringExtra("sessionId") ?: ""
        val intent = Intent();
        Log.d("here", "starting faceliveness detection")
        Log.d("sessionId", sessionId)
        getSupportActionBar()?.hide() 
        setContent {
            MaterialTheme(colorScheme = LivenessColorScheme.default()) {
                FaceLivenessDetector(
                    sessionId = sessionId,
                    region = "ap-south-1",
                    disableStartView = true,
                    onComplete = {
                        Log.i("sucess", "you are in sucess")
//                    callback?.onCompleteCallback()
                        intent.putExtra("result", "success");
                        setResult(Activity.RESULT_OK, intent);
                        finish();
                    },
                    onError = { error ->
                       intent.putExtra("errorResult", error.message);
                        setResult(Activity.RESULT_CANCELED, intent);
                        finish();
                    })
            }
        }
    }
}

Log output

// Put your logs below this line


Fatal Exception: java.lang.UnsatisfiedLinkError: Failed to load native TensorFlow Lite methods. Check that the correct native libraries are present, and, if using a custom native library, have been properly loaded via System.loadLibrary():
  java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtod_l" referenced by "/data/app/com.elevn.prod-1/split_config.arm64_v8a.apk!/lib/arm64-v8a/libtensorflowlite_jni.so"...
       at org.tensorflow.lite.TensorFlowLite.init(TensorFlowLite.java:137)
       at org.tensorflow.lite.NativeInterpreterWrapper.<init>(NativeInterpreterWrapper.java:62)
       at org.tensorflow.lite.NativeInterpreterWrapperExperimental.<init>(NativeInterpreterWrapperExperimental.java:36)
       at org.tensorflow.lite.Interpreter.<init>(Interpreter.java:230)
       at org.tensorflow.lite.Interpreter.<init>(Interpreter.java:214)
       at com.amplifyframework.ui.liveness.ml.FaceDetector$Companion.loadModel(FaceDetector.kt:493)
       at com.amplifyframework.ui.liveness.camera.FrameAnalyzer.<init>(FrameAnalyzer.kt:39)
       at com.amplifyframework.ui.liveness.camera.LivenessCoordinator.<init>(LivenessCoordinator.kt:105)
       at com.amplifyframework.ui.liveness.ui.FaceLivenessDetectorKt$ChallengeView$1.invoke(FaceLivenessDetector.kt:203)
       at com.amplifyframework.ui.liveness.ui.FaceLivenessDetectorKt$ChallengeView$1.invoke(FaceLivenessDetector.kt:201)
       at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:83)
       at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberList(RememberEventDispatcher.kt:182)
       at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberObservers(RememberEventDispatcher.kt:174)
       at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:1044)
       at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1067)
       at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1159)
       at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:677)
       at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:616)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:123)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.android.kt:1970)
       at androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:168)
       at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.jvm.kt:320)
       at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.jvm.kt:198)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:121)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:2049)
       at android.view.View.dispatchAttachedToWindow(View.java:15819)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3062)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1950)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1663)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7546)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:942)
       at android.view.Choreographer.doCallbacks(Choreographer.java:744)
       at android.view.Choreographer.doFrame(Choreographer.java:658)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:928)
       at android.os.Handler.handleCallback(Handler.java:836)
       at android.os.Handler.dispatchMessage(Handler.java:103)
       at android.os.Looper.loop(Looper.java:232)
       at android.app.ActivityThread.main(ActivityThread.java:6806)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1103)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

Caused by java.lang.UnsatisfiedLinkError: No implementation found for void org.tensorflow.lite.TensorFlowLite.nativeDoNothing() (tried Java_org_tensorflow_lite_TensorFlowLite_nativeDoNothing and Java_org_tensorflow_lite_TensorFlowLite_nativeDoNothing__)
       at org.tensorflow.lite.TensorFlowLite.nativeDoNothing(TensorFlowLite.java)
       at org.tensorflow.lite.TensorFlowLite.init(TensorFlowLite.java:132)
       at org.tensorflow.lite.NativeInterpreterWrapper.<init>(NativeInterpreterWrapper.java:62)
       at org.tensorflow.lite.NativeInterpreterWrapperExperimental.<init>(NativeInterpreterWrapperExperimental.java:36)
       at org.tensorflow.lite.Interpreter.<init>(Interpreter.java:230)
       at org.tensorflow.lite.Interpreter.<init>(Interpreter.java:214)
       at com.amplifyframework.ui.liveness.ml.FaceDetector$Companion.loadModel(FaceDetector.kt:493)
       at com.amplifyframework.ui.liveness.camera.FrameAnalyzer.<init>(FrameAnalyzer.kt:39)
       at com.amplifyframework.ui.liveness.camera.LivenessCoordinator.<init>(LivenessCoordinator.kt:105)
       at com.amplifyframework.ui.liveness.ui.FaceLivenessDetectorKt$ChallengeView$1.invoke(FaceLivenessDetector.kt:203)
       at com.amplifyframework.ui.liveness.ui.FaceLivenessDetectorKt$ChallengeView$1.invoke(FaceLivenessDetector.kt:201)
       at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:83)
       at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberList(RememberEventDispatcher.kt:182)
       at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberObservers(RememberEventDispatcher.kt:174)
       at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:1044)
       at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1067)
       at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1159)
       at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:677)
       at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:616)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:123)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.android.kt:1970)
       at androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:168)
       at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.jvm.kt:320)
       at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.jvm.kt:198)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:121)
       at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
       at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:2049)
       at android.view.View.dispatchAttachedToWindow(View.java:15819)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3062)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3069)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1950)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1663)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7546)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:942)
       at android.view.Choreographer.doCallbacks(Choreographer.java:744)
       at android.view.Choreographer.doFrame(Choreographer.java:658)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:928)
       at android.os.Handler.handleCallback(Handler.java:836)
       at android.os.Handler.dispatchMessage(Handler.java:103)
       at android.os.Looper.loop(Looper.java:232)
       at android.app.ActivityThread.main(ActivityThread.java:6806)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1103)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

grpc-timer-0:
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$(Thread.java:2127)
       at sun.misc.Unsafe.park(Unsafe.java:325)
       at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:201)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2077)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1103)
       at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1084)
       at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1058)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1118)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:761)

Firebase Blocking Thread #3:
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$(Thread.java:2127)
       at sun.misc.Unsafe.park(Unsafe.java:325)
       at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:201)
       at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:432)
       at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:333)
       at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:908)
       at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1057)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1118)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0(CustomThreadFactory.java:47)
       at java.lang.Thread.run(Thread.java:761)

AsyncTask #2:
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$(Thread.java:2127)
       at sun.misc.Unsafe.park(Unsafe.java:325)
       at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:201)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2077)
       at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:438)
       at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1057)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1118)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:761)

AsyncTask #4:
       at java.lang.Object.wait(Object.java)
       at java.lang.Thread.parkFor$(Thread.java:2127)
       at sun.misc.Unsafe.park(Unsafe.java:325)
       at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:201)
       at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2077)
       at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:438)
       at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1057)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1118)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:761)

Firebase Background Thread #1:
       at dalvik.system.VMStack.getThreadStackTrace(VMStack.java)
       at java.lang.Thread.getStackTrace(Thread.java:1566)
       at java.lang.Thread.getAllStackTraces(Thread.java:1616)
       at com.google.firebase.crashlytics.internal.common.CrashlyticsReportDataCapture.populateThreadsList(CrashlyticsReportDataCapture.java:343)
       at com.google.firebase.crashlytics.internal.common.CrashlyticsReportDataCapture.populateExecutionData(CrashlyticsReportDataCapture.java:314)
       at com.google.firebase.crashlytics.internal.common.CrashlyticsReportDataCapture.populateEventApplicationData(CrashlyticsReportDataCapture.java:261)
       at com.google.firebase.crashlytics.internal.common.CrashlyticsReportDataCapture.captureEventData(CrashlyticsReportDataCapture.java:112)
       at com.google.firebase.crashlytics.internal.common.SessionReportingCoordinator.persistEvent(SessionReportingCoordinator.java:336)
       at com.google.firebase.crashlytics.internal.common.SessionReportingCoordinator.persistFatalEvent(SessionReportingCoordinator.java:129)
       at com.google.firebase.crashlytics.internal.common.CrashlyticsController$2.call(CrashlyticsController.java:209)
       at com.google.firebase.crashlytics.internal.common.CrashlyticsController$2.call(CrashlyticsController.java:195)
       at com.google.firebase.crashlytics.internal.concurrency.CrashlyticsWorker.lambda$submitTask$2(CrashlyticsWorker.java:118)
       at com.google.android.gms.tasks.zze.run(com.google.android.gms:play-services-tasks@@18.1.0:1)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0(CustomThreadFactory.java:47)
       at java.lang.Thread.run(Thread.java:761)


Configuration File

{
"UserAgent": "aws-amplify-cli/2.0",
"Version": "1.0",
"auth": {
"plugins": {
"awsCognitoAuthPlugin": {
"UserAgent": "aws-amplify-cli/0.1.0",
"Version": "0.1.0",
"IdentityManager": {
"Default": {}
},
"CredentialsProvider": {
"CognitoIdentity": {
"Default": {

                        "Region": "ap-south-1"
                    }
                }
            },
            "CognitoUserPool": {
                "Default": {
         
                    "Region": "ap-south-1"
                }
            },
            "Auth": {
                "Default": {
                    "authenticationFlowType": "USER_SRP_AUTH",
                    "socialProviders": [],
                    "usernameAttributes": [
                        "PHONE_NUMBER"
                    ],
                    "signupAttributes": [
                        "EMAIL"
                    ],
                    "passwordProtectionSettings": {
                        "passwordPolicyMinLength": 8,
                        "passwordPolicyCharacters": []
                    },
                    "mfaConfiguration": "OFF",
                    "mfaTypes": [
                        "SMS"
                    ],
                    "verificationMechanisms": [
                        "PHONE_NUMBER"
                    ]
                }
            }
        }
    }
}

}

Additional information and screenshots

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions