美文网首页Android
TensorFlow库引用一个大坑

TensorFlow库引用一个大坑

作者: HawkFlying | 来源:发表于2020-07-21 20:33 被阅读0次

    描述

    最近这几天,用flutter基于TensorFlow开发了一个x动物的脸部识别插件,插件引入到demo中是没有问题,但一引入项目中,就报有些包不存在,类无法访问,有些方法不存在等问题,如下:

    ...
    android/src/main/java/com/tensorflow/tflite/Classifier.java:11: 错误: DataType在org.tensorflow.lite中不是公共的; 无法从外部程序包中对其进行访问
    android/src/main/java/com/tensorflow/tflite/Classifier.java:14: 错误: 程序包org.tensorflow.lite.nnapi不存在
    [android/src/main/java/com/tensorflow/tflite/Classifier.java:91: 错误:
     android/src/main/java/com/tensorflow/tflite/Classifier.java:101: 错误: 找不到符号
    mprivate final Interpreter.Options tfliteOptions = new Interpreter.Options();
    ...
    

    首先以为是网络被墙原因,但因为公司网络有翻墙,并且在demo引入库是正常的,把demo的库的缓存清掉,再引入,或者新开一个demo引入,还是正常的,所以排除了网络被墙的原因;
    因为我们flutter项目用多插件化开发的,所以刚开始以为是库引入的方式的问题,所以将插件上的implementation改成api引入 ,或者直接在项目上用api引入 TensorFlow的库,还是一样会报错;
    又由于我们flutter项目很多插件,所以以为是和其它插件有冲突,所以把其它插件全删个精光,再试,还是会报错;
    然后就是搜网上各种库引入报错的方法都试了个遍,包括清android studio缓存 ,清库缓存 ,改gradle配置等等,还是一样会报错;
    折腾了一天半,各种能想到的方法都试了,还是没有解决,近于崩溃,最后还是冷静下来,决定好好分析一下是什么原因,竟然报错,那就从报错那里入手,从报错信息看,不是所有和TensorFlow库相关的方法都报错,最后发现,引入项目报错的TensorFlow库里少了一些类,如下:


    项目上报错的TensorFlow库.png 正常demo的TensorFlow库.png

    对比发现项目上的TensorFlow库里少了一些类,这种情况以前没遇到过,问了工作十多年的前辈也没有遇到过;
    再折腾了一个下午,还是没有解决,哈哈~

    解决

    程序猿的习惯,一个问题没解决,会一直想它,晚上回家还在想它,想想哪些忽略了,把它列出来,jcenter/maven配置、版本、本地工程等等,一早到公司就马上验证:
    公司项目jcenter/maven配置:

    allprojects {
        repositories {
            maven { url "https://storage.googleapis.com/download.flutter.io" }
            maven { url 'https://maven.aliyun.com/repository/central' }
            maven { url 'https://maven.aliyun.com/repository/public' }
    
            maven { url "https://jitpack.io" }
            google()
    
            jcenter()
            jcenter() { url 'http://jcenter.bintray.com/' }
    
            mavenCentral()
            maven { url 'https://repo1.maven.org/maven2/' }
        }
    }
    

    demon上jcenter/maven配置:

    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    

    我试着把google和jcenter提上去,如下:
    调整后公司项目jcenter/maven配置:

    allprojects {
        repositories {
            google()
            jcenter()
    
    
            maven { url "https://storage.googleapis.com/download.flutter.io" }
            maven { url 'https://maven.aliyun.com/repository/central' }
            maven { url 'https://maven.aliyun.com/repository/public' }
    
            maven { url "https://jitpack.io" }
           
            jcenter() { url 'http://jcenter.bintray.com/' }
    
            mavenCentral()
            maven { url 'https://repo1.maven.org/maven2/' }
        }
    }
    

    一试,没有报TensorFlow库的报错了,希望大增,虽然还报其它错误,比如AndroidMainifest合并的错误,但我还要确定是不是真的是jcenter/maven配置引起的,所以我把项目之前的jcenter/maven配置替换demo的jcenter/maven配置,因为demo比较干净,其它干扰因素少,demo一试,项目上的报错信息就出来,哈哈,这时我知道,我解决了,功夫不负有心人~
    解决的方法,就是把jcenter/maven配置里的google() jcenter()提上来,因为gradle里jcenter/maven配置,下载库的时侯会先从最上面的平台上找,找不到就到下一平台上找,找到就从这个平台下载,我们项目中jcenter/maven配置添加这么多配置,之前是为有些库下载不下来而配的,因为我们公司网络有翻墙,并且不是库下载不下来,而是库下载下来不完整,所以刚开始对jcenter/maven配置的影响忽略了,但各种可能性都试了没有解决后,又不得不大胆怀疑,Tensorflow库本来就是不完整的,可能是Tensorflow使用的人还不够多的原因吧,在有些平台上Tensorflow库不完整。
    解决配置如下:
    调整后公司项目jcenter/maven配置(将jcenter/maven配置里的google() jcenter()提到最顶部)

    allprojects {
        repositories {
            google()
            jcenter()
    
    
            maven { url "https://storage.googleapis.com/download.flutter.io" }
            maven { url 'https://maven.aliyun.com/repository/central' }
            maven { url 'https://maven.aliyun.com/repository/public' }
    
            maven { url "https://jitpack.io" }
           
            jcenter() { url 'http://jcenter.bintray.com/' }
    
            mavenCentral()
            maven { url 'https://repo1.maven.org/maven2/' }
        }
    }
    

    相关文章

      网友评论

        本文标题:TensorFlow库引用一个大坑

        本文链接:https://www.haomeiwen.com/subject/yojmhktx.html