aidl文件无法使用Android.mk找到类的导入

时间:2018-08-06 19:19:49

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

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

当我开始这个项目时,我只有一个小的辅助文件作为概念证明,并且在AS和android make中都构建良好。但是,当我开始添加更多的辅助文件时,它却因错误而中断:

[ 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

这是我的辅助文件:

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)

我尝试过的事情:

  • 将所有辅助文件与其余的移动到java目录 代码,我在其他地方也看到过。
  • 创建一个单独的模块来编译aidl文件,并包括 在我的服务中也看到过,在其他地方也可以做到。
  • 将可打包的Java代码移到aidl目录中
  • 列出所有接口实现
  • 将我的辅助工具包括宏更改为:LOCAL_AIDL_INCLUDES:= $(LOCAL_PATH)/ aidl,是另一个SO答案中建议的
  • 即使使用文件的绝对路径,也可以对LOCAL_SRC_FILES和LOCAL_AIDL_INCLUDES进行各种更改组合

1 个答案:

答案 0 :(得分:0)

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

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

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

比如在原作者的情况下,编译了他的IMetadataCallback.aidl和IMyManager.aidl,而没有编译他的MyMetadata.aidl。我发现我的项目也是如此。

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