使用 AndroidX 将自定义 .aar 库添加到 Cordova 插件
Add custom .aar library using AndroidX to Cordova plugin
Objective
我需要为 Cordova 开发一个插件来实现我已经为 android 应用程序开发的一些代码(aar 文件)。
系统
- OS:Ubuntu 18.04.2 LTS
- IDE:VSCode & Android Studio
- Phone:连结 4 - Android 5.1.1
- 科尔多瓦版本:8.1.2 (cordova-lib@8.1.1)
- Cordova 应用程序的 SDK 信息(来自 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
我试过的
- 我已经从该项目制作了一个 .aar 文件,并且我正在尝试将它添加到我的 Cordova 插件中。我可以从该项目导入方法,但是一旦我打开使用这些方法的 activity 应用程序就会崩溃(应用程序仍然可以正确构建)。
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;
- 我想这可能是因为
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"/>
- 通过该更改,应用程序拒绝构建并且出现这些错误(我将绝对项目路径替换为
<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.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.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.access0(DefaultTaskPlanExecutor.java:80)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.execute(DefaultTaskPlanExecutor.java:105)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.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.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
- 有了这些错误,我开始认为这可能是
cordova
和 androidx
库之间的错误。要检查我是否已尝试使用该行添加不同的库(volley,这不是我的 aar 库工作所必需的):
<framework src="com.android.volley:volley:1.1.1"/>
- 应用构建成功。但是当我 运行 它时,一旦我们开始使用 AAR 库中的元素,它就会崩溃。 (比较步骤 1)
Cordova 是否与 androidx 兼容?如果是,是什么阻止我使用它?
从我的测试和错误来看它似乎不兼容,但我没有在 Cordova 文档网站上或通过 google 搜索找到关于该主题的相关信息。所以我无法确认。
PS:我尽量做到详尽无遗,如果您缺少信息,请询问。
编辑#1:
- 我试图在我的 .aar 库中将
androidx
改回 appcompat
。我生成了一个新的 .aar 并使用了
<framework src="com.android.support:appcompat-v7:28.0.0"/>
而不是 androidx 导入。
结果: 与 (1.) 问题相同。
结论:可能不是因为androidx
- 我记得在 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,因为我有其他依赖它的模块。
感谢这份文档 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
缺少的资源(ttcIndex
等)仅在 API 28 中添加 - 这就是为什么它们位于名为 values-v28
的文件夹中的原因。
您需要将 compileSdkVersion
更新为 28 才能成功编译。
Objective
我需要为 Cordova 开发一个插件来实现我已经为 android 应用程序开发的一些代码(aar 文件)。
系统
- OS:Ubuntu 18.04.2 LTS
- IDE:VSCode & Android Studio
- Phone:连结 4 - Android 5.1.1
- 科尔多瓦版本:8.1.2 (cordova-lib@8.1.1)
- Cordova 应用程序的 SDK 信息(来自 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
我试过的
- 我已经从该项目制作了一个 .aar 文件,并且我正在尝试将它添加到我的 Cordova 插件中。我可以从该项目导入方法,但是一旦我打开使用这些方法的 activity 应用程序就会崩溃(应用程序仍然可以正确构建)。
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;
- 我想这可能是因为
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"/>
- 通过该更改,应用程序拒绝构建并且出现这些错误(我将绝对项目路径替换为
<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.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.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.access0(DefaultTaskPlanExecutor.java:80)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.execute(DefaultTaskPlanExecutor.java:105)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.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.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
- 有了这些错误,我开始认为这可能是
cordova
和androidx
库之间的错误。要检查我是否已尝试使用该行添加不同的库(volley,这不是我的 aar 库工作所必需的):
<framework src="com.android.volley:volley:1.1.1"/>
- 应用构建成功。但是当我 运行 它时,一旦我们开始使用 AAR 库中的元素,它就会崩溃。 (比较步骤 1)
Cordova 是否与 androidx 兼容?如果是,是什么阻止我使用它?
从我的测试和错误来看它似乎不兼容,但我没有在 Cordova 文档网站上或通过 google 搜索找到关于该主题的相关信息。所以我无法确认。
PS:我尽量做到详尽无遗,如果您缺少信息,请询问。
编辑#1:
- 我试图在我的 .aar 库中将
androidx
改回appcompat
。我生成了一个新的 .aar 并使用了
<framework src="com.android.support:appcompat-v7:28.0.0"/>
而不是 androidx 导入。
结果: 与 (1.) 问题相同。
结论:可能不是因为androidx
- 我记得在 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,因为我有其他依赖它的模块。
感谢这份文档 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
缺少的资源(ttcIndex
等)仅在 API 28 中添加 - 这就是为什么它们位于名为 values-v28
的文件夹中的原因。
您需要将 compileSdkVersion
更新为 28 才能成功编译。