最新版本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