-
Notifications
You must be signed in to change notification settings - Fork 517
有关AndroidX适配问题
Android代码通常使用 android.support
库来确保向后兼容性。这些android.support
库已弃用,并替换为 AndroidX
。AndroidX
具有与旧库相同的功能和一些附加功能,但不幸的是,这两组库是不兼容的。
尝试构建依赖于两组库的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
插件,其主build.gradle
文件的 compileSdkVersion
版本低于28
。
该应用程序同时使用已弃用和AndroidX
代码。
必须通过手动将代码迁移到同一个库或降级到仍使用原始支持库的插件版本来解决这些问题。
注意: 如果应用程序主动使用依赖旧支持库的任何插件,则无法将应用程序完全迁移到AndroidX
。如果您的应用依赖于使用旧android.support
软件包的插件,则需要避免使用AndroidX
。
首先要确保compileSdkVersion
至少28
在 app/build.gradle
。此属性控制Gradle
用于构建APK的Android SDK
版本。它不会影响您的应用可以运行的最低SDK版本。
这需要最新版本的Android Studio
。按照以下步骤:
将您的Flutter应用程序导入Android Studio,以便IDE可以按照在Android Studio中编辑Android代码并完全支持IDE的步骤来解析Android代码 。
按照以下说明进行操作。
使用Android Studio 3.2及更高版本,您可以通过从菜单栏中选择Refactor
> Migrate to AndroidX
,快速迁移现有项目以使用AndroidX 。
如果您有任何尚未迁移到AndroidX名称空间的Maven依赖项,那么当您true
在 gradle.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,您需要将插件依赖项固定在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应用程序相同,但还有一些其他问题和一些细微的变化。
确保为此更改增加插件的主要版本,并在插件的更改日志中清楚地记录它。这种重大变化需要手动迁移以便用户修复。Pub会根据插件是1.0.0之前还是之后的情况对数字进行不同的处理。第一个数字是1.0.0或更高版本的插件的主要版本。对于1.0.0以下的插件,中间数字被认为是主要版本。 插件代码可以使用Android Studio以与Flutter应用程序代码相同的方式自动迁移。将plugin_root/example应用程序导入IDE,就像它是一个常规的Flutter应用程序一样。Android Studio还可以导入和解析插件的Android代码。