Timo Drick

    Timo Drick

    2 years ago
    When updateing to Android Studio 4.2 canary 8 and gradle build tools 4.2.0-alpha8 i get following compiler error:
    LiveLiterals$ComposeWidgetsKt.class: D8: com.android.tools.r8.errors.b: Space characters in SimpleName 'Int$arg-0$call-layout$branch$if$fun-measure$class-$no name provided$$arg-0$call-then$fun-visibility' are not allowed prior to DEX version 040
    Compiling with
    classpath 'com.android.tools.build:gradle:4.2.0-alpha07'
    works fine. also upgraded to gradle 6.6-rc-6
    r

    romainguy

    2 years ago
    That bug was reported on another Slack channel, @Leland Richardson [G] can give more info
    l

    Leland Richardson [G]

    2 years ago
    eh. this bug is freaking me out a bit. So the root cause of the bug is from the compose compiler treating an anonymous class incorrectly because its name has a space in it. It’s a simple bug and should be fixed soon. BUT, the bigger issue is that this is a bug from code that shouldn’t get run except for in the Preview tool in studio. Can you clarify:1. this bug is happening in a normal gradle build from command line? 2. if yes, does it persist when you blow away your gradle cache?
    Timo Drick

    Timo Drick

    2 years ago
    1. yes it happens also on command line 2. it perists when i am deleting the .gradle project folder and also deleting the ~/.gradle/caches folder It only fails in my little bit more complex projects not in a simple hello world sample
    l

    Leland Richardson [G]

    2 years ago
    well the error message can show you the root cause and you can get around the exception (looks like there is a top level
    visibility
    function which calls
    then
    which passes in an anonymous class as the first argument. If you change this to a named-class the error will go away
    but if you can not do that first and help me diagnose why this code is running in the first place, i would be very grateful 🙂
    can you try adding this to your gradle file?
    kotlinOptions.freeCompilerArgs += ['-P', 'plugin:androidx.compose.plugins.idea:liveLiterals=true']
    or actually, “false” is what we want here
    kotlinOptions.freeCompilerArgs += ['-P', 'plugin:androidx.compose.plugins.idea:liveLiterals=false']
    i wonder if that fixes it
    Timo Drick

    Timo Drick

    2 years ago
    added it but does not helped
    l

    Leland Richardson [G]

    2 years ago
    with false or true?
    Timo Drick

    Timo Drick

    2 years ago
    Both
    l

    Leland Richardson [G]

    2 years ago
    hmm. i’m not sure the flag is correct then
    maybe
    kotlinOptions.freeCompilerArgs += ['-Pplugin:androidx.compose.plugins.idea:liveLiterals=false']
    if that doesn’t work, i’ll stop trying to get you to try stuff and just work on reproducing myself, sorry
    you should be able to fix it by changing the anonymous class to a named one
    Timo Drick

    Timo Drick

    2 years ago
    But i was able to solve the problem by following your description
    l

    Leland Richardson [G]

    2 years ago
    (there is nothing wrong with your code, it is a bug in the compose compiler)
    Timo Drick

    Timo Drick

    2 years ago
    tried the Pplugin:androidx.compose.plugins.idea:liveLiterals=false' but did not solved the problem
    l

    Leland Richardson [G]

    2 years ago
    but the code that is causing it shouldn’t be running in the first place
    Timo Drick

    Timo Drick

    2 years ago
    I do not have any compose previews in my code. And also removed the androidx.ui:ui-tooling dependency but the problem is still there
    l

    Leland Richardson [G]

    2 years ago
    yeah its a different code generation pathway
    but not supposed to be on by default
    i fear this may be a bug with AGP
    Timo Drick

    Timo Drick

    2 years ago
    @Leland Richardson [G] thank you for your fast response. So at least i am able to use canary 8 now 😄
    l

    Leland Richardson [G]

    2 years ago
    no problem
    fair warning though: if this codegen is running, the resulting compose code will not be as efficient as it should be. so please don’t go posting any “compose is slow” blog posts in the mean time if you don’t mind 😱
    Timo Drick

    Timo Drick

    2 years ago
    oh i just saw that i tested the compiler options on the wrong module. Please let me rerun the tests. Just a second
    l

    Leland Richardson [G]

    2 years ago
    that would be great, thanks!
    Timo Drick

    Timo Drick

    2 years ago
    No sorry set the options on every module. The problem code is inside of a library module. And the library itself compiles fine. Just when i use the library in an app module the app module will not compile
    l

    Leland Richardson [G]

    2 years ago
    yeah the bug itself is happening in the dex phase, so you will only see it when you build the app
    but that flag (though the format of these flags always elude me so i might just be off by a character somewhere) was supposed to turn this off. but AGP could be re-setting it in a way that it’s not able to be turned off 😕
    Timo Drick

    Timo Drick

    2 years ago
    Btw. i am working now for several month with compose and i was able to measure an increase in performance in my custom LazyColumn implementations. Now the release builds are near to the performance of legacy android recyclerview lists. (I do tests with many images also loading images in background during fast scrolling throw the list) Showing the HWUI rendering Bars now constantly under the green line (most of the time just half the way to green)
    l

    Leland Richardson [G]

    2 years ago
    ah cool. good to hear. are your lazycolumn implementations OSS?
    Timo Drick

    Timo Drick

    2 years ago
    What do you mean with OSS? I just started a custom one before AdapterList worked well. I think now the official LazyColumn implementation is stable but still misses some features. My implementation works a little bit different than the official one. It just uses Layout and dynamically changing the child views that are rendered. But performance wise it is very close to the LazyColumn implementation.https://gitlab.com/timod/compose-playground/-/blob/master/compose_list/src/main/java/de/drick/compose/list/LayoutList.kt
    l

    Leland Richardson [G]

    2 years ago
    This is excellent! Thanks for sharing. Indeed LazyColumn is missing a lot of features / use cases still while we nail down the API. It makes me really happy to see folks like you diving in and making your own though! Very cool. Do you mind if I point people to this from time to time? BTW, by “OSS” i mean “is it open source” which could mean a few things i guess, but I was mostly curious if you were planning on publishing it as a 3rd party library alternative to LazyColumn (which I think would be great, just to be clear).
    Timo Drick

    Timo Drick

    2 years ago
    Of course i would be happy if you point out my implementation. But it is also under heavy development and also misses features 🙂 (Just solved some things i need) Currently i am playing around getting flows working as input. For this i need a feedback when the end of list is reached.
    I am planning to release this also as a library.