Search code examples
androidandroid-jetpackandroid-multidex

Error java.lang.ClassNotFoundException After Upgrading to AndroidX and Android Studio 4.0


I just recently upgraded my old project from target sdk version 26 to 28 and used AndroidX in order to use WorkManager library. I also upgraded my Android Studio to version 4.0.

I have one external jar library commons-httpclient-3.1-rc1.jar (implementation files('libs/commons-httpclient-3.1-rc1.jar')). The build process run well and my application could start normaly. But i got the following warning when my app starting the background sync process (using workmanger). The sync class used some classes from commons-httpclient library.

Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.commons.logging.LogFactory" on path: DexPathList[[zip file "/data/app/com.myapp.android-_mXRtE6XltfExOFTAj7PRQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.android-_mXRtE6XltfExOFTAj7PRQ==/lib/x86, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at org.apache.commons.httpclient.util.EncodingUtil.<clinit>(EncodingUtil.java:54) 
    at org.apache.commons.httpclient.util.EncodingUtil.getBytes(EncodingUtil.java:202) 
    at org.apache.commons.httpclient.util.URIUtil.encode(URIUtil.java:502) 
    at org.apache.commons.httpclient.util.URIUtil.encodeAll(URIUtil.java:218) 
    at com.myapp.android.http.util.EncodeUtil.encode(EncodeUtil.java:12) 
    at com.myapp.android.http.params.HttpParams.getQueryString(HttpParams.java:69) 
    at com.myapp.android.http.kauth.KAuthProvider.getSignedUrl(KAuthProvider.java:52) 
    at com.myapp.android.http.client.HttpConnection.get(HttpConnection.java:62) 
    at com.myapp.android.http.impl.client.SyncConnection.syncMaster(SyncConnection.java:28) 
    at com.myapp.android.worker.SyncWorker.lambda$startWork$0$SyncWorker(SyncWorker.java:103) 
    at com.myapp.android.worker.-$$Lambda$SyncWorker$jzconowJk0nkjIXH-ROtVtccjT8.attachCompleter(Unknown Source:4) 
    at androidx.concurrent.futures.CallbackToFutureAdapter.getFuture(CallbackToFutureAdapter.java:102) 
    at com.myapp.android.worker.SyncWorker.startWork(SyncWorker.java:66) 
    at androidx.work.impl.WorkerWrapper$1.run(WorkerWrapper.java:281) 
    at android.os.Handler.handleCallback(Handler.java:873) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6669) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

I guess the error might be dealing with Multidex feature. I'm using Multidex and already replace the old Multidex with AndroidX version. In my build.gradle file

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

android {
    compileSdkVersion 28
    buildToolsVersion "30.0.0"
    flavorDimensions "version"

    productFlavors {
        dev {
            minSdkVersion 21 //The important bit.
            dimension "version"
        }
        prod {
            minSdkVersion 15 //Example. Set to your real requirement.
            dimension "version"
        }
    }

    defaultConfig {
        applicationId "com.myapp.android"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 7
        versionName "1.0.6"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            debuggable true
        }
    }
    lintOptions {
        disable 'TypographyFractions','TypographyQuotes'
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation 'androidx.work:work-runtime:2.4.0-rc01'
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.concurrent:concurrent-futures:1.0.0'
    implementation 'com.google.android.material:material:1.1.0-alpha04'
    
    implementation 'com.google.android.gms:play-services-auth:11.0.0'
    implementation 'com.google.android.gms:play-services-plus:11.0.0'
    implementation 'com.google.android.gms:play-services-analytics:11.0.0'
    implementation 'com.google.firebase:firebase-messaging:11.0.0'
    implementation 'com.google.firebase:firebase-config:11.0.0'
    implementation 'com.google.firebase:firebase-ads:11.0.0'
    implementation 'androidx.multidex:multidex:2.0.1'

    implementation 'com.loopj.android:android-async-http:1.4.9'
    implementation 'com.facebook.android:facebook-android-sdk:4.8.2'
    implementation 'com.github.clans:fab:1.6.2'
    implementation 'com.github.bumptech.glide:glide:3.5.2'
    implementation 'com.github.rey5137:material:1.2.2'
    implementation 'com.github.ganfra:material-spinner:1.1.1'
    implementation 'com.wdullaer:materialdatetimepicker:2.1.1'
    implementation 'com.soundcloud.android:android-crop:1.0.1@aar'
    implementation 'de.greenrobot:eventbus:2.4.0'
    implementation 'net.danlew:android.joda:2.9.4.3'
    implementation 'com.github.chrisbanes:PhotoView:1.3.1'
    implementation 'com.github.paolorotolo:appintro:4.1.0'

    implementation 'com.squareup.picasso:picasso:2.3.2'
    implementation 'com.nineoldandroids:library:2.4.0'
    implementation 'com.daimajia.slider:library:1.1.5@aar'
    implementation 'uk.co.chrisjenx:calligraphy:2.3.0'

    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    implementation files('libs/commons-httpclient-3.1-rc1.jar')

    implementation('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
        transitive = true;
    }

}

apply plugin: 'com.google.gms.google-services'

And in BaseApplication class

import androidx.multidex.MultiDexApplication

public class BaseApplication extends MultiDexApplication {}

I've tried to clean the project, rebuild, invalidate caches and restart but it didn't work. Any solution?

Thank you


Solution

  • I've already fixed the problem. Found the solution from this answer

    java.lang.NoClassDefFoundError:failed resolution of :Lorg/apache/http/ProtocolVersion

    The solution is to add

    <uses-library android:name="org.apache.http.legacy" android:required="false" />
    

    on manifest file.

    I'm not using google maps, but the error might caused by the apache library.