Добавьте пользовательскую библиотеку .aar с помощью AndroidX в плагин Cordova - PullRequest
0 голосов
/ 21 марта 2019

Цель

Мне нужно разработать плагин для Cordova, который реализует некоторый код (файл aar), который я уже разработал, для приложения для Android.

System

  • ОС: Ubuntu 18.04.2 LTS
  • IDE: VSCode & Android Studio
  • Телефон: Nexus 4 - Android 5.1.1
  • Cordova версия: 8.1.2 (cordova-lib@8.1.1)
  • Информация SDK приложения Cordova (из build.gradle):
defaultBuildToolsVersion="27.0.1" //String
defaultMinSdkVersion=19 //Integer - Minimum requirement is Android 4.4
defaultTargetSdkVersion=27 //Integer - We ALWAYS target the latest by default
defaultCompileSdkVersion=27 //Integer - We ALWAYS compile with the latest by default

Что я пробовал

  1. Я сделал файл .aar из этого проекта и пытаюсь добавить его в свой плагин Cordova. Я могу импортировать методы из этого проекта, но приложение аварийно завершает работу, когда я открываю действие, использующее эти методы (приложение по-прежнему создается правильно).
03-21 12:35:59.728 12235-12235/io.cordova.hellocordova E/AndroidRuntime: FATAL EXCEPTION: main
Process: io.cordova.hellocordova, PID: 12235
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/core/content/ContextCompat;
  1. Я подумал, что это может быть из-за androidx благодаря Failed resolution of: Landroidx/core/content/ContextCompat;. Поэтому я добавил эту строку в мой plugin.xml файл:
<!-- I have the same version of androidx.appcompat in my aar library -->
<framework src="androidx.appcompat:appcompat:1.0.0-beta01"/>
  1. С этим изменением приложение отказывается строить, и я получаю эти ошибки (я заменил абсолютный путь проекта на <projectpath>):
AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/home/benjamin/.gradle/caches/transforms-1/files-1.1/appcompat-1.0.0-beta01.aar/ad380179fb375e61241b11fa4df558eb/res/values-v28/values-v28.xml","position":{"startLine":8,"startColumn":4,"startOffset":447,"endLine":11,"endColumn":12,"endOffset":684}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/home/benjamin/Documents/Projects/Git/CordovaPluginProcessSdk/MobileApp/platforms/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml","position":{"startLine":10}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/fontVariationSettings not found.","sources":[{"file":"/home/benjamin/.gradle/caches/transforms-1/files-1.1/appcompat-1.0.0-beta01.aar/ad380179fb375e61241b11fa4df558eb/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/ttcIndex not found.","sources":[{"file":"/home/benjamin/.gradle/caches/transforms-1/files-1.1/appcompat-1.0.0-beta01.aar/ad380179fb375e61241b11fa4df558eb/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}
<projectpath>/platforms/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml:7: error: resource android:attr/dialogCornerRadius not found.
<projectpath>/platforms/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml:11: error: resource android:attr/dialogCornerRadius not found.
<projectpath>/platforms/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:228: error: resource android:attr/fontVariationSettings not found.
<projectpath>/platforms/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:228: error: resource android:attr/ttcIndex not found.
error: failed linking references.

Failed to execute aapt
com.android.ide.common.process.ProcessException: Failed to execute aapt
    at com.android.builder.core.AndroidBuilder.processResources(AndroidBuilder.java:796)
    at com.android.build.gradle.tasks.ProcessAndroidResources.invokeAaptForSplit(ProcessAndroidResources.java:551)
    at com.android.build.gradle.tasks.ProcessAndroidResources.doFullTaskAction(ProcessAndroidResources.java:285)
    at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:109)
    at sun.reflect.GeneratedMethodAccessor274.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
    at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
  1. С этими ошибками я пришел к выводу, что это может быть ошибка между cordova и androidx библиотекой. Чтобы проверить, что я пытался добавить другую библиотеку (залп, , которая не требуется для моей библиотеки aar для работы ) с этой строкой:
<framework src="com.android.volley:volley:1.1.1"/>
  1. Приложение успешно собирается. Но когда я запускаю его, он падает, когда мы начинаем использовать элементы из библиотеки AAR. (ср. шаг 1)

Совместима ли Cordova с androidx? Если это так, что мешает мне его использовать?

Похоже, что он не совместим с тестами и ошибками, которые я получил, но я не нашел соответствующей информации по этому вопросу на веб-сайте документации Cordova или в поиске Google. Так что я не могу подтвердить.

PS: Я пытался быть максимально исчерпывающим, пожалуйста, спросите, не упускаете ли вы информацию.


Редактировать # 1:

  1. Я попытался изменить androidx обратно на appcompat в моей библиотеке .aar. Я сгенерировал новый .aar и использовал
<framework src="com.android.support:appcompat-v7:28.0.0"/>

вместо импорта androidx.

Результат: То же, что (1.) выпуск.

Вывод: Это может быть не из-за androidx

  1. Я вспомнил, что на официальном документе Cordova они используют импорт appcompat: Cordova - Plugin.xml - Framework . Поэтому я использовал это:
<!-- Depend on v21 of appcompat-v7 support library -->
<framework src="com.android.support:appcompat-v7:21+" />

И он строит правильно. Но все равно происходит сбой, потому что функция, используемая в файле .aar, не существует для этой версии библиотеки.

Process: io.cordova.hellocordova, PID: 16523
    java.lang.NoSuchMethodError: No static method checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I in class Landroid/support/v4/content/ContextCompat; or its super classes (declaration of 'android.support.v4.content.ContextCompat' appears in /data/app/io.cordova.hellocordova-2/base.apk)

Если возможно, я бы хотел использовать androidx вместо appcompat, потому что у меня есть другие модули, которые зависят от него.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Недостающие ресурсы (ttcIndex и т. Д.) Были добавлены только в API 28 - поэтому они находятся в папке с именем values-v28.

Вам необходимо обновить compileSdkVersion до 28, чтобы успешно скомпилировать.

0 голосов
/ 21 марта 2019

Благодаря этой документации Flutter Doc Я перенес свой проект для совместимости с Androidx. (Как Android Studio мог бы использовать опцию Refactor > Migrate to AndroidX) Да, это от Flutter, а не от Cordova, но, поскольку это общая информация для любого проекта Android, он по-прежнему подходит.

Основные вещи, которые я сделал:

  • Добавление файла gradle.properties в platforms/android
android.enableJetifier=true
android.useAndroidX=true
  • Обновление minSdkVersion с 15 до 19
  • Обновление цели и компиляция sdkVersion с 27 до 28
  • Обновление Gradle с 3.0.0 до 3.3.2

Поскольку я создавал свой проект с помощью Cordova CLI, я не думал, что он будет работать как обычный проект Android относительно этих функций, поэтому я упустил его.

Я провел несколько тестов, и теперь приложение работает нормально.

Редактировать # 1

Мне пришлось снова решить эту проблему, поэтому я прошел через шаги, которые решали мою проблему раньше. Похоже, что тот, который решил проблему, изменил версию в файле platform/android/project.properties с target=android-27 на target=android-28

...