Как добавить приложение с Android Room в качестве системного приложения, скомпилированного с помощью makefile?

#android #android-room #android-source #android-make

#Android #android-комната #android-исходный код #android-make #android-room

Вопрос:

Пытаюсь установить простое приложение, которое использует Android Room для создания базы данных, в качестве системного приложения в AOSP. Застрял на том, что включить в Android.mk makefile.

 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_RESOURCE_DIR := /home/<username>/WORKING_DIRECTORY/packages/apps/appname/res
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_MODULE_TAGS := optional
LOCAL_USE_AAPT2 := true
LOCAL_STATIC_JAVA_LIBRARIES := 
    android-common 

LOCAL_STATIC_ANDROID_LIBRARIES := 
    androidx.annotation_annotation 
    androidx.legacy_legacy-support-core-ui 
    androidx.appcompat_appcompat 
    androidx.core_core 
    androidx.recyclerview_recyclerview 
    androidx.room_room-common 
    androidx.room_room-migration 
    androidx.room_room-runtime 
    androidx.room_room-testing 
    android-support-annotations 
    androidx.cursoradapter_cursoradapter 
    androidx.sqlite_sqlite 
    androidx.sqlite_sqlite-framework 
    androidx.lifecycle_lifecycle-common 
    androidx.lifecycle_lifecycle-common-java8 
    androidx.lifecycle_lifecycle-runtime 
    androidx.lifecycle_lifecycle-service 

LOCAL_ANNOTATION_PROCESSOR_CLASSES := 
    androidx.room.RoomProcessor

LOCAL_PACKAGE_NAME := com.app.appname
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_PACKAGE)
  

Однако при запуске эмулятора после «make -j4» он выдает ошибку —

E AndroidRuntime: java.lang.RuntimeException: не удается найти реализацию для com.app.appname.RoleManagerDB. RoleManagerDB_Impl не существует

E AndroidRuntime: в com.app.appname.RoleManagerDB.getDatabase(RoleManagerDB.java:27) E AndroidRuntime: в com.app.appname.MainActivity.лямбда $onCreate$ 0 $MainActivity(MainActivity.java:28)

E AndroidRuntime: в com.app.appname.-$$Lambda $ MainActivity $ xxx.run (неизвестный источник: 4) W ActivityTaskManager: принудительное завершение действия com.app.appname/.MainActivity

Мое приложение компилируется и работает плавно в Android Studio, так чего же мне не хватает в makefile?

Я предполагаю, что я не могу перевести строку gradle:

Обработчик аннотаций «androidx.room:room-compiler:$room_version»

в его эквивалент makefile. Любая помощь очень ценится!

Комментарии:

1. да, это может быть проблемой. перед компиляцией android studio выполняет обработку аннотаций, которая создает необходимые файлы, такие как реализации интерфейсов room. итак, Google об обработке аннотаций в android.mk

2. @Harkal Да, я это сделал, однако я не столкнулся с правильным оператором обработки аннотаций для Android.mk досье. Я пробовал: «androidx.room_room-compiler-nodeps», «androidx.annotation_annotation» и «android-arch-room-rxjava2», но это не удалось.

Ответ №1:

У меня тоже было много проблем с поиском информации об этом.

Приложение Bluetooth для Android 10 использует Room, а annotationProcessor настроен в его makefile (https://cs.android.com/android/platform/superproject/ /android-10.0.0_r30:packages/apps/Bluetooth/Android.mk)

В моем модуле я добавил:

 include $(CLEAR_VARS)

...

LOCAL_ANNOTATION_PROCESSORS := annotation
LOCAL_ANNOTATION_PROCESSORS  = room-common
LOCAL_ANNOTATION_PROCESSORS  = room-compiler
LOCAL_ANNOTATION_PROCESSORS  = room-migration
LOCAL_ANNOTATION_PROCESSORS  = s-antlr4         # a later version of antlr4 is already on the classpath, be we want this version
LOCAL_ANNOTATION_PROCESSORS  = apache-commons-codec
LOCAL_ANNOTATION_PROCESSORS  = auto-common
LOCAL_ANNOTATION_PROCESSORS  = s-javapoet       #the name javapoet is already defined - prefix for uniqueness
LOCAL_ANNOTATION_PROCESSORS  = kotlin-metadata
LOCAL_ANNOTATION_PROCESSORS  = sqlite-jdbc
LOCAL_ANNOTATION_PROCESSORS  = jetbrain-annotations
LOCAL_ANNOTATION_PROCESSORS  = guava-21.0
LOCAL_ANNOTATION_PROCESSORS  = kotlin-stdlib

LOCAL_ANNOTATION_PROCESSOR_CLASSES := androidx.room.RoomProcessor


...

include $(BUILD_PACKAGE)
  

Я также добавил новый модуль:

 #These libraries get copied into out/host/common/obj/JAVA_LIBRARIES/
# and are required for annotation processing
include $(CLEAR_VARS)

LOCAL_LIBS_PATH := libs
COMMON_LIBS_PATH := ../../../prebuilts/tools/common/m2/repository

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := 
        annotation:$(LOCAL_LIBS_PATH)/annotation-1.0.0-beta01.jar 
        room-common:$(LOCAL_LIBS_PATH)/room-common-2.0.0-beta01.jar 
        room-compiler:$(LOCAL_LIBS_PATH)/room-compiler-2.0.0-beta01.jar 
        room-migration:$(LOCAL_LIBS_PATH)/room-migration-2.0.0-beta01.jar 
        s-antlr4:$(COMMON_LIBS_PATH)/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar 
        apache-commons-codec:$(COMMON_LIBS_PATH)/org/eclipse/tycho/tycho-bundles-external/0.18.1/eclipse/plugins/org.apache.commons.codec_1.4.0.v201209201156.jar 
        auto-common:$(COMMON_LIBS_PATH)/com/google/auto/auto-common/0.9/auto-common-0.9.jar 
        s-javapoet:$(COMMON_LIBS_PATH)/com/squareup/javapoet/1.8.0/javapoet-1.8.0.jar 
        jetbrain-annotations:$(COMMON_LIBS_PATH)/org/jetbrains/annotations/13.0/annotations-13.0.jar 
        kotlin-metadata:$(COMMON_LIBS_PATH)/me/eugeniomarletti/kotlin-metadata/1.2.1/kotlin-metadata-1.2.1.jar 
        sqlite-jdbc:$(COMMON_LIBS_PATH)/org/xerial/sqlite-jdbc/3.20.1/sqlite-jdbc-3.20.1.jar
include $(BUILD_HOST_PREBUILT)
  

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