Skip to content

有关AndroidX适配问题

豆浆油条 edited this page Jun 18, 2019 · 9 revisions

问题阐述

Android代码通常使用 android.support 库来确保向后兼容性。这些android.support 库已弃用,并替换为 AndroidXAndroidX具有与旧库相同的功能和一些附加功能,但不幸的是,这两组库是不兼容的。

尝试构建依赖于两组库的APK时,Gradle崩溃。类似如下错误:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugResources'.
> Android resource linking failed
  Output:  /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:86: error: resource android:attr/fontVariationSettings not found.
  /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:87: error: resource android:attr/ttcIndex not found.
  error: failed linking references.

  Command: /Users/apple/.gradle/caches/transforms-1/files-1.1/aapt2-3.2.1-4818971-osx.jar/6d43a6fe36f0f31a34b415c5391ea2ed/aapt2-3.2.1-4818971-osx/aapt2 link -I\
          /Users/apple/Library/Android/sdk/platforms/android-27/android.jar\
          --manifest\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/merged_manifests/debug/processDebugManifest/merged/AndroidManifest.xml\
          -o\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_\
          -R\
          @/Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/incremental/processDebugResources/resources-list-for-resources-debug.ap_.txt\
          --auto-add-overlay\
          --java\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/generated/not_namespaced_r_class_sources/debug/processDebugResources/r\
          --custom-package\
          com.bloomsky.flutterstudy\
          -0\
          apk\
          --output-text-symbols\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/symbols/debug/R.txt\
          --no-version-vectors
  Daemon:  AAPT2 aapt2-3.2.1-4818971-osx Daemon #0
  Output:  /Users/apple/.gradle/caches/transforms-1/files-1.1/core-1.0.1.aar/b68a675d7a9a308fcc0724793b1fb134/res/values/values.xml:89:5-125:25: AAPT: error: resource android:attr/fontVariationSettings not found.

  /Users/apple/.gradle/caches/transforms-1/files-1.1/core-1.0.1.aar/b68a675d7a9a308fcc0724793b1fb134/res/values/values.xml:89:5-125:25: AAPT: error: resource android:attr/ttcIndex not found.

  error: failed linking references.
  Command: /Users/apple/.gradle/caches/transforms-1/files-1.1/aapt2-3.2.1-4818971-osx.jar/6d43a6fe36f0f31a34b415c5391ea2ed/aapt2-3.2.1-4818971-osx/aapt2 link -I\
          /Users/apple/Library/Android/sdk/platforms/android-27/android.jar\
          --manifest\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/merged_manifests/debug/processDebugManifest/merged/AndroidManifest.xml\
          -o\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_\
          -R\
          @/Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/incremental/processDebugResources/resources-list-for-resources-debug.ap_.txt\
          --auto-add-overlay\
          --java\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/generated/not_namespaced_r_class_sources/debug/processDebugResources/r\
          --custom-package\
          com.bloomsky.flutterstudy\
          -0\
          apk\
          --output-text-symbols\
          /Users/apple/Workspaces/FlutterProjects/flutter_study/build/app/intermediates/symbols/debug/R.txt\
          --no-version-vectors
  Daemon:  AAPT2 aapt2-3.2.1-4818971-osx Daemon #0

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s
*******************************************************************************************
The Gradle failure may have been because of AndroidX incompatibilities in this Flutter app.
See https://goo.gl/CP92wY for more information on the problem and how to fix it.
*******************************************************************************************
Finished with error: Gradle task assembleDebug failed with exit code 1

Gradle的错误消息各不相同。有时消息直接提到“package androidx”或“package android.support”。但是,Gradle错误消息通常不明显,而是出现“AAPT”,“AAPT2”,或者提到“解析资源”失败。但其实就是AndroidX兼容性问题。下面就来解决一下该问题。

在Flutter应用中修复AndroidX崩溃

可以通过以下两种方式修复编译时Flutter应用程序的错误:

该应用程序使用AndroidX插件,其主build.gradle文件的 compileSdkVersion版本低于28。 该应用程序同时使用已弃用和AndroidX代码。

必须通过手动将代码迁移到同一个库或降级到仍使用原始支持库的插件版本来解决这些问题。

如何将Flutter应用程序迁移到AndroidX

注意: 如果应用程序主动使用依赖旧支持库的任何插件,则无法将应用程序完全迁移到AndroidX。如果您的应用依赖于使用旧android.support 软件包的插件,则需要避免使用AndroidX

首先要确保compileSdkVersion至少28app/build.gradle。此属性控制Gradle用于构建APK的Android SDK版本。它不会影响您的应用可以运行的最低SDK版本。

方式一 (推荐):使用Android Studio迁移您的应用

这需要最新版本的Android Studio。按照以下步骤:

将您的Flutter应用程序导入Android Studio,以便IDE可以按照在Android Studio中编辑Android代码并完全支持IDE的步骤来解析Android代码 。 按照以下说明进行操作。 使用Android Studio 3.2及更高版本,您可以通过从菜单栏中选择Refactor> Migrate to AndroidX,快速迁移现有项目以使用AndroidX 。 如果您有任何尚未迁移到AndroidX名称空间的Maven依赖项,那么当您truegradle.properties文件中设置以下两个标志时,Android Studio构建系统也会为您迁移这些依赖项:

android.useAndroidX=true
android.enableJetifier=true

要迁移不使用任何需要转换的依赖项的第三方库的现有项目,可以将android.useAndroidX标志设置为 true,将android.enableJetifier标志设置为false。

方式二(不推荐):手动迁移您的应用,虽然是不推荐,但如果方法一对你不生效,还是老实用手动吧。

以下是您可能需要在此过程中执行的一些步骤,此处列出以供参考。但是,您需要执行的具体操作取决于您的构建配置,并且可能与此处建议的示例更改不同。

android/gradle/wrapper/gradle-wrapper.properties更改以distributionUrl这样开头的行: 至少是4.10.2

distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip

在android/build.gradle,替换:

dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1'
}

替换为

dependencies {
    classpath 'com.android.tools.build:gradle:3.3.0'
}

在android/gradle.properties,附加

android.enableJetifier=true
android.useAndroidX=true

在android/app/build.gradle:

在android 块中,确保compileSdkVersion并且targetSdkVersion至少28。

将所有已弃用的库替换为AndroidX等效项。例如,如果您使用默认.gradle文件,请进行以下更改:

在 android/app/build.gradle

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

改为

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

最后,在dependencies 块中,替换

androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

改为

androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

避免使用AndroidX

如果您希望或需要避免迁移到AndroidX,您需要将插件依赖项固定在pubspec.yaml迁移之前的最后一个主要版本中。

这些是flutter/plugins AndroidX之前的所有软件包的最新可用版本:

  • android_alarm_manager:0.2.3
  • android_intent:0.2.1
  • battery:0.3.0
  • camera:0.2.9 + 1
  • cloud_firestore:0.8.2 + 3
  • cloud_functions:0.0.5
  • connectivity:0.3.2
  • device_info:0.3.0
  • firebase_admob:0.7.0
  • firebase_analytics:1.1.0
  • firebase_auth:0.7.0
  • firebase_core:0.2.5 + 1
  • firebase_database:1.0.5
  • firebase_dynamic_links:0.1.1
  • firebase_messaging:2.1.0
  • firebase_ml_vision:0.2.1
  • firebase_performance:0.0.8 + 1
  • firebase_remote_config:0.0.6 + 1
  • firebase_storage:1.0.4
  • google_maps_flutter:0.1.0
  • google_sign_in:3.2.4
  • image_picker:0.4.12 + 1
  • local_auth:0.3.1
  • package_info:0.3.2 + 1
  • path_provider:0.4.1
  • quick_actions:0.2.2
  • sensors:0.3.5
  • share:0.5.3
  • shared_preferences:0.4.3
  • url_launcher:4.1.0 + 1
  • video_player:0.9.0
  • webview_flutter:0.2.0
  • flutter_webview_plugin: 0.3.2
  • multi_image_picker: 2.4.11

请注意,这不是使用AndroidX的所有Flutter插件的详尽列表,并且您的应用中的AndroidX依赖项可能来自除此之外的其他插件。

对于插件维护者:将Flutter插件迁移到AndroidX

将Flutter插件迁移到AndroidX的过程基本上与 迁移Flutter应用程序相同,但还有一些其他问题和一些细微的变化。

确保为此更改增加插件的主要版本,并在插件的更改日志中清楚地记录它。这种重大变化需要手动迁移以便用户修复。Pub会根据插件是1.0.0之前还是之后的情况对数字进行不同的处理。第一个数字是1.0.0或更高版本的插件的主要版本。对于1.0.0以下的插件,中间数字被认为是主要版本。 插件代码可以使用Android Studio以与Flutter应用程序代码相同的方式自动迁移。将plugin_root/example应用程序导入IDE,就像它是一个常规的Flutter应用程序一样。Android Studio还可以导入和解析插件的Android代码。