升级Gradle7.0 ,targetSdkVersion 33. Gradle 文件修改点及其问题汇总

4,367 阅读4分钟

1. 修改版本升级配置项

android{
    compileSdkVersion           = 33
    targetSdkVersion            = 33
}

升级sdk版本之后会有下面的报错

问题一 : compileDebugJavaWithJavac 编译失败

有JdkJavaCompiler字段可以知道是Java编译出错. 项目原jdk版本为jdk 1.8 现升级jdk11解决,总之升级之前先升级jdk11 会少一些报错
Execution failed for task ':app:compileDebugJavaWithJavac'.  
 > Compilation failed; see the compiler error output for details.
 
 Caused by: org.gradle.api.internal.tasks.compile.CompilationFailedException: Compilation failed; see the compiler error output for details.
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:56)
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:39)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:100)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:52)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:38)
	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:51)
	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:37)
	at org.gradle.api.internal.tasks.compile.CleaningJavaCompiler.execute(CleaningJavaCompiler.java:53)

2. 修改 AGP :7.1.2 版本和 Gradle: gradle-7.2-bin.zip

classpath 'com.android.tools.build:gradle:7.1.2'
distributionUrl=https://services.gradle.org/distributions/gradle-7.2-bin.zip

修改之后编译出错,由于项目中有buildSrc有maven脚本,Gradle中的一些引用库的方式和maven上传的方式需要做修改

问题二: Plugin with id 'maven' not found.

A problem occurred evaluating project ':buildSrc'.
> Plugin with id 'maven' not found.
apply plugin: 'maven'
修改成
apply plugin: 'maven-publish'

问题三: Could not resolve all dependencies for configuration ':buildSrc:compileClasspath'. Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository 'maven(http://xxxxx) to redirect to a secure protocol (like HTTPS) or allow insecure protocols. See docs.gradle.org/7.2/dsl/org… for more details.

gradle 7 接入maven库推荐使用https://, 可以添加 allowInsecureProtocol 允许使用一个不安全的链接,给项目中http的maven地址添加上这个属性

maven {
    url 'http://xxxxxxxx'
}

修改后

maven {
    allowInsecureProtocol = true
    url 'http://xxxxxxxx'
}

问题四: > Could not find method uploadArchives() for arguments

maven上传task 不支持 新的maven上传脚本,参考了android官网 : Use the Maven Publish plugin 和 gradle官网 : Publishing a Java library


uploadArchives {
    repositories {
        mavenDeployer {
          
            pom.project {
                //开发者名称
                ...
                //开发者信息链接
                ...
                // 描述信息
                ...
                // 组 id  版本号
                groupId = GROUP_ID
                artifactId = ARTIFACT_ID 
                version = 1.0.0
                // License 信息
                ...
              
            }
            
            repository(url:"maven地址"){
                authentication(userName: "用户名", password:"密码")
            }
            snapshotRepository(url: "snapshot的maven地址") {
                authentication(userName: "用户名", password:"密码")
            }

        }
    }
}

修改成


afterEvaluate {
    publishing {
         publications {
            release(MavenPublication) {
                from components.java
                groupId = GROUP_ID
                artifactId = ARTIFACT_ID
                version = 1.0.0
            }
            snapshot(MavenPublication) {
                from components.java
                groupId = GROUP_ID
                artifactId = ARTIFACT_ID
                version = 1.0.0-snapshot
            }
            mavenPom(MavenPublication) {
                pom {
                  ...
                    //开发者
                    ...
                    //开发者名称
                    ...
                    //开发者信息链接
                    ...
                    //描述
                    ...
                    // License
                  
                }
            }
        }
        repositories {

            maven {
                name ="local"
                allowInsecureProtocol true
                url = '../repo'
            }
            maven {
                credentials {
                    username = "username"
                    password = "password"
                }
                name ="release"
                allowInsecureProtocol true
                url = '../repo/release'
            }
            maven {
                name ="snapshot"
                credentials {
                    username = "username"
                    password = "password"
                }
                allowInsecureProtocol true
                url = '../repo/snapshot'
            }
        }
    }
}

新版上传脚本还是有很大的差别的, 上边的 release snapshot mavenPom可以自己定义随便写什么都 可以 release snapshot可以理解成两个环境 比如android studio 中的 debug release环境,用于区分release版本和snapshot版本的版本信息差异, mavenPom描述信息 , repositories 要上传的仓库信息,这里使用 name ="xxxx"例如 name ="local" 配置了三个上传地址. 这样我们可以选择性的上传哪个版本到哪个maven地址, 说了这么多如何去触发上传呢,在我们的studio中 点击右侧Gradle-->找到当前的module项目-->Tasks-->publishing 这个目录下会有基于release snapshot mavenPom repositories的组合打包上传方式 ,例如:publishReleasePublicationToReleaseRepository 会用release版本信息上传打ReleaseRepository仓库中

image.png

问题五 startup failed:/Users/...../.groovy: 3: unable to resolve class com.android.utils.FileUtils

 @ line 3, column 1.
   import com.android.utils.FileUtils
   ^

去项目目录下去查看 FileUtils 是存在的 只是在.grovvy中无法引用到, 猜测这里可能是因为引用包的可见性导致的, 我们只是引用了api ('com.android.tools.build:gradle:7.1.2') 而我们需要的FileUtils是在这引用下的子引用当中的,需要重新依赖下这个库 api 'com.android.tools:sdk-common:30.1.3' 文集得到解决

问题六 : > No signature of method: build_5az1topmf0yn4uzq5w5n02u0a.android() is applicable for argument types: (build_5az1topmf0yn4uzq5w5n02u0arunclosure1)values:[build5az1topmf0yn4uzq5w5n02u0a_run_closure1) values: [build_5az1topmf0yn4uzq5w5n02u0a_run_closure1@3ab027ce]

androi{}下有不支持的方法 注释掉这三行行

    annotationProcessorOptions {
        includeCompileClasspath true
    }

问题七: android:exported needs to be explicitly specified for element <activity#xx.xx..xxxActivity>. Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See developer.android.com/guide/topic… for details.

对外暴露组价需要在清单文件中添加android:exported 属性,启动页必须使用android:exported=true其他组件需要外部应用去调用的都需要android:exported=true,自己应用内使用的的可以是false我们可以自己在清单文件下添加android:exported 对于三方库中的清单文件我们可以在自己的清单文件下复写有问题的组件 ,编译运行时会自动合并属性,当然也有其他开发这使用脚本编译时插入export的方式

脚本添加'export'属性地址

上边链接文章中可看到脚本在gradle7.0上不支持自动修改,与编译task方式有关,所以还是稳妥的手动修改省去其他麻烦.

修改这些之后就可以编译通过了,至于TargetSdkVerion 的适配下一篇文章再整理