0

Android 3.2, Gradle 4.6, Java 1.8

dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'

on app/build.gradle

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.myproject"
        minSdkVersion 18
        targetSdkVersion 28
        versionCode 423
        versionName "2.1.423"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

   lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }

def AAVersion = '4.5.2'

dependencies {
    annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
    annotationProcessor "org.androidannotations:ormlite:$AAVersion"

    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:animated-vector-drawable:28.0.0'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.android.support:customtabs:28.0.0'
    implementation 'com.android.support:exifinterface:28.0.0'
    implementation 'com.android.support:support-media-compat:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'

    implementation 'com.crashlytics.sdk.android:crashlytics:2.9.7'
    implementation 'com.google.android.gms:play-services-gcm:16.0.0'
    implementation 'com.google.code.gson:gson:2.8.2'
    implementation 'com.j256.ormlite:ormlite-android:5.1'
    implementation 'commons-codec:commons-codec:1.11'
    implementation 'commons-io:commons-io:2.6'
    implementation 'org.apache.commons:commons-lang3:3.8.1'
    implementation 'org.apache.httpcomponents:httpclient:4.3.6'
    implementation "org.androidannotations:androidannotations-api:$AAVersion"
    implementation "org.androidannotations:ormlite-api:$AAVersion"

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
}

Here java class snippet:

import android.content.Context;
import android.util.Log;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

private String getFileContent(String fileName) {
    try {
        File file = new File(fileName);
        String fileContent = FileUtils.readFileToString(file); // error here
        return fileContent;
    } catch (IOException e) {
        if(BuildConfig.DEBUG)Log.e(TAG, e.getMessage(), e);
    }
        return null;
    }

On Android 4.4+ project run success.

But on Android 4.3 I get error:

org/apache/commons/io/Charsets                                             
java.lang.NoClassDefFoundError: org/apache/commons/io/Charsets                             
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:2440)                           
    at org.apache.commons.io.IOUtils.toString(IOUtils.java:1084)                           
    at org.apache.commons.io.IOUtils.toString(IOUtils.java:1064)                           
    at com.myproject.android.fointeraction.util.StringUtil.getStringFromResource(StringUtil.java:82)           
    at com.myproject.transport.lite.FOServiceLite.executeCommand(FOServiceLite.java:669)               
    at com.myproject.service.DeviceContextService.registerDeviceContext(DeviceContextService.java:112)     
    at com.myproject.service.DeviceContextService.update(DeviceContextService.java:149)            
    at com.myproject.service.DeviceContextService.getDeviceId(DeviceContextService.java:160)           
    at com.myproject.service.AppContextService.getUserName(AppContextService.java:16)              
    at com.myproject.service.NotificationsSyncModule.sync(NotificationsSyncModule.java:118)        
    at com.myproject.activity.FirstStartActivity$3.run(FirstStartActivity.java:135)            
at java.lang.Thread.run(Thread.java:841)

Error in this line:

String fileContent = FileUtils.readFileToString(file);
Alexei
  • 14,350
  • 37
  • 121
  • 240

1 Answers1

0

it's unlikely, that a library does not know a class on different API levels

... enable multidex to have all of the library packaged for Dalvik.

the amount of dependencies clearly points into this direction.


the error actually comes from there:

StringUtil.getStringFromResource(StringUtil.java:82)

one other possibility would be, that Charsets gets obfuscated.

can you import org.apache.commons.io.Charsets; ??

Martin Zeitler
  • 1
  • 19
  • 155
  • 216
  • String fileContent = FileUtils.readFileToString(file, org.apache.commons.io.Charsets.UTF_8); - not help. Same error. – Alexei Dec 21 '18 at 17:49
  • Is I try use multidex, it's also not help. I get another error: java.lang.RuntimeException: Unable to get provider com.crashlytics.android.CrashlyticsInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.crashlytics.android.CrashlyticsInitProvider" – Alexei Dec 21 '18 at 17:59
  • @Alexei see https://stackoverflow.com/questions/51517005/unable-to-get-provider-com-crashlytics-android-crashlyticsinitprovider – Martin Zeitler Dec 22 '18 at 00:57