gpt4 book ai didi

java - 使用 Android.mk 的aidl 文件找不到类的导入

转载 作者:行者123 更新时间:2023-12-04 13:59:48 27 4
gpt4 key购买 nike

我有一个使用 AIDL 接口(interface)的项目,并且在带有 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);
}

我的元数据.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目录
  • 删除接口(interface)的所有实现
  • 将我的aidl 包含宏更改为:LOCAL_AIDL_INCLUDES :=
    $(LOCAL_PATH)/aidl 如另一个 SO 答案
  • 中所建议
  • 对 LOCAL_SRC_FILES 和 LOCAL_AIDL_INCLUDES 的各种更改组合,即使使用文件的绝对路径
  • 最佳答案

    也偶然发现了这一点,但设法找到了解决方法。
    TL;DR 只需确保您所有的aidl 文件名都以字母“I”开头。
    看起来核心构建系统只会选择名称以字母“I”开头的aidl文件。
    比如原作者的情况,编译的是他的IMetadataCallback.aidl和IMyManager.aidl,但没有编译他的MyMetadata.aidl。我发现我的项目也是如此。
    我猜构建系统是这样设计的,以确保所有aidl文件都被正确命名,但之后没有更新以完全支持从Android 10开始直接在aidl文件中定义的自定义parcelable类型。

    关于java - 使用 Android.mk 的aidl 文件找不到类的导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51714317/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com