一、前言
AndroidStudio是以IntelliJ IDEA为基础的,结合Android开发平台工具SDK,形成一套AndroidStudio+Gradle+AGP(Android Gradle Plugins)组合起来的编译环境。因各种原因(比如目标版本升级、AndroidX库版本升级等)整套编译环境就需要更新,因为AndroidStudio、Gradle、AGP三者之间版本有着千丝万缕的关系,他们之间版本兼容有问题,编译环境将会瘫痪。当然,Gradle运行基于JDK,因此JDK版本兼容也是需要关注的。
笔者建议:如非必要,无需将项目的编译环境升级到最新,尤其是制作SDK的项目,因为这可能会给那些接入你所开发的库的团队带来很多麻烦。
二、问题以及解决方案
笔者前面有写过一篇文章关于IntelliJ IDEA + Gradle搭建kotlin开发环境遇到的各种坑,其实上面提到很多关于开发环境搭建的兼容性问题,同样适用于Android开发环境,比如插件下载失败、AndroidStudio、Gradle、AGP、JDK之间的版本兼容等,同样的问题在此就不再重复,遇到一些兼容问题也可以参考:在IntelliJ IDEA编辑器中基于Gradle编译器搭建Kotlin开发环境遇到的各种坑
2.1 AGP升级8.0+之后代码中使用R类引用资源问题
AGP升级到8.0+之后,同时需要升级Gradle 8.0+,并且有可能需要同时升级AndroidStudio、JDK来兼容。可以在官网中查询使用的AGP版本所需要的最低支持版本的Gradle。更新适配AGP版本的Gradle。
在AGP升级到8.0+之后,笔者发现一个问题,就是在引用依赖库的模块中,是无法在代码中直接使用R来引用依赖库中的资源的。在之前的版本,只要引入依赖,就可以在模块中直接使用模块的R来引用依赖库的资源,但是AGP升级到8.0+之后,这些代码就会报错了。如下示例:
libraryA:com.library.a
|- res
|- layout
|- activity_test.xml
---------------------------------------------------------------------------------
applicationB:com.application.b
|- java
|- Test.java
如果在applicationB中引用libraryA,在以前的版本,在Test.java的代码中,可以直接使用R.layout.activity_test 来引用libraryA中的布局资源,此时的R类是com.application.b.R.class,但是在升级AGP 8.0+之后,这个调用就会报错。
其实这个解决方法也很简单,就是显式地引用libraryA中的R类,也就是在Test.java的代码中,使用com.library.a.R.layout.activity_test实现资源引用。
2.2 AndroidStudio版本过低无法支持高版本AGP
在升级过程中,如果出现以下提示,就是由于AndroidStudio版本过低,无法支持高版本的AGP。
The project is using an incompatible version (AGP 8.13.0) of the Android Gradle plugin. Latest supported version is AGP 8.7.3
上面错误信息大致就是,当期的AGP版本是8.13.0,当前AndroidStudio支持最高AGP版本为8.7.3。此时的解决办法就是升级AndroidStudio版本或者降低AGP的版本。
2.3 升级AGP 8.0+之后包名配置错误
在升级AGP 8.0+之后,编译提示清单文件中存在不正确的package配置,报错信息如下
Incorrect package="com.xxx.xxx" found in source AndroidManifest.xml
这个错误是因为APG 8.0+之后,模块包名声明的方法变了,旧版本是在AndroidManifest.xml清单文件的顶级节点中使用package来声明,这个包名只是用来生成R文件,库模块也可以包含有,对于程序模块,应用程序的包名是在build.gradle中在android/defaultConfig闭包中通过applicationId来声明的(也就是程序包名跟R文件包名可以不一样)。也许是为了避免混淆,所以在AGP 8.0+,引入了命名空间的概念,将生成R文件用的包名定义为命名空间,并且只能在build.gradle文件中的android闭包中使用namespace来声明。如下示例:
plugins {
id 'com.android.application'
}
android {
// 命名空间,R类的包名
namespace 'com.xxx.xxx.namespace'
compileSdk = 33
defaultConfig {
minSdk 24
targetSdk 33
// 程序包名
applicationId "com.xxx.xxx.app"
versionName "1.0.0"
versionCode 1
multiDexEnabled true
}
}
持续更新中。。。。。
三、编后语
Android开发环境遇到的问题千千万,希望总结对广大网友有帮助,有遇到新奇的问题以及解决方案,可以留言。
1626

被折叠的 条评论
为什么被折叠?



