一件Flutter升级到最新版本所引发的血案

2,971 阅读1分钟

由于第三方依赖库的较新问题,我们务必把flutter升级到最新版本,也就是3.24.5,否则无法引入第三方库

升级后debug开发调试还是非常松弛和happy的,直到我给产品打正式包时。。。。

企业微信截图_08e6b683-b4ec-4af0-8bf5-eb14d18de06f.png

编译崩溃‭😣😣😣

根据经验知觉,初步怀疑kgp版本不兼容导致

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"‭​​‌‌‍⁢‎⁢

于是反复的修改kgp版本,几乎把每个版本试了一遍,没有任何变化 ‭​​‌‌‍⁢‎⁢1hours later 。。。。。‭​​‌‌‍⁢‎⁢

最近好像刚升级了android studio,于是试了最近的几个编译器版本,各种清缓存等骚操作 ‭​​‌‌‍⁢‎⁢1hours later 。。。‭​​‌‌‍⁢‎⁢

在各种崩溃后我把问题点怀疑到gradle身上,也就这里

classpath 'com.android.tools.build:gradle:7.4.2'‭​​‌‌‍⁢‎⁢

为了印证我的猜想,我用新版本的flutter创建了一个项目果然是很新的agp8.3,整个脚本和配置文件的变化跟我们的配置非常大,如果项目的配置和最新flutter创建的项目配置一致应该是可以解决这种兼容问题,解决问题的思路是不是非常富有逻辑和合理

于是我跌入了另一个深渊~~~ ‭​​‌‌‍⁢‎⁢agp7.0到agp8.0的跨时代适配问题‭​​‌‌‍⁢‎⁢!!!‭​​‌‌‍⁢‎⁢ 1 days later。。。‭​​‌‌‍⁢‎⁢

agp7.0到8.0是一个非常大的改动,为此官方专门给了自动迁移工具

image.png 比较遗憾由于配置问题我们无法使用,于是手动迁移,最快的速度就是模仿!直接参照新建项目的模板来

1 升级agp到8.3

2 更新配置文件方式 在 Flutter 3.16 中,添加了使用 Gradle 的‭​​‌‌‍⁢‎⁢声明式 plugins {} 块‭​​‌‌‍⁢‎⁢,‭​​‌‌‍⁢‎⁢flutter create​​‌‌‍⁢⁢使用插件 DSL 生成的项目使用 Gradle 插件。使用 3.16 之前的 Flutter 版本创建的项目需要手动迁移。这个改动极大,为此官方专门给了文档

‭​​‌‌‍⁢‎⁢docs.flutter.dev/release/bre… 1hours later。。

3 agp本身的升级并不是卡点,最难的是项目所依赖的库如果不是agp8.0及以上需要兼容很多问题

‭​​‌‌‍⁢‎⁢github.com/flutter/flu…

比如agp强制module使用命名空间,异常大概长这样

image.png

第三方库无法改也改不过来,只能通过前期编译阶段解决

于是又逼着复习起安卓工程gradle配置和‭​​‌‌‍⁢‎⁢Groovy语法,经过探索 1hours later。。。‭​​‌‌‍⁢‎⁢

关于命名空间没有的库通过编译阶段赋值解决

    subprojects {‭​​‌‌‍⁢‎⁢
        afterEvaluate { project ->‭​​‌‌‍⁢‎⁢
            if (project.hasProperty('android')) {‭​​‌‌‍⁢‎⁢
                project.android {‭​​‌‌‍⁢‎⁢
                    if (namespace == null) {‭​​‌‌‍⁢‎⁢
                        namespace project.group‭​​‌‌‍⁢‎⁢
                    }‭​​‌‌‍⁢‎⁢
                }‭​​‌‌‍⁢‎⁢


            }‭​​‌‌‍⁢‎⁢
        }‭​​‌‌‍⁢‎⁢
    }‭​​‌‌‍⁢‎⁢

命名空间只是开始,之后发现有的第三方库的kotlin使用的jdk和自己不同步,强行编译解决

subprojects {‭​​‌‌‍⁢‎⁢
//    project.buildDir = "${rootProject.buildDir}/${project.name}"‭​​‌‌‍⁢‎⁢
    afterEvaluate {‭​​‌‌‍⁢‎⁢
        // check if android block is available‭​​‌‌‍⁢‎⁢
        if (it.hasProperty('android')) {‭​​‌‌‍⁢‎⁢
            def javaVersion = JavaVersion.VERSION_17‭​​‌‌‍⁢‎⁢
            android {‭​​‌‌‍⁢‎⁢
                def androidApiVersion = 34‭​​‌‌‍⁢‎⁢
                compileSdkVersion androidApiVersion‭​​‌‌‍⁢‎⁢
                defaultConfig {‭​​‌‌‍⁢‎⁢
                    targetSdkVersion androidApiVersion‭​​‌‌‍⁢‎⁢
                }‭​​‌‌‍⁢‎⁢
                compileOptions {‭​​‌‌‍⁢‎⁢
                    sourceCompatibility javaVersion‭​​‌‌‍⁢‎⁢
                    targetCompatibility javaVersion‭​​‌‌‍⁢‎⁢
                }‭​​‌‌‍⁢‎⁢
                tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {‭​​‌‌‍⁢‎⁢
                    kotlinOptions {‭​​‌‌‍⁢‎⁢
                        jvmTarget = javaVersion.toString()‭​​‌‌‍⁢‎⁢
                    }‭​​‌‌‍⁢‎⁢
                }‭​​‌‌‍⁢‎⁢
                println("Setting java version to ${javaVersion.toString()} which is $javaVersion ${group}" )‭​​‌‌‍⁢‎⁢
                println("Setting compileSdkVersion and targetSdkVersion to $androidApiVersion ${group}")‭​​‌‌‍⁢‎⁢
            }‭​​‌‌‍⁢‎⁢
        }‭​​‌‌‍⁢‎⁢
    }‭​​‌‌‍⁢‎⁢
}‭​​‌‌‍⁢‎⁢

有了命名空间package也是多余,部分库也报错,通过脚本和改动解决。。。。

kotlin id丢失知道吗,这样解决

‭​​‌‌‍⁢‎⁢stackoverflow.com/questions/5…

编译文件缺失,这个样子

# Please add these rules to your existing keep rules in order to suppress warnings.‭​​‌‌‍⁢‎⁢


# This is generated automatically by the Android Gradle plugin.‭​​‌‌‍⁢‎⁢

这个缺失的文本内容会生成在out中的map里,同步到自己的混淆文件解决

总之一直在适配兼容的路上。。。还有什么打包apk找不到,编译成功,启动app闪退,无数的问题让我感觉在解决问的路上越来越远,虽然升级agp和flutter一样思路是对的,但是在有限的时间内已经是一个不可能完成的任务,这段时间跟产品谈需求交付节奏都没了底气,锅都没有,还咋做饭‭​​‌‌‍⁢‎⁢

stop! stop! stop!

‭​​‌‌‍⁢‎⁢最终回到了原点,我开始思考问题本身,如果只是其他库和我们的库sdk不兼容的问题能否借鉴刚才的脚本解决?‭​​‌‌‍⁢‎⁢

于是尝试一下这样配置,能否把不兼容的版本掰回来

subprojects {‭​​‌‌‍⁢‎⁢
    afterEvaluate {project ->‭​​‌‌‍⁢‎⁢
        if (project.hasProperty("android")) {‭​​‌‌‍⁢‎⁢
            android {‭​​‌‌‍⁢‎⁢
                compileSdkVersion 34‭​​‌‌‍⁢‎⁢
                buildToolsVersion "34.0.0"‭​​‌‌‍⁢‎⁢
            }‭​​‌‌‍⁢‎⁢
        }‭​​‌‌‍⁢‎⁢
    }‭​​‌‌‍⁢‎⁢
}‭​​‌‌‍⁢‎⁢

终于 success!‭​​‌‌‍⁢‎⁢

经过2天的煎熬,支棱,坚持,终于迎来了胜利的曙光,特写此文,以纪念我2024年所花费的两天宝贵青春‭​​‌‌‍⁢‎⁢![]