【问题标题】:aidl file couldnt find import for class with Android.mk使用 Android.mk 的aidl 文件找不到类的导入
【发布时间】:2018-08-06 19:19:48
【问题描述】:

我有一个使用 AIDL 接口的项目,并且在带有 gradle 的 android studio 中一切都构建得很好。但是,我只使用 android studio 来方便 IDE 开发我的 android 应用程序,我必须实际使用 Android make 文件来构建我的应用程序与 AOSP 树的其余部分。

当我开始这个项目时,我只有一个小的aidl 文件作为概念证明,它在 AS 和 android make 中都构建得很好。但是当我开始添加更多的aidl文件时,它就出现了错误:

[ 14% 1/7] Aidl: myradioservice<= vendor/apps/radioservice/myRadioService/aidl/com/foo/myradioservice/IMetadataCallback.aidl
FAILED: out/target/common/obj/APPS/myRadioService_intermediates/aidl/com/foo/myradioservice/IMetadataCallback.java
vendor/apps/radioservice/myRadioService/aidl/com/foo/myradioservice/IMetadataCallback.aidl:4: couldn't find import for class com.foo.myradioservice.MyMetaData
[ 28% 2/7] Aidl: myradioservice <= vendor/apps/radioservice/myRadioService/foo/com/foo/myradioservice/IMyRadioManager.aidl
FAILED: out/target/common/obj/APPS/myRadioService_intermediates/aidl/com/harman/myradioservice/IMyRadioManager.java
vendor/apps/radioservice/myRadioService/aidl/com/foo/myradioservice/IMyRadioManager.aidl:4: couldn't find import for class com.foo.myradioservice.IMetadataCallback

这是我的aidl文件:

IMetadataCallback.aidl

package com.foo.myradioservice;

import com.foo.myradioservice.MyMetaData;

interface IMetadataCallback {

    void onMetadataChange(out MyMetaData metadata);

}

IMyManager.aidl

package com.foo.myradioservice;

import com.foo.myradioservice.IMetadataCallback;

interface IMyManager {

    void tune(int channelNumber);

    void registerMetadataListener(IMetadataCallback cb);

    void unregisterMetadataListener(IMetadataCallback cb);
}

MyMetadata.aidl

package com.foo.myradioservice;

parcelable MyMetaData;

(我还有一个 MyMetadata.java 文件,它在 java 源目录中实现 Parcelable。)

这是我的 android make 文件

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := myRadioService

LOCAL_AIDL_INCLUDES := $(call all-Iaidl-files-under, aidl)
LOCAL_SRC_FILES := $(call all-java-files-under, java) $(call all-Iaidl-files-under, aidl)

LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4

LOCAL_AAPT_FLAGS := --auto-add-overlay

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res

LOCAL_JAVA_LIBRARIES := android.car

LOCAL_PROGUARD_ENABLED := disabled

LOCAL_DEX_PREOPT := false

include $(BUILD_PACKAGE)

我尝试过的事情:

  • 将所有aidl 文件与其余文件一起移动到java 目录中 代码,我在其他地方看到过。
  • 创建一个单独的模块来编译aidl文件,包括 为我服务,在其他地方也看到过这种情况。
  • 将可打包的java代码移动到aidl目录中
  • 删除接口的所有实现
  • 将我的aidl 包含宏更改为:LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl 在另一个 SO 答案中建议
  • 对 LOCAL_SRC_FILES 和 LOCAL_AIDL_INCLUDES 的各种更改组合,甚至使用文件的绝对路径

【问题讨论】:

  • 你有MyMetaData.aidl吗?你读过this吗?
  • 是的,我已经阅读了,是的,我确实有那个aidl 文件。它在我的代码块的底部,我用文件名分隔并标记了每个aidl文件的内容
  • LOCAL_AIDL_INCLUDES := $(call all-Iaidl-files-under,aidl) 这将只包括 Iaidl 文件而不是您的 MyMetadata.aidl 文件。
  • 这是设计使然,来自 google 的 AIDL 文档说:“如果您使用自定义构建过程,请不要将 .aidl 文件添加到您的构建中。类似于 C 语言中的头文件,此 .aidl 文件未编译。”但我已经尝试硬编码绝对路径,它仍然无法编译,同样的错误
  • 你解决过这个问题吗?我遇到了同样的错误。

标签: java android android-source aidl android.mk


【解决方案1】:

也偶然发现了这一点,但设法找到了解决方法。

TL;DR 只需确保您所有的aidl 文件名都以字母“I”开头。

看起来核心构建系统只会选择名称以字母“I”开头的aidl文件。

例如,在原作者的情况下,他的 IMetadataCallback.aidl 和 IMyManager.aidl 被编译了,但他的 MyMetadata.aidl 没有被编译。我在我的项目中发现了同样的情况。

我猜构建系统是这样设计的,以确保所有aidl文件都被正确命名,但之后没有更新以完全支持从Android 10开始直接在aidl文件中定义的自定义parcelable类型。

【讨论】:

    【解决方案2】:
    1. LOCAL_AIDL_INCLUDES 必须以 $(LOCAL_PATH) 为前缀,并且必须引用包含您的 AIDL 包的目录,而不是单独引用每个文件
    2. 另一方面,LOCAL_SRC_FILES 必须分别列出每个 *.aidl*.java 文件

    所以给定以下结构:

    .
    ├── Android.mk
    └── src
        ├── aidl
        │   └── com
        │       └── example
        │           └── application
        │               ├── IAnotherInterface.aidl
        │               └── IOneInterface.aidl
        └── java
            └── com
                └── example
                    └── application
                        └── OneClass.java
    

    指令是:

    LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/aidl
    LOCAL_SRC_FILES := \
        src/aidl/com/example/application/IAnotherInterface.aidl \
        src/aidl/com/example/application/IOneInterface.aidl \
        src/java/com/example/application/OneClass.java
    

    或:

    LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/aidl
    LOCAL_SRC_FILES := \
        $(call all-Iaidl-files-under, src/aidl) \
        $(call all-java-files-under, src/java)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多