最新版本Android Studio导入framework代码编译报错Cannot invoke method getFiles() on null object分析解决

Android Studio导入framework代码编译报错Cannot invoke method getFiles() on null object分析解决

一、前言

Android Studio 导入framework jar包,还需要加入task代码才能让运行代码优先使用framework jar包的类;

task示例代码:

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        Set<File> fileSet = options.bootstrapClasspath.getFiles()
        List<File> newFileList =  new ArrayList<>();
        //"../framework.jar" 为相对位置,需要参照着修改,或者用绝对位置
        newFileList.add(new File("libs/framework_311D2_14.jar"))
        newFileList.addAll(fileSet)
        options.bootstrapClasspath = files(newFileList.toArray())
    }
}

什么场景需要导入framework.jar包 ?

比如framework新增的类或者方法需要导入framework jar包才能调用系统新增的方法;
还有就是系统一些隐藏的api或者类,比如SystemProperties.set("XX","XX"),
只导致系统签名,没导入framework包是会编译报错;
还有热点设置的一些隐藏api也是需要导入framework包后才能调用到。

另外导入framework jar包后,有些系统隐藏api代码会爆红无法链接,但是编译通过,是正常的。

现在的问题是2025 Android Studio新版本添加task编译代码会报一个空指针错误;

如下图所示:

在这里插入图片描述

报错内容:

Build file 'E:\Studio\project\test\BluetootVolume\app\build.gradle' line: 64

Cannot invoke method getFiles() on null object

null 空指针?

为啥会这样,之前用得好好的。

通过分析这个代码是gradle 的代码,问题的原因是不同版本的兼容性有差异。

二、分析解决

1、分析options报错

在这里插入图片描述

点击options打开相关的链接类,发现是gradle包的类;

那是不是修改gradle的版本就可以解决这个问题了?

理论上是这样的,但是需要注意的是gradle 需要配置对应的gradle plugin插件版本,否则编译不通过

2、gradle plugin插件版本信息

在这里插入图片描述

libs.versions.toml 文件好像是2025年的Studio才有的,我也是进行更新Studio版本才发现有这个文件的;

需要在里面定义agp版本,也就是gradle的插件版本。

插件版本必须是比gradle版本低的,

gradle版本是8.11.1,agp版本要低于她,比如8.9.1,设置相同都不同;

gradle版本是8.7,agp版本要低于她,比如8.6.0

旧版本plugins怎么搞?

可以在整个项目的build.gradle里面加入插件版本定义:

dependencies {    
	classpath 'com.android.tools.build:gradle:8.6.0'
 }

如下图所示:

在这里插入图片描述

这里看到新版本Studio也可以使用以前的方式,只要把plugins注释了,就不会编译libs.versions.toml 的信息;

然后按照旧版本的build.gradle添加内容即可。

3、最终修改的地方

(1)修改gradle-wrapper.properties

XX\gradle\wrapper\gradle-wrapper.properties

这个是决定当前项目使用的那个gradle版本进行编译的代码位置;同级目录下还有个gradle的jar包;

在这里插入图片描述

修改代码:

gradle-8.11.1-bin.zip 修改成:gradle-8.7-bin.zip

也就是把gradle 版本修改第一点,但是也不能太低,之前试过6.5版本在新版AS添加系统签名会报错;

(2)如果只修改gradle版本,未修改gradle插件版本会报错

gradle版本是8.7,agp版本要低于她,比如8.6.0。

修改agp 插件版本后还是报错?

在这里插入图片描述

因为首先起依赖作用的是gradle的插件版本。相当于依赖gradle8.7未成功。

这种情况,重启Studio,clean Studio也没用!

需要怎么处理?

我这里好像是先不修改gradle版本,先修改agp插件版本,加载成功后,再修改gradle未8.7就可以正常sync了。

然后,显示修改成功了还是报空指针错误?

在这里插入图片描述

这就有点奇怪了!

对比之前正常运行的代码,发现JDK的版本也有影响,需要降级,把默认的11变成8就OK了。

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11 //修改成VERSION_1_8
        targetCompatibility JavaVersion.VERSION_11 //修改成VERSION_1_8
    }

如下图所示:

在这里插入图片描述

gradle 8.7 版本的兼容JDK11 有点问题!

其实也可以多换几个gradle版本和JDK版本试试,这里的只是做一个参考。

有时候修改这里JDK不一定OK的情况,需要看看自己Studio 设置的配置的JDK环境是否有问题:

在这里插入图片描述

这里好像选择的是默认的,之前试过乱选,也是无法正常编译。

所以这里解决这个空指针是一共修改了三个地方:

(1)gradle-wrapper.properties 修改gradle版本为8.7
(2)libs.versions.toml 修改agp gradle插件版本为8.6.0
(3)修改JDK版本为1.8

三、其他

1、小结

编译报错Cannot invoke method getFiles() on null object 主要原因是Android Studio 的新版本gradle版本不兼容;

需要修改gradle版本需要同步修改gradle的插件版本,有时候还需要修改JDK版本;

Android Studio新版本加上对应的gradle有些bug,需要多验证测试。

2、豆包AI搜索分析解决 编译报错Cannot invoke method getFiles() on null object

(1)分析:
1. **Gradle 插件版本不兼容**
- 项目使用的 Android Gradle 插件(AGP)版本与 Gradle 版本不匹配。
- 插件版本过旧或过新,导致某些 API 返回 `null`。

2. **依赖配置问题**
- 依赖项缺失或版本冲突,导致某些组件无法正确初始化。
- 自定义 Gradle 脚本中引用了不存在的对象。

3. **缓存或索引问题**
- Android Studio 的缓存文件损坏,导致编译时出现异常。
- 项目索引失效,影响 Gradle 构建过程。

4. **代码中存在空值**
- 自定义 Gradle 脚本(如 `build.gradle`、`settings.gradle`)中存在空对象引用。
- 插件或库的配置不正确,导致关键对象未被正确初始化。

(2)解决:

检查并更新 Gradle 插件和版本

确保 build.gradle 文件中的 Android Gradle 插件版本与 Gradle 版本兼容:

// 在 project/build.gradle 中
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        // 使用兼容的 AGP 版本
        classpath 'com.android.tools.build:gradle:8.0.2' // 根据需要调整版本
    }
}

// 在 gradle/wrapper/gradle-wrapper.properties 中
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip

兼容版本参考

AGP 版本 所需 Gradle 版本
8.0.x 8.0+
7.4.x 7.5+
7.0.x 7.2+

其实这里面也是主要分析出gradle和插件版本不兼容导致这个问题;

但是实际AI的处理,并不能解决这个问题,只能是个参考方向;

所以过分依赖AI肯定是不行的。

3、Android Studio版本升级那些事

Android Studio目前最新版本是 2024.2.1 主要版本特征是为了更好支持kotlin代码的编译运行。

2017年的Android Studio 版本已经支持kotlin的正常开发了;
但是真正比较完善的kotlin编辑的版本是2023年的版本;
我这里不是想讲AndroidStudio对kotlin的支持,因为系统开发代码中kotlin虽然有,但是不多,影响比较小。
本文主要是记录一下,Android Studio旧版本无法编译安装Android13 以后的签名应用。

开发Android13 的系统源代码后,我发现我的系统签名文件无法在Android Studio 中加载签名文件编译运行到设备中。
提示报错是:INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
大概意思就是sharedUserId不匹配。

网上看了几个文章说是更新JDK版本就行了,但是试了一下不行,后面更新Android Studio 发现也不行,最后是更新了Gradle为8.7版本就OK了。

下面记录一下。

原文链接:https://blog.csdn.net/wenzhi20102321/article/details/144592801

4、Android Studio 新建Android13 代码提示Build Tools revision XX is corrupted无法编译解决

Android Studio 新建Android13或者app下的build.gradle文件配置 compileSdkVersion 33

编译运行会报错:

Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.

Installed Build Tools revision 33.0.0 is corrupted. Remove and install again using the SDK Manager.

上面提示看似简单,提示重新卸载 再下载Build Tools33.0.0就行了,但实际上重新下载也不行!

其实就是SDK新版本编译环境问题,不用重新下代码,从低版本复制两个文件过去或者修改两个文件的命名就行。

原文链接:https://blog.csdn.net/wenzhi20102321/article/details/138010007

5、Android13 Studio新建的代码编译报错INSTALL_PARSE_FAILED_MANIFEST_MALFORMED解决

Android Studio 新建的Android13 项目代码,编译报错:

04/20 19:56:48: Launching 'app' on device.Installation did not succeed.
The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

List of apks:
[0] 'E:\Studio\project\test\MyApplication\app\build\outputs\apk\debug\app-debug.apk'
Installation failed due to: 'null'

这个错误信息表明安装失败,原因是Android应用的Manifest文件存在格式错误。

Manifest文件是每个Android应用必不可少的一部分,它包含了应用的名称、版本、权限等重要信息。

如果Manifest文件中的某些信息不符合规定或者有语法错误,系统将无法解析这个文件,导致应用无法安装。

新建的项目为啥会报错呢?其实是Android13开始,四大组件都是要设置 exported 属性,否则会报错。其实就是缺少了必要的信息.   

原文链接:https://blog.csdn.net/wenzhi20102321/article/details/138010309