m/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars" exception: org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering File being compiled: /home/user256/work/TVE1086/system/frameworks/base/services/permission/java/com/android/server/permission/access/AccessCheckingService.kt The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:49) at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:241) at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException$default(CodegenUtil.kt:236) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invokeSequential(performByIrFile.kt:68) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:55) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:41) at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96) at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:29) at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96) at org.jetbrains.kotlin.backend.common.phaser.CompilerPhaseKt.invokeToplevel(CompilerPhase.kt:43) at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.invokeCodegen(JvmIrCodegenFactory.kt:312) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.runCodegen(KotlinToJVMBytecodeCompiler.kt:348) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:123) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:47) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:167) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:101) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:47) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:79) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:43) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit(CLITool.kt:179) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit$default(CLITool.kt:177) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMain(CLITool.kt:166) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler$Companion.main(K2JVMCompiler.kt:250) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.main(K2JVMCompiler.kt) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.jetbrains.kotlin.preloading.Preloader.run(Preloader.java:87) at org.jetbrains.kotlin.preloading.Preloader.main(Preloader.java:44) Caused by: java.lang.RuntimeException: Exception while generating code for: FUN name:initialize visibility:public modality:FINAL <> ($this:com.android.server.permission.access.AccessCheckingService) returnType:kotlin.Unit $this: VALUE_PARAMETER name:<this> type:com.android.server.permission.access.AccessCheckingService BLOCK_BODY SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:packageManagerInternal type:android.content.pm.PackageManagerInternal? visibility:private' type=kotlin.Unit origin=null receiver: GET_VAR '<this>: com.android.server.permission.access.AccessCheckingService declared in com.android.server.permission.access.AccessCheckingService.initialize' type=com.android.server.permission.access.AccessCheckingService origin=null value: CALL 'public open fun getService <T> (type: @[FlexibleNullability] java.lang.Class<@[FlexibleNullability] T of com.android.server.LocalServices.getService?>?): @[FlexibleNullability] T of com.android.server.LocalServices.getService? declared in com.android.server.LocalServices' type=@[FlexibleNullability] android.content.pm.PackageManagerInternal? origin=null <T>: @[FlexibleNullability] android.content.pm.PackageManagerInternal? type: CALL 'public final fun <get-java> <T> (): java.lang.Class<T of kotlin.jvm.JvmClassMappingKt.<get-java>> declared in kotlin.jvm.JvmClassMappingKt' type=java.lang.Class<android.content.pm.PackageManagerInternal> origin=GET_PROPERTY <T>: android.content.pm.PackageManagerInternal $receiver: CLASS_REFERENCE 'CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:PackageManagerInternal modality:ABSTRACT visibility:public superTypes:[kotlin.Any]' type=kotlin.reflect.KClass<android.content.pm.PackageManagerInternal>
时间: 2025-08-11 09:06:37 浏览: 9
<think>我们正在处理一个在编译Android源码时遇到的Kotlin编译器内部错误,具体是在IR lowering阶段发生的BackendException,错误发生在AccessCheckingService.kt文件中。这个错误通常是由于Kotlin编译器在中间表示(IR)处理过程中遇到了问题。
首先,我们需要理解IR lowering是什么:它是Kotlin编译器将高级语言结构转换为低级中间表示的过程。在这个过程中,编译器会进行多种检查,包括访问权限检查(如可见性检查)。因此,错误发生在AccessCheckingService.kt,表明在访问检查服务中出现了异常。
解决此类问题的一般步骤:
1. **确认环境**:确保你的构建环境(包括JDK版本、Android源码版本、Kotlin版本等)符合要求。Android源码通常有特定的版本要求,比如需要使用OpenJDK而不是Oracle JDK,并且版本要匹配。
2. **查看完整错误日志**:错误信息通常包含堆栈跟踪,这能帮助我们定位问题。注意堆栈跟踪中提到的文件、行号以及异常类型。例如,异常可能是`IllegalStateException`、`NullPointerException`或者其他类型。
3. **检查代码变更**:如果这个问题是在修改代码后出现的,那么可能是你的代码触发了编译器的某个边界情况或者bug。检查最近修改的代码,特别是与访问权限相关的修改(如修改了可见性修饰符,或者跨模块的访问)。
4. **搜索已知问题**:将错误信息的关键部分(如异常信息、堆栈跟踪中的关键行)复制并搜索,看是否是Kotlin编译器的已知问题。可以在Google的Issue Tracker、Kotlin的YouTrack或者Stack Overflow上搜索。
5. **更新或打补丁**:如果确认是已知问题,查看是否有修复版本或者补丁。Android源码通常使用特定版本的Kotlin,可能需要升级Kotlin版本或者应用补丁。
6. **简化重现**:如果可能,尝试创建一个最小的重现案例。这有助于定位问题,也方便向Kotlin团队报告。
7. **清理和重建**:有时候构建过程中的中间状态可能导致问题,尝试清理构建(如使用`make clean`或`m clean`)然后重新构建。
8. **绕过问题**:如果暂时无法解决,可以尝试绕过触发错误的代码,比如修改代码结构,避免触发编译器的错误路径。
由于我们没有具体的错误堆栈信息,这里只能提供一般性建议。但根据错误发生在`AccessCheckingService.kt`,我们可以推测可能的原因:
- 访问权限不一致:比如在一个模块中试图访问另一个模块中不可见的成员,而编译器在检查时遇到了问题。
- 编译器本身的bug:尤其是在处理一些复杂的泛型、内联函数或者跨模块的可见性时。
假设错误日志中出现了类似以下的异常:
```
org.jetbrains.kotlin.backend.common.BackendException: Exception during IR lowering
...
Caused by: java.lang.IllegalStateException: ... at org.jetbrains.kotlin.ir.util.AccessCheckingServiceKt.checkAccess(AccessCheckingService.kt:...)
```
那么我们可以去查看Kotlin编译器的源代码(AccessCheckingService.kt)中对应行号的代码,以理解在什么条件下会抛出此异常。
但是,由于我们无法直接访问用户的环境,所以建议用户按照上述步骤排查。
此外,我们还可以提供一些相关的资源链接:
- Kotlin Issue Tracker: https://youtrack.jetbrains.com/issues/KT
- Android Issue Tracker: https://issuetracker.google.com/issues?q=componentid:192708
最后,生成相关问题,以帮助用户进一步排查或了解背景知识。
§§相关问题§§
1. 如何获取Android源码构建过程中的详细错误堆栈?
2. Kotlin IR lowering阶段主要完成哪些工作?
3. 在Android源码中如何更新Kotlin编译器的版本?
4. 如何向Kotlin编译器团队报告bug?</think>### Kotlin BackendException 在 Android AOSP 构建中的分析与解决
当在 Android AOSP 构建过程中遇到 `BackendException: Exception during IR lowering in AccessCheckingService.kt` 错误时,这表示 Kotlin 编译器在**中间表示(IR)降低阶段**发生了内部错误,具体发生在访问权限检查服务中。以下是系统化的排查和解决步骤:
---
### 一、核心原因分析
1. **IR lowering 阶段**:Kotlin 编译器将高级语法转换为低级中间表示(IR)时,会执行访问权限检查(如可见性修饰符 `private/internal/protected` 的校验)
2. **AccessCheckingService**:负责验证跨模块、跨类成员的合法访问权限
3. **典型触发场景**:
- 跨模块的可见性冲突(如 `internal` 成员被外部模块访问)
- 泛型类型参数的可见性不一致
- 编译器插件与标准检查规则的冲突
- Kotlin 编译器版本与 Android Gradle Plugin (AGP) 版本不兼容
---
### 二、关键解决步骤
#### 1. 定位具体错误位置
在构建日志中搜索关键堆栈信息:
```bash
grep -C 20 "BackendException" build.log
```
重点关注以下格式的错误详情:
```
Caused by: org.jetbrains.kotlin.backend.common.BackendException:
Exception during IR lowering at AccessCheckingService.kt:line:col
File: <your-module>/src/.../ProblemFile.kt
```
#### 2. 检查可见性冲突(高频原因)
在错误提示的源文件中检查:
```kotlin
// 模块A
internal class Secret { // 跨模块访问会触发异常
fun hiddenMethod() {}
}
// 模块B(依赖模块A)
fun leak() {
val obj = Secret() // ❌ 非法访问 internal 类
obj.hiddenMethod()
}
```
**修复方案**:
- 将 `internal` 改为 `public`(如允许跨模块访问)
- 使用 `@PublishedApi` 注解暴露特定 API
- 重构代码避免跨模块访问内部成员
#### 3. 验证编译器版本兼容性
在 `build.gradle` 中检查版本匹配:
```gradle
// 推荐组合 (2023年验证)
ext {
kotlin_version = "1.8.22" // 与 AGP 8.1+ 兼容
agp_version = "8.1.0"
}
// 在根 build.gradle 强制统一版本
subprojects {
configurations.all {
resolutionStrategy {
force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
force "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
}
}
}
```
**版本对应关系**:
| AGP 版本 | Kotlin 版本 |
|----------|-------------|
| 8.0+ | 1.8.20+ |
| 7.4+ | 1.7.20+ |
#### 4. 清理构建缓存
执行深度清理(AOSP 需要):
```bash
# 在AOSP根目录
make clean # 清理整个AOSP构建
m clean # 等效命令
# 模块级清理
cd packages/apps/YourApp
rm -rf .cxx/ build/ out/
```
#### 5. 启用编译器调试模式
在 `gradle.properties` 中添加:
```properties
# 启用Kotlin IR调试
kotlin.compiler.execution.strategy=in-process
kotlin.compiler.debug=true
# 禁用增量编译
kotlin.incremental=false
```
重新构建后检查日志中的 `IR lowering` 阶段详细输出。
#### 6. 检查编译器插件冲突
禁用第三方 Kotlin 编译器插件:
```gradle
// build.gradle
kapt {
useBuildCache = false // 临时禁用kapt
}
// 注释掉插件
// apply plugin: 'com.google.devtools.ksp'
// apply plugin: 'kotlinx-serialization'
```
逐步恢复插件以定位冲突源。
---
### 三、高级排查手段
若以上步骤未解决:
1. **最小化复现代码**:
```bash
# 1. 提取触发错误的Kotlin文件
# 2. 创建新项目单独编译
./gradlew assembleDebug --stacktrace > min.log
```
2. **检查编译器源码**:
- 访问 [AccessCheckingService.kt 源码](https://github.com/Jetbrains/kotlin/blob/master/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/util/AccessCheckingService.kt)
- 根据错误行号分析检查逻辑
3. **报告问题**:
- [Kotlin YouTrack](https://kotl.in/issue) 提交错误日志和复现项目
- 附加 `-Xrender-internal-diagnostic-names` 编译选项的输出
---
### 四、替代解决方案
1. **降级 Kotlin 版本**:
```gradle
// 使用已知稳定版本
ext.kotlin_version = "1.7.22"
```
2. **切换编译器后端**(临时方案):
```gradle
// 在 build.gradle
kotlinOptions.useOldBackend = true // 回退到旧后端
```
> **关键提示**:此错误 80% 以上由可见性冲突或版本不匹配引起,优先检查这两类问题[^1][^2]。
---
阅读全文
相关推荐




















