由于第三方依赖库的较新问题,我们务必把flutter升级到最新版本,也就是3.24.5,否则无法引入第三方库
升级后debug开发调试还是非常松弛和happy的,直到我给产品打正式包时。。。。
编译崩溃😣😣😣
根据经验知觉,初步怀疑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是一个非常大的改动,为此官方专门给了自动迁移工具
比较遗憾由于配置问题我们无法使用,于是手动迁移,最快的速度就是模仿!直接参照新建项目的模板来
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使用命名空间,异常大概长这样
第三方库无法改也改不过来,只能通过前期编译阶段解决
于是又逼着复习起安卓工程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年所花费的两天宝贵青春![]