Файл aidl не смог найти импорт для класса с Android.mk

У меня есть проект, который использует интерфейсы AIDL, и все отлично работает в студии Android с помощью gradle. однако я использую студию Android только для удобства IDE для разработки моих приложений для Android, мне действительно нужно использовать файлы Android для создания своих приложений с остальной частью дерева AOSP.

Когда я начал этот проект, у меня был только один небольшой вспомогательный файл в качестве доказательства концепции, и он отлично работал как в AS, так и в Android. но когда я начал добавлять дополнительные файлы помощи, он просто сломался с ошибкой:

[ 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, который реализует Parcelable в исходном каталоге java.)

и вот мой файл для создания Android

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 вместе с остальными кода, я видел это в других местах.
  • создание отдельного модуля, который компилирует вспомогательные файлы и включает которые мне пригодились, также видели это в других местах.
  • перемещение исходного кода Java в каталог helpl
  • удаление всех реализаций интерфейсов
  • изменение моего помощника включает макрос на: LOCAL_AIDL_INCLUDES: = $ (LOCAL_PATH) / aidl, как предлагается в другом ответе SO
  • всевозможные комбинации изменений в LOCAL_SRC_FILES и LOCAL_AIDL_INCLUDES, даже с использованием абсолютных путей к файлам

у тебя есть MyMetaData.aidl? вы читали это?

pskink 06.08.2018 21:28

да, я прочитал это, и да, у меня есть этот вспомогательный файл. это было в нижней части моего блока кода, я разделил и пометил содержимое каждого вспомогательного файла с именами файлов

Aaron Czajka 06.08.2018 21:33

LOCAL_AIDL_INCLUDES: = $ (call all-Iaidl-files-under, aidl) Это будет включать только файлы помощи, а не ваш файл MyMetadata.aidl.

kiran Biradar 07.08.2018 08:53

В документации AIDL от Google сказано: «Если вы используете собственный процесс сборки, не добавляйте файл .aidl в свою сборку. Подобно файлу заголовка на языке C, этот файл .aidl не компилируется. . " но я попытался жестко запрограммировать абсолютный путь, и он все еще не компилируется, те же ошибки

Aaron Czajka 07.08.2018 15:31

Вы когда-нибудь это решали? Я получаю ту же ошибку.

Matt 02.03.2020 19:47

извините, обезьяна, я не помню, в чем было решение. Я полагаю, что решил это, но я больше не на этой работе, и я больше не могу смотреть на код, чтобы увидеть, что изменилось

Aaron Czajka 03.03.2020 19:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
6
1 541
1

Ответы 1

Был наткнулся на это тоже, но смог найти обходной путь.

TL; DR просто убедитесь, что все ваши вспомогательные имена файлов начинаются с буквы «I».

Похоже, что основная система сборки будет выбирать только вспомогательные файлы, имена которых начинаются с буквы «I».

Например, в ситуации исходного автора были скомпилированы его IMetadataCallback.aidl и IMyManager.aidl, но не MyMetadata.aidl. Я обнаружил то же самое со своим проектом.

Я предполагаю, что система сборки была спроектирована таким образом, чтобы гарантировать, что все вспомогательные файлы были названы правильно, но впоследствии она не была обновлена ​​для полной поддержки настраиваемых разделяемых типов, которые определены непосредственно в вспомогательных файлах, начиная с Android 10.

Другие вопросы по теме