【问题标题】:Tessract error java.lang.NoSuchFieldError when minifyenable is true当 minifyenabled 为 true 时,Tesseract 错误 java.lang.NoSuchFieldError
【发布时间】:2016-03-16 19:53:57
【问题描述】:

当我使用 minifyenable true 构建我的应用程序时,我收到以下错误。奇怪的是,当我使用 minifyenable false 编译时,应用程序运行良好。这些应用程序使用 Tesseract 来扫描文档。

我错过了什么?

    java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:304)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NoSuchFieldError: no "J" field "mNativeData" in class "Lcom/googlecode/tesseract/android/TessBaseAPI;" or its superclasses
    at com.googlecode.tesseract.android.TessBaseAPI.nativeClassInit(Native Method)
    at com.googlecode.tesseract.android.TessBaseAPI.<clinit>(Unknown Source)
    at br.com.cfb.doarnf.el.a(Unknown Source)
    at br.com.cfb.doarnf.a.a(Unknown Source)
    at br.com.cfb.doarnf.a.doInBackground(Unknown Source)
    at android.os.AsyncTask$2.call(AsyncTask.java:292)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)

build.gradle(模块:app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "br.com.cfb.doarnf"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 5
        versionName "2.1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

}

dependencies {
    compile files('libs/YouTubeAndroidPlayerApi.jar')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':tess-two')
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'org.parceler:parceler:1.0.1'
    compile 'org.parceler:parceler-api:1.0.1'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
    compile 'com.squareup.okhttp:okhttp:2.2.0'
    compile 'com.github.orangegangsters:swipy:1.2.0@aar'
    compile 'com.google.android.gms:play-services:8.3.0'
    compile 'com.google.android.gms:play-services-gcm:8.3.0'
    compile 'com.google.android.gms:play-services-ads:8.3.0'
    compile 'com.google.android.gms:play-services-identity:8.3.0'
    compile 'com.google.zxing:core:3.2.1'
}

build.gradle(模块:tess-two)

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
    }
}
apply plugin: 'com.android.library'
android {

    compileSdkVersion 23
    buildToolsVersion "23.0.1"


    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
    }
    buildTypes {
        release {
            minifyEnabled false
        }
    }

    sourceSets.main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        res.srcDirs = ['res']
        jniLibs.srcDirs = ['libs']
    }
}
dependencies {
}

【问题讨论】:

    标签: android minify tesseract android-proguard


    【解决方案1】:

    我找到了解决方法。只是避免 ProGuard 处理 tess-two 库,如下:

    将 consumerProguardFiles 添加到 build.gradle(模块:tess-two)

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:1.3.0'
        }
    }
    apply plugin: 'com.android.library'
    android {
    
        compileSdkVersion 23
        buildToolsVersion "23.0.1"
    
    
        defaultConfig {
            minSdkVersion 17
            targetSdkVersion 23
            consumerProguardFiles 'proguard-tess-two-rules.txt'
        }
    
    
        sourceSets.main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            jniLibs.srcDirs = ['libs']
        }
    }
    dependencies {
    }
    

    proguard-tess-two-rules.txt 文件

    # Add tess-two specific ProGuard rules here.
    -dontoptimize
    -dontobfuscate
    -dontpreverify
    -dontshrink
    -dontskipnonpubliclibraryclasses
    -dontskipnonpubliclibraryclassmembers
    -dontusemixedcaseclassnames
    -dontnote
    

    我希望它可以帮助某人。

    【讨论】:

    • 谢谢,您为我指明了正确的方向。不过,我们只需要 3 条规则。 -dontoptimize,-dontpreverify,-dontshrink
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-12-10
    相关资源
    最近更新 更多