You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

升级Android Studio至Narwhal版本后,含Kotlin Synthetics的旧Gradle项目编译失败问题咨询

升级Android Studio至Narwhal版本后,含Kotlin Synthetics的旧Gradle项目编译失败问题咨询

首先直接给你结论:是的,kotlin-android-extensions插件正是导致你编译失败的核心原因,再加上你的Gradle版本、AGP版本、Kotlin版本三者严重不兼容,才触发了这个配置错误。我来一步步帮你解决:

核心问题拆解

  1. kotlin-android-extensions已被彻底移除:这个插件早在Kotlin 1.8版本就被官方废弃,Kotlin 2.x(你用的2.2.0)完全没有这个插件的存在,项目级build.gradle里的对应依赖行完全无效,还会触发配置检查错误。
  2. 版本严重不匹配:你用的Android Studio Narwhal(2021.3.1)最高兼容AGP 7.3.x,但你配了AGP 8.12.0;同时AGP 8.x需要Gradle 7.5+,但你的gradle-wrapper还是6.5;Kotlin 2.2.0和AGP 8.x也没有经过兼容性验证,这一堆版本冲突直接炸了配置检查。

方案一:快速临时修复(仅用于紧急编译,不推荐长期使用)

如果你只是想先把项目跑起来,暂时不想大改代码,可以按以下步骤调整:

1. 修正项目级build.gradle

buildscript {
    ext.kotlin_version = '1.6.21' // 用和AGP 7.3.1兼容的稳定Kotlin版本
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        // 换成和Narwhal IDE兼容的AGP版本
        classpath 'com.android.tools.build:gradle:7.3.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // 删掉这一行!Kotlin 1.8+已彻底移除该插件
        // classpath "org.jetbrains.kotlin:kotlin-android-extensions:2.2.0"
        classpath 'com.google.gms:google-services:4.4.3'
        classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.6'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://maven.google.com/' }
        maven { url 'https://jitpack.io' }
        maven { url "https://s3.amazonaws.com/repo.commonsware.com" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2. 修正模块级build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
// 删掉这一行!移除废弃的Extensions插件
// apply plugin: 'kotlin-android-extensions'
// 保留一个Kotlin插件即可,下面是新写法,和kotlin-android等价
// apply plugin: 'org.jetbrains.kotlin.android'

android {
    namespace "com.estimateapp...."
    compileSdkVersion 36
    defaultConfig {
        applicationId "com.estimateapp....."
        minSdkVersion 24
        targetSdkVersion 36
        versionCode 78
        versionName "0.78"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildFeatures {
        buildConfig = true
        // 临时开启遗留的Synthetics支持(仅AGP 7.x + Kotlin 1.7及以下可用)
        kotlinSynthetics = true
    }
    buildTypes {
        // 你的Build Type配置保留不变
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    packagingOptions {
        // 你的打包配置保留不变
    }
    androidResources {
        noCompress 'pdf'
    }
    kotlinOptions {
        jvmTarget = '1.8' // 和Java toolchain的17统一的话,改成17也行
    }
}

dependencies {
    // 你的依赖配置保留不变
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'

3. 修正gradle-wrapper.properties

AGP 7.3.1需要Gradle 7.4+,更新Gradle版本:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
// 换成兼容的Gradle版本
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

做完以上配置,点击Sync Now,项目应该就能正常编译了。


方案二:彻底迁移到View Binding(推荐,长期维护)

kotlin-android-extensions已经被官方彻底废弃,没有任何后续支持,未来的AGP和Kotlin版本会完全移除相关代码,所以最好彻底迁移到View Binding(官方推荐的替代方案),步骤如下:

1. 开启View Binding

在模块级build.gradleandroid块里添加:

android {
    // 其他配置...
    buildFeatures {
        buildConfig = true
        viewBinding = true // 开启View Binding
        kotlinSynthetics = false // 关闭Synthetics
    }
}

2. 替换所有Synthetics代码

原来用Synthetics直接调用控件ID的写法,要换成View Binding的绑定对象:

在Activity中:

// 导入自动生成的Binding类,命名规则是布局名首字母大写+Binding
import com.estimateapp.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    // 声明Binding对象
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化Binding
        binding = ActivityMainBinding.inflate(layoutInflater)
        // 用binding.root作为ContentView
        setContentView(binding.root)
        
        // 原来的tv_title.text = "测试" 改成下面的写法(ID转驼峰)
        binding.tvTitle.text = "测试"
    }
}

在Fragment中:

import com.estimateapp.databinding.FragmentHomeBinding

class HomeFragment : Fragment() {
    // 用可空类型避免内存泄漏,在onDestroyView时置空
    private var _binding: FragmentHomeBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 使用控件
        binding.btnSubmit.setOnClickListener {
            // 点击逻辑
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null // 销毁时置空,避免内存泄漏
    }
}

3. 清理冗余代码

  • 删掉所有导入的kotlinx.android.synthetic.*
  • 删掉项目中所有和kotlin-android-extensions相关的配置

额外注意点

  • 模块级build.gradle里同时应用了kotlin-androidorg.jetbrains.kotlin.android,两者完全等价,推荐保留新的org.jetbrains.kotlin.android
  • Java toolchain用了17,而kotlinOptionsjvmTarget是1.8,建议统一版本(比如都改成17),避免潜在的编译冲突。

内容来源于stack exchange

火山引擎 最新活动