android开发将项目升级到target35的解决方法

出于上架等要求,需要android项目升级target 35以上,target 35默认需要gradle 8.x之后才能编译成功,下面提供两种解决方法

1. 如何只升级target到35,不需要升级gradle到8.x也能编译成功呢,毕竟升级gradle一般要处理不少问题,特别是升级到gradle 8.x,需要改动的东西不少
  • 具体参考别人家的这篇文章吧:https://juejin.cn/post/7534903589255069722 ,主要内容就是:
      1. 处理编译报错问题
      1. 在gradle.properties文件强制指定aapt2版本问题:
      # gradle.properties
      android.aapt2FromMavenOverride=/Users/xxx/Android/sdk/build-tools/35.0.1/aapt2
      
      1. 因为步骤2出现了硬编码,可以使用gradle脚本实现,别人都写好了fixTarget35.gradle:https://gist.github.com/sickworm/ee2d64b12a770a88e7c860ae4058634a
      1. R8 编译失败,网上的解决方案是指定 R8 版本:
      buildscript {
          repositories {
              maven {
                  url = uri("https://storage.googleapis.com/r8-releases/raw")
              }
          }
          dependencies {
              classpath 'com.android.tools:r8:8.4.27'
          }
      }
      
2. 老老实实升级到gradle 8.x版本,不过改修东西比较多,这里简单记录一些
    1. 缺少namespace问题,针对这个问题,可以通过gradle在编译期间强制指定,具体可以参考::https://blog.csdn.net/weixin_43952004/article/details/143177043
      subprojects {
          afterEvaluate { project ->
              if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) {
                  println "project: ${project.name} Namespace get: ${project.android.namespace}"
                  def packageName = project.android.namespace ?: project.android.defaultConfig.applicationId ?: project.android.sourceSets.main.manifest.srcFile.text.find(/package="([^"]*)"/) ?: project.group
                  project.android.namespace = packageName
                  println "Namespace set to: ${packageName} for project: ${project.name}"
                  def manifestFile = project.android.sourceSets.main.manifest.srcFile
                  if (manifestFile.exists()) {
                      def manifestText = manifestFile.text
                      if (manifestText.contains('package=')) {
                          manifestText = manifestText.replaceAll(/package="[^"]*"/, "")
                          manifestFile.text = manifestText
                          println "Package attribute removed in AndroidManifest.xml for project: ${project.name}"
                      } else {
                          println "No package attribute found in AndroidManifest.xml for project: ${project.name}"
                      }
                  } else {
                      println "AndroidManifest.xml not found for project: ${project.name}"
                  }
              }
          }
      }
      
      
    1. java或者kotlin版本不一致问题,这里统一指定为1.8
      allprojects {
          repositories {
              google()
              mavenCentral()
              maven { url 'https://maven.aliyun.com/repository/central' }
              maven { url 'https://maven.aliyun.com/repository/public' }
              maven { url 'https://maven.aliyun.com/repository/google'}
              maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
          }
          tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
              kotlinOptions.jvmTarget = '1.8'
          }
          afterEvaluate { project ->
              if (project.hasProperty('android')) {
                  android {
                      compileOptions {
                          sourceCompatibility JavaVersion.VERSION_1_8
                          targetCompatibility JavaVersion.VERSION_1_8
                      }
                  }
              }
          }
      }
      
posted @ 2025-08-11 17:59  yongfengnice  阅读(232)  评论(0)    收藏  举报