美文网首页
compileDebugKotlin FAILED和aidl

compileDebugKotlin FAILED和aidl

作者: ukyoo | 来源:发表于2021-02-18 23:31 被阅读0次

自从入职CS,项目编译一直有个神坑报错,每次都需要clean rebuild若干次, 非常耽误时间

简单的说, 如果在使用AIDL时需要一个自定义的数据类型, 我们一般会这么写:

  1. 自定义一个数据类型aidl文件: CustomParcel.aidl
package com.ukyo.test.parcel;
parcelable CustomParcel;
  1. 然后在项目里定义一个同名的 CustomParcel.java , 实现Parcelable.

当我们写一个子类SubClass继承该类.然后在Kotlin文件中直接或者间接引用到SubClass时, 就会出现一个以下的报错

> Task :app:compileDebugKotlin FAILED
e: Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
    class com.ukyo.test.SubClass, unresolved supertypes: CustomParcel 

报错发生在app:compileDebugKotlin, 也就是kotlinc. 但是我们明明已经定义了该类. 全局搜索发现有两个 CustomParcel.java, 推测是两个同名的文件引起.

image.png

分析

除了我们自己写的Java文件, 另外一个肯定是aidl生成的. 引用一张图:
在编译开始时会把aidl转化为Java文件, 接下来才会经过javac, kotlinc把JVM语言文件转化为字节码 .class 文件.


编译打包过程

查看aidl生成的文件, 发现是空的, 并且有一行注释: 说明这是一个 PlaceHolder, 也就是占位文件.


猜测是Kotlinc编译时找到了这个文件, 因为这是个空文件, 连个类声明都没有, 所以会报Supertypes of the following classes cannot be resolved.

Google的解决办法

网上搜到有人遇到了相同的问题,问题确实发生在kotlinC编译器以aidl生成的空java文件为编译目标, 而不是真正的java类文件. 并且也给出了解决办法,升级buildTools版本.

查看 buildTools提交记录

提交记录: No java output for parcelable declaration. 也就是移除了以下的为自定义的aidl Parcelable类生成Java文件的设定(29.0.2之前的实现)

if (const AidlParcelable* parcelable_decl = defined_type->AsParcelable();
      parcelable_decl != nullptr) {
    return generate_java_parcel_declaration(filename, io_delegate);
}

升级29.0.3, 再次编译, 发现build/aidl目录下不再生成同名的 PlaceHolder 文件了, 只剩下唯一的我们自己的文件, kotlinC这次只能用唯一的文件来编译,报错解决.

至于为什么有时候clean rebuild能编译成功,需要探究下kotlinC的源码.

最坑的是, 29.0.2就是gradle plugin4.1默认支持的版本, 所以你不手动指定buildTools版本为29.0.3以上就会掉进坑里.

相关文章

  • compileDebugKotlin FAILED和aidl

    自从入职CS,项目编译一直有个神坑报错,每次都需要clean rebuild若干次, 非常耽误时间 简单的说, ...

  • Execution failed for task ':app:

    问题: Execution failed for task ':app:compileDebugKotlin'. ...

  • Execution failed for task ':

    Execution failed for task ':app:compileDebugAidl'. > aidl...

  • Android Studio aidl问题

    随手创建了AIDL Demo,出现了如下问题: Error:Execution failed for task '...

  • Binder通信和AIDL

    本文讲的是,Binder通信和AIDL,一般的理解是,Binder通信可以通过AIDL来实现,通过AIDL定...

  • 安卓AIDL使用详解

    安卓AIDL使用详解 说到AIDL就会提到IPC,具体说明是AIDL和IPC,这些概念大家自行查阅,在这里我就不多...

  • Android学习笔记(七)

    AIDL进程间通信;AIDL(Android Interface Design Language) ▲№aidl接...

  • Binder 连接池

    典型的AIDL使用流程:首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub...

  • AIDL解析

    AIDL是Android中IPC方式中的一种。 AIDL的使用 创建aidl后缀的文件,服务端和客户端各保存一份,...

  • [Private] Android AIDL Demo

    1. Create AIDL file User.aidl: defind the entity for aidl...

网友评论

      本文标题:compileDebugKotlin FAILED和aidl

      本文链接:https://www.haomeiwen.com/subject/bnjotltx.html