Android Studio新版本的一个资源id无法找到的bug解决

Android Studio新版本的一个资源id无法找到的bug解决

文章目录

一、前言

Android Studio 导入以前的项目发现资源文件明明有id声明了,但是无法Java代码中无法识别的问题。

比如switch 的case R.id.textView: 会编译报错,这个textView 已经在res的布局文件中有声明了。

后面验证对比了一下,发现是Android Studio Gradle版本的一个bug:

gradle 6.5 没有这个问题
gradle 8.7 就有这个问题

新下载的Android Studio默认都是使用的最新的gradle版本8.7,当然也能兼容旧版本的gradle。

这是一个小问题,在配置文件中多配置一个属性"android.nonFinalResIds"就行了。

下面简单记录一下。

二、Android Studio的无法获取到资源id的bug

1、一段简单的Java代码

    //首先layout的一个TextView已经声明了textView的id
    private void test(View view) {
        if (v.getId() == R.id.textView) { //这里不会编译报错
            return;
        }
        switch (view.getId()) {
            case R.id.textView: //这行会编译报错!
                break;
            default:
                break;

        }

    }

把上面这段代码加载新版本的Android Studio项目的任意一个类中直接编译是会报错的。

1、错误现象

上面可以看到报错信息是:

Constant expression required (需要常量表达)

简单的理解就是,gradle 编译环境认为 R.id.textView 不是一个数值。

这个算是Android Studio 新版本的有个误判吧。

网上也有人是这样说的:

Android Studio 中使用switch语句时报错Constant expression required:
在Android Studio中使用JDK17以上版本,会出现switch语句报错:
"Constant expression required"的问题,
这是因为在JDK17中switch语句的条件表达式支持使用枚举类型,而这个特性还没有被支持。

但是我用gradle 8.7搭配JDK8 也是有问题的,说明还是和Android Studio的编译环境有关。

2、错误解决方法

通过网上搜索还是能发现了解决方法如下:

在 gradle.properties 文件添加一个ResIds跳过检测的属性。

Demo\gradle.properties

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
android.nonTransitiveRClass=true
android.nonFinalResIds=false //id 找不到文件解决!

上面三个配置属性是默认就有的,第四个需要自己添加进去;

如果还有其他需求属性也是可以自己添加进入比如.kt代码,要加对应的支持属性,才能编译。

三、其他

1、小结

如果是新版本Android Studio 遇到 switch语句时报错Constant expression required,

可以在gradle.properties文件添加android.nonFinalResIds=false 试试,

看看是否能解决这个编译报错问题。

2、gradle.properties文件 其他相关属性

下面这些属性大部分没啥用,有兴趣的可以看看。

(1)构建环境配置属性
org.gradle.jvmargs:
    用于指定 Gradle 守护进程的 JVM参数,对于调整内存设置特别有用。
    例如org.gradle.jvmargs=-Xmx1536m,表示将 Gradle守护进程的最大堆内存设置为 1536MB,
    可根据项目的复杂程度和系统资源情况适当调整此值,以优化构建性能.
org.gradle.parallel:
    当设置为true时,Gradle会在多模块项目中以并行模式运行,能够显著提高构建速度,
    但该选项只适用于解耦的项目,即各个模块之间的依赖关系相对简单的情况。

org.gradle.caching:
    设置为true时,Gradle会缓存构建过程中的输出结果,
    当下次执行相同的构建任务时,如果输入没有变化,
    Gradle 会直接使用缓存的结果,从而大大提高构建速度,
    尤其适用于频繁进行构建操作的项目,如在持续集成环境中.

(2)Android 项目配置属性

COMPILE_SDK_VERSION、MIN_SDK_VERSION、TARGET_SDK_VERSION:
    分别用于指定项目的编译 SDK 版本、最低支持的 SDK 版本和目标 SDK 版本。
    在多开发者协作或项目需要兼容不同设备的场景下,将这些版本号统一配置在gradle.properties文件中,
    可以确保所有开发者使用相同的SDK版本进行开发,避免因版本不一致导致的构建问题.

android.useAndroidX:
    如果设置为true,表示在项目中使用 AndroidX 库。

android.enableJetifier:
    当android.useAndroidX为true时,若项目中依赖了使用旧版 Android Support Library的第三方库,
    设置android.enableJetifier=true可以让 Gradle自动将这些库转换为使用 AndroidX,
    方便项目的集成和升级.提高旧项目的兼容性。
android.nonTransitiveRClass:
    当设置android.nonTransitiveRClass=true时,R类的引用将不再具有传递性。
    在默认情况下(android.nonTransitiveRClass=false),
    如果一个库项目(例如,Android Library)暴露了它的R类,
    那么使用这个库的其他项目(主项目或者其他依赖此库的二级库)可以访问这个库中的所有资源引用,
    包括它所依赖的其他库的资源引用。

android.nonFinalResIds:
    设置为false可以规避gradle高版本编译报错:Constant expression required的问题


(3)依赖管理属性

versions.properties引用:
    可以在gradle.properties文件中定义依赖库的版本号,
    然后在build.gradle文件中通过变量引用这些版本号。
    这样,当需要更新依赖库版本时,只需要在gradle.properties文件中修改相应的版本号,
    而无需在多个build.gradle文件中逐个查找和修改,
    提高了依赖管理的效率和可维护性。
    例如:appcompat_version=1.4.0,
    然后在build.gradle中使用implementation "com.android.support:appcompat-v7:$appcompat_version".
mavenCentral()配置:
    如果项目需要从 Maven Central仓库获取依赖库,
    可以在gradle.properties文件中配置 Maven Central仓库的地址,
    确保项目能够正确地下载和使用所需的依赖。
    例如:repositories { mavenCentral() },
    不过通常情况下,Android Studio 默认会配置 Maven Central 仓库,
    但在某些特殊情况下,
    如需要使用特定的镜像仓库或添加其他私有仓库时,
    就可以在此文件中进行配置。

(4)代码风格与编译选项属性

kotlin.code.style:
    用于设置 Kotlin 的代码风格,可设置为official等,
    以确保项目中的 Kotlin代码遵循统一的风格规范,
    提高代码的可读性和可维护性.

kapt.verbose:
    设置为true时,会启用 Kapt 的详细日志输出,
    显示有关 Kapt 注解处理的警告和详细信息,
    有助于在开发过程中排查与 Kapt 相关的问题,
    特别是在使用 Kotlin 的注解处理器时,
    方便查看注解的处理过程和结果.

kapt.incremental.apt和kapt.use.worker.api:
    这两个属性一起使用可以启用 Kapt 的增量注解处理功能,
    并使用多线程并行编译注解,
    能够显著提高 Kotlin 项目的编译速度,减少编译时间.

3、Android13系统签名应用代码在旧Gradle无法编译的小bug

如果是要用Android Studio编译Android13 或者更新版本的系统签名应用,

需要使用新版本的gradle8.7 ,之前使用gradle6.5 怎么搞都不行;

网上很多人说是更新JDK,我试了也不行,后面更新Android Studio 也不行;

因为旧项目默认使用的是gradle6.5 进行编译的,后面使用gradle8.7 就可以了。

当时情况是使用Android13 系统签名文件放到项目中编译会失败;

使用Android11的系统签名文件放到项目中编译是OK的;

具体情况也可能有不同,

这里只简单说明一下Android13 版本签名文件在Android Studio 旧Gradle无法编译的情况。

相关推荐
恋猫de小郭8 小时前
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
android·ide·android studio
aaaweiaaaaaa11 小时前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
工程师老罗13 小时前
Android记事本App设计开发项目实战教程2025最新版Android Studio
android
pengyu17 小时前
系统化掌握 Dart 编程之异常处理(二):从防御到艺术的进阶之路
android·flutter·dart
消失的旧时光-194317 小时前
android Camera 的进化
android
基哥的奋斗历程19 小时前
Openfga 授权模型搭建
android·adb
Pakho love1 天前
Linux:文件与fd(被打开的文件)
android·linux·c语言·c++
勿忘初心912 天前
Android车机DIY开发之软件篇(九) NXP AutomotiveOS编译
android·arm开发·经验分享·嵌入式硬件·mcu
lingllllove2 天前
PHP中配置 variables_order详解
android·开发语言·php
消失的旧时光-19432 天前
Android-音频采集
android·音视频