【发布时间】: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