alibaba / ARouter

💪 A framework for assisting in the renovation of Android componentization (帮助 Android App 进行组件化改造的路由框架)
Apache License 2.0
14.45k stars 2.61k forks source link

[arouter-compiler:1.5.2] RouteProcessor init JavaNullPointerException! #1035

Open gerenvip opened 1 year ago

gerenvip commented 1 year ago

使用 ”com.alibaba:arouter-api:1.5.2“,"com.alibaba:arouter-compiler:1.5.2" 配合 androidx 使用 "androidx.room:room-compiler:2.4.3" // or 2.4.0 RouteProcessor.init 时 NullPointerException

经测试,单独使用 room-compiler 编译OK, 单独使用 arouter 编译 NullPointerException 回退 "com.alibaba:arouter-compiler:1.2.2" 与room 搭配 编译OK 看日志像是 room 版本号升级支持了Processor的增量编译,导致RouteProcessor这边出问题 辛苦帮忙排查下原因,感谢

crash 日志如下:

Caused by: com.sun.tools.javac.processing.AnnotationProcessingError: java.lang.NullPointerException at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.(JavacProcessingEnvironment.java:712) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:791) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:886) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1227) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1340) at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1258) ... 41 more Caused by: java.lang.NullPointerException at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalFiler.createResource(incrementalProcessors.kt:122) at com.alibaba.android.arouter.compiler.processor.RouteProcessor.init(RouteProcessor.java:86) at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.init(incrementalProcessors.kt:41) at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.init(annotationProcessing.kt:197) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.(JavacProcessingEnvironment.java:691) ... 46 more

gerenvip commented 1 year ago

为了便于排查,贴上 incrementalProcessors 源码地址: https://github.com/JetBrains/kotlin/blob/master/plugins/kapt3/kapt3-base/src/org/jetbrains/kotlin/kapt3/base/incremental/incrementalProcessors.kt

gerenvip commented 1 year ago
 override fun init(processingEnv: ProcessingEnvironment) {
        if (!kind.canRunIncrementally) {
            processor.init(processingEnv)
        } else {
            val originalFiler = processingEnv.filer
            val incrementalFiler = IncrementalFiler(originalFiler)
            val incProcEnvironment = IncrementalProcessingEnvironment(processingEnv, incrementalFiler)
            processor.init(incProcEnvironment)
            incrementalFiler.dependencyCollector = dependencyCollector.value
        }
    }

看情况 在 init 方法内部调用 mFiler.createResource ,这时候还在 init 的调用栈中, incrementalFiler.dependencyCollector 还未赋值,这时候使用必然 NPE,懒加载 docWriter 就能规避这个问题了,望采纳