mikepenz/Android-Iconics

[Iconics - 5.1.0] Jetpack appstartup incompatible with kotlin `objects`

samuelebistoletti opened this issue · 6 comments

About this issue

When I start my app on AVD Pixel XL API 27 I got a crash with that stack trace:

java.lang.RuntimeException: Unable to get provider androidx.startup.InitializationProvider: androidx.startup.StartupException: java.lang.IllegalAccessException: Class java.lang.Class<androidx.startup.AppInitializer> cannot access private  method void com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome.<init>() of class java.lang.Class<com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome>
        at android.app.ActivityThread.installProvider(ActivityThread.java:6242)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: androidx.startup.StartupException: java.lang.IllegalAccessException: Class java.lang.Class<androidx.startup.AppInitializer> cannot access private  method void com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome.<init>() of class java.lang.Class<com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome>
        at androidx.startup.AppInitializer.doInitialize(AppInitializer.java:162)
        at androidx.startup.AppInitializer.discoverAndInitialize(AppInitializer.java:198)
        at androidx.startup.InitializationProvider.onCreate(InitializationProvider.java:42)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1917)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1892)
        at android.app.ActivityThread.installProvider(ActivityThread.java:6239)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722) 
        at android.app.ActivityThread.-wrap1(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: java.lang.IllegalAccessException: Class java.lang.Class<androidx.startup.AppInitializer> cannot access private  method void com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome.<init>() of class java.lang.Class<com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome>
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at androidx.startup.AppInitializer.doInitialize(AppInitializer.java:140)
  • How can the issue be reproduced / sample code
    I have no customization in code, only standard use in layout as stated by your docs.

Details

  •  Used library version: Last 5.1.0 with Kotlin
  •  Used support library version
  •  Used gradle build tools version: 4.1.0
  •  Used tooling / Android Studio version: Android Studio 4.1
  •  Other used libraries, potential conflicting libraries

build.gradle file:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        minSdkVersion 26
        targetSdkVersion 30
        versionCode 1
        versionName "2.0.0"
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {
    // Base
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
    implementation 'androidx.core:core-ktx:1.3.2'

    // Extensions
    implementation 'android.arch.lifecycle:extensions:1.1.1'

    // Android X
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.preference:preference-ktx:1.1.1'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.2'

    // Firebase SDK
    implementation 'com.google.firebase:firebase-analytics-ktx:17.6.0'
    implementation 'com.google.firebase:firebase-crashlytics-ktx:17.2.2'

    // Barcode and related
    implementation 'com.google.mlkit:barcode-scanning:16.0.3'

    // HTTP Library and json
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    implementation 'com.google.code.gson:gson:2.8.6'

    // Theme
    implementation 'com.google.android.material:material:1.2.1'

    // Icons
    implementation 'com.mikepenz:iconics-core:5.1.0'
    implementation 'com.mikepenz:iconics-views:5.1.0'
    implementation 'com.mikepenz:fontawesome-typeface:5.9.0.1-kotlin@aar'

    implementation rootProject.files('libs/bluetoothservice.jar')
}

The same for me with API 27

    java.lang.RuntimeException: Unable to get provider androidx.startup.InitializationProvider: androidx.startup.StartupException: java.lang.IllegalAccessException: Class java.lang.Class<androidx.startup.AppInitializer> cannot access private  method void com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.<init>() of class java.lang.Class<com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial>
        at android.app.ActivityThread.installProvider(ActivityThread.java:6242)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: androidx.startup.StartupException: java.lang.IllegalAccessException: Class java.lang.Class<androidx.startup.AppInitializer> cannot access private  method void com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.<init>() of class java.lang.Class<com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial>
        at androidx.startup.AppInitializer.doInitialize(AppInitializer.java:162)
        at androidx.startup.AppInitializer.discoverAndInitialize(AppInitializer.java:198)
        at androidx.startup.InitializationProvider.onCreate(InitializationProvider.java:42)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1917)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1892)
        at android.app.ActivityThread.installProvider(ActivityThread.java:6239)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722) 
        at android.app.ActivityThread.-wrap1(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: java.lang.IllegalAccessException: Class java.lang.Class<androidx.startup.AppInitializer> cannot access private  method void com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.<init>() of class java.lang.Class<com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial>
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at androidx.startup.AppInitializer.doInitialize(AppInitializer.java:140)
        at androidx.startup.AppInitializer.discoverAndInitialize(AppInitializer.java:198) 
        at androidx.startup.InitializationProvider.onCreate(InitializationProvider.java:42) 
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1917) 
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1892) 
        at android.app.ActivityThread.installProvider(ActivityThread.java:6239) 
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722) 
        at android.app.ActivityThread.-wrap1(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

@samuelebistoletti, @merlin-zaraza thank you both a ton for the report.

As far as I can say this may be a bug in jetpack startup library. (at least it was not documented that it is not allowed to be used on Kotlin object classes)
Opened a issue in their tracker for it: https://issuetracker.google.com/issues/171039671

Until I hear back from google, I'll revert the documentation to reference the previous release, as I'd only want to modify all font addons if this is "expected" unsupported behaviour from the library.

You are welcome!

I just started using this lib an also have this crash.
I only copy-pasted the dependencies from the readme using the latest versions:

implementation 'com.mikepenz:community-material-typeface:5.1.0'
implementation 'com.mikepenz:iconics-core:5.1.0'
implementation 'com.mikepenz:materialdrawer-iconics:8.1.8'
implementation 'com.mikepenz:materialdrawer:8.1.8'

What can I do to at least start up correctly? Use an old version?

@binarynoise yes we've reversed the README to the previous version and the release notes to not use v5.1.0

Still waiting for answer from google on this :/

Most likely if no updates will be provided we have to change everything to not be a companion object, which would be a pity

@mikepenz Thanks for the quick answer.

I had to revert to

implementation 'com.mikepenz:community-material-typeface:5.3.45.1-kotlin'
implementation 'com.mikepenz:iconics-core:5.0.3'

IntelliJ complains about that though, urging devs that do not completely read the docs (as me) to upgrade.