I don't have an actual Android device running API 22 so I am running the emulator. If anyone has an actual device to confirm behavior then that will be helpful to see if this problem occurs only for emulators.
The app crashes when starting on an emulator at API Level 22 (Lollipop). Stack trace is below.
The app successfully starts on emulators running API Level 21, 23 and 25 and starts successfully on my API Level 24 actual devices.
The issue seems specific to API Level 22 and related to the MultiDex configuration. I see we have multiDexEnabled = true in our gradle.build:
defaultConfig {
applicationId "com.mentalmachines.droidcon_boston"
minSdkVersion 18
targetSdkVersion 25
versionCode 2
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled = true
}
Per https://developer.android.com/studio/build/multidex.html config requirements are different for minSdkVersion 21 and up. Our minSdkVersion is 18.
From that document I tried the following but the app still crashes on start for API 22:
-
Add the following to build.grade:
compile 'com.android.support:multidex:1.0.1'
-
If not overriding Application class (we have one defined but it is unused and not named in manifest.xml) add the following to manifest.xml Application class:
android:name="android.support.multidex.MultiDexApplication"
Here's the stack trace based on current code in Github:
04-08 12:53:52.726 3014-3014/com.mentalmachines.droidcon_boston E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mentalmachines.droidcon_boston, PID: 3014
java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/OkHttpClient$Builder;
at com.twitter.sdk.android.core.internal.oauth.OAuthService.(OAuthService.java:56)
at com.twitter.sdk.android.core.internal.oauth.OAuth2Service.(OAuth2Service.java:59)
at com.twitter.sdk.android.core.TwitterCore.createGuestSessionProvider(TwitterCore.java:223)
at com.twitter.sdk.android.core.TwitterCore.getGuestSessionProvider(TwitterCore.java:216)
at com.twitter.sdk.android.tweetcomposer.TweetComposer.onPreExecute(TweetComposer.java:72)
at io.fabric.sdk.android.InitializationTask.onPreExecute(InitializationTask.java:44)
at io.fabric.sdk.android.services.concurrency.AsyncTask.executeOnExecutor(AsyncTask.java:611)
at io.fabric.sdk.android.services.concurrency.PriorityAsyncTask.executeOnExecutor(PriorityAsyncTask.java:43)
at io.fabric.sdk.android.Kit.initialize(Kit.java:69)
at io.fabric.sdk.android.Fabric.initializeKits(Fabric.java:439)
at io.fabric.sdk.android.Fabric.init(Fabric.java:383)
at io.fabric.sdk.android.Fabric.setFabric(Fabric.java:341)
at io.fabric.sdk.android.Fabric.with(Fabric.java:312)
at com.mentalmachines.droidcon_boston.views.MainActivity.onCreate(MainActivity.java:40)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "okhttp3.OkHttpClient$Builder" on path: DexPathList[[zip file "/data/app/com.mentalmachines.droidcon_boston-1/base.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.mentalmachines.droidcon_boston-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.twitter.sdk.android.core.internal.oauth.OAuthService.(OAuthService.java:56)
at com.twitter.sdk.android.core.internal.oauth.OAuth2Service.(OAuth2Service.java:59)
at com.twitter.sdk.android.core.TwitterCore.createGuestSessionProvider(TwitterCore.java:223)
at com.twitter.sdk.android.core.TwitterCore.getGuestSessionProvider(TwitterCore.java:216)
at com.twitter.sdk.android.tweetcomposer.TweetComposer.onPreExecute(TweetComposer.java:72)
at io.fabric.sdk.android.InitializationTask.onPreExecute(InitializationTask.java:44)
at io.fabric.sdk.android.services.concurrency.AsyncTask.executeOnExecutor(AsyncTask.java:611)
at io.fabric.sdk.android.services.concurrency.PriorityAsyncTask.executeOnExecutor(PriorityAsyncTask.java:43)
at io.fabric.sdk.android.Kit.initialize(Kit.java:69)
at io.fabric.sdk.android.Fabric.initializeKits(Fabric.java:439)
at io.fabric.sdk.android.Fabric.init(Fabric.java:383)
at io.fabric.sdk.android.Fabric.setFabric(Fabric.java:341)
at io.fabric.sdk.android.Fabric.with(Fabric.java:312)
at com.mentalmachines.droidcon_boston.views.MainActivity.onCreate(MainActivity.java:40)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Suppressed: java.lang.ClassNotFoundException: okhttp3.OkHttpClient$Builder
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 28 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available