Android:弃用不能转换为注解

Posted

技术标签:

【中文标题】Android:弃用不能转换为注解【英文标题】:Android: Deprecated cannot be converted to Annotation 【发布时间】:2020-02-27 06:05:44 【问题描述】:

掉进了迁移到 androidX 的兔子洞……

我几乎完成了迁移,但遇到了一个我似乎无法克服的错误。

已经试过Clean & RebuildInvalidate Caches / Restart

看起来有些东西正在将@Deprecated 注入到无法识别的 R.java 文件中。

应用程序的build.gradle 文件很长,但这里是相关部分(如果相关,可以发布更多内容):


android 
    compileSdkVersion 29
    defaultConfig 
        minSdkVersion 17
        targetSdkVersion 29
    
    compileOptions 

        dataBinding 
            enabled = true
        

    
    dependencies 

        ...

        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        implementation 'com.google.android.material:material:1.2.0-alpha01'


        def rxlifecycleVersion = "3.1.0"
        implementation "io.reactivex.rxjava3:rxjava:3.0.0-RC4"
        implementation "com.trello.rxlifecycle3:rxlifecycle:$rxlifecycleVersion"
        implementation "com.trello.rxlifecycle3:rxlifecycle-kotlin:$rxlifecycleVersion"
        implementation "com.trello.rxlifecycle3:rxlifecycle-android:$rxlifecycleVersion"
        implementation "com.trello.rxlifecycle3:rxlifecycle-components:$rxlifecycleVersion"

        implementation(name: 'SectionCursorAdapter-3.0.0', ext: 'aar')

        implementation 'com.nextfaze.poweradapters:power-adapters:0.24.1'
        implementation 'com.nextfaze.poweradapters:power-adapters-data:0.24.1'
        implementation 'com.nextfaze.poweradapters:power-adapters-recyclerview-v7:0.24.1'
        implementation 'com.nextfaze.poweradapters:power-adapters-support-v4:0.24.1'

        ...
    



我从 Kotlin 编译器中得到一系列错误

e: /.../R.java:6187: error: incompatible types: Deprecated cannot be converted to Annotation
    @Deprecated
     ^
e: /.../R.java:28468: error: incompatible types: Deprecated cannot be converted to Annotation
    @Deprecated
     ^
e: /.../R.java:28882: error: incompatible types: Deprecated cannot be converted to Annotation
    @Deprecated
     ^
e: java.lang.IllegalStateException: failed to analyze: java.lang.NullPointerException
    at org.jetbrains.kotlin.analyzer.AnalysisResult.throwIfError(AnalysisResult.kt:56)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:182)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:164)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:54)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:84)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:42)
    at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:104)
    at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1558)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at android.databinding.annotationprocessor.ProcessDataBinding.getSupportedOptions(ProcessDataBinding.java:219)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.getSupportedOptions(incrementalProcessors.kt)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.createDependencyCollector(incrementalProcessors.kt:44)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.access$createDependencyCollector(incrementalProcessors.kt:22)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor$dependencyCollector$1.invoke(incrementalProcessors.kt:24)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor$dependencyCollector$1.invoke(incrementalProcessors.kt:22)
    at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.getRuntimeType(incrementalProcessors.kt:69)
    at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalAptCache.updateCache(IncrementalAptCache.kt:26)
    at org.jetbrains.kotlin.kapt3.base.incremental.JavaClassCacheManager.updateCache(cache.kt:22)
    at org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing(annotationProcessing.kt:87)
    at org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing$default(annotationProcessing.kt:35)
    at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.runAnnotationProcessing(Kapt3Extension.kt:230)
    at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:188)
    at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:99)
    at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:96)
    at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:106)
    at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:81)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:555)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:82)
    at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:107)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:546)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:177)
    ... 23 more

链接到 R.java

我没有在我的项目中的任何地方使用过titleMargins。当我进行搜索时,@Deprecated 值仅显示在 Android sdk 和 com.google.android.material 工件中,包含在 .gradle/caches/ 中。我试过删除这个文件夹,每次编译都会再次出现。

我认为这与数据绑定有关,但我已经做了好几天了,无法找到原因。

我在这里找到的特定注释处理器文件的来源:ProcessDataBinding.java

更新 1

The Reality of Migrating to AndroidX 上的这篇精彩文章解释了 Android X 的 jetifier 工具不处理生成的代码。我已经看到其他相关的 SO 帖子处理 ButterKnifeDagger 等问题,但我们没有使用其中任何一个。我们正在使用几个数据绑定和编译库,但我不确定哪一个是错误引用的来源。所以我的问题是如何找到这个生成代码的来源并修复它?

更新 2

回到原来的pre-AndroidX项目,这个错误其实是在升级支持库到28的时候出现的,换行就好了

implementation "com.android.support:appcompat-v7:27.1.1"

implementation "com.android.support:appcompat-v7:28.0.0"

会触发编译错误。

我发现了这个问题跟踪器:Databinding v2 produces errors when another annotation processor fails,这可能是相关的,但我仍然不确定如何解决它。

【问题讨论】:

你用的是什么版本的Android gradle插件? R.java 中是否有Deprecated 的导入语句? @isaaaaame Gradle 插件 3.5.2,Gradle 版本 5.6.3 【参考方案1】:

改变这个:

compileOptions 
    dataBinding 
        enabled = true
    

进入这个:

dataBinding 
    enabled = true

compileOptions 


对于com.nextfaze.poweradapters,您需要在gradle.properties 中启用Jetifier:

android.useAndroidX=true
android.enableJetifier=true

【讨论】:

进行了更改。并且启用了 Jetifier。还是一样的错误。 如果您阅读更新 2,您会发现它不是由 AndroidX 引起的。【参考方案2】:

解决方案:

build.gradle 包含

dataBinding 
        enabled true
    

gradle.properties 包含

android.useAndroidX=true
android.enableJetifier=true
android.databinding.enableV2=true

我已经解决了几个小时的问题,然后解决了如下:

在你的项目中临时为 DataBindingComponent 声明一个空接口。

package androidx.databinding;

public interface DataBindingComponent 

让它编译,错误就会消失。但现在将揭示实际的根本错误。那个实际上造成了所有麻烦但不知何故被吞没的人。就我而言,它来自 AutoValue,表明我使用不正确

error: Parameter type java.lang.Boolean of setter method should be boolean to match getter

修复它然后删除虚拟接口使编译器再次高兴。

【讨论】:

以上是关于Android:弃用不能转换为注解的主要内容,如果未能解决你的问题,请参考以下文章

Android.widget,textView 不能转换为 android.widget,button

android.widget.RadioGroup 不能转换为 android.widget.RadioButton

.HashMap 不能转换为 android.database.Cursor

Android - 不推荐使用的方法和 minApiLevel

片段不能转换为 android.app.activity

为啥 TextInputEditText 不能在 Android Studio 中转换为 TextInputLayout?