TensorFlowLite 2.12-2.15 在Android5-7 运行闪退和修复

280 阅读2分钟

升级TFLite后发现收集不少问题,# UnsatisfiedLinkError: Failed to load native TensorFlow Lite methods  发现都是Android 5,6,7 上出现的,回退到TfLite 2.11.0 就没有问题,但是TFLite新特性就没有了。

错误Log 如下

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.ai.facesearch-1/lib/arm64/libtensorflowlite_jni.so"... at org.tensorflow.lite.TensorFlowLite.init(TensorFlowLite.java:137) at org.tensorflow.lite.NativeInterpreterWrapper.(NativeInterpreterWrapper.java:62) at org.tensorflow.lite.NativeInterpreterWrapperExperimental.(NativeInterpreterWrapperExperimental.java:36) at org.tensorflow.lite.Interpreter.(Interpreter.java:232) .................. kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@4a07d15, Dispatchers.Default] 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(Native Method) at org.tensorflow.lite.TensorFlowLite.init(TensorFlowLite.java:132) ... 13 more

那么Android5-7的设备留存占比数据大概是怎样的呢?

https://apilevels.com

根据apilevels.com 统计不算多,但是也还没有达到忽略的地步,毕竟Google Play 和 JetPack Compose 都还在支持Android 5

为什么突然会出现这样的问题?

github.com/tensorflow/…

根据Tflite 官方网站修改记录可以看见修改了这行代码

build --action_env ANDROID_NDK_API_LEVEL="26"
最低支持的API级别增加到API 26,以便为AHardwareBuffer提供有保证的支持,这一特性是异步API在使用GPU委托代理的时候使用的。 虽然现在端侧的模型大部分还不能使用GPU 委托代理,但是在这个日新月异的环境中GPU委托代理是一种大方向和趋势,我们能做的就是适应时代的发展。

我们该怎么处理适配问题

目前TFLite已经发布了2.15,刚刚在Android 7 上跑了一下依然是Crash,如果你的应用只需要适配Android8-14 可以直接用TFLite 2.15.0。 否则降低到2.11 或分段支持编译打包(费劲)

目前TensorFlow官方的文档还是标记会最低支持Android API 21 也就是Android 5,等团队缓过来了应该会向下支持,看论坛的资料大概是TFLite2.16.0 能恢复支持Android API 21。那咱们就走着瞧?