Flutter项目运行报错:Java代码使用废弃API及资源链接失败
问题与解决方案
问题情况
- 我fork了一个包含
MusicKit Plugin原生Java代码的Flutter项目 - 运行时出现构建失败,同时提示Java代码使用了废弃API
构建报错信息
Note: C:\Users\angel\Desktop\flutter_music_kit\flutter_musickit\android\src\main\java\com\zivost\musickit\MusickitPlugin.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:processDebugResources'. > Android resource linking failed C:\Users\angel\.gradle\caches\transforms-1\files-1.1\core-1.6.0.aar\11c6125161db973e0f4388722c28df2b\res\values\values.xml:192:5-228:25: AAPT: error: resource android:attr/fontVariationSettings not found. C:\Users\angel\.gradle\caches\transforms-1\files-1.1\core-1.6.0.aar\11c6125161db973e0f4388722c28df2b\res\values\values.xml:192:5-228:25: AAPT: error: resource android:attr/ttcIndex not found. error: failed linking references. * 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 39s Exception: Gradle task assembleDebug failed with exit code 1
涉及的Java代码
package com.zivost.musickit; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; /** MusickitPlugin */ public class MusickitPlugin implements MethodCallHandler { /** Plugin registration. */ public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), "musickit"); channel.setMethodCallHandler(new MusickitPlugin()); } @Override public void onMethodCall(MethodCall call, Result result) { result.notImplemented(); } }
解决方案
1. 解决Android资源链接错误(构建失败核心原因)
fontVariationSettings和ttcIndex是Android API 26(Android 8.0)引入的属性,需确保项目SDK版本达标:
- 打开
android/app/build.gradle文件 - 修改
compileSdkVersion和targetSdkVersion为26或更高版本,示例:android { compileSdkVersion 34 defaultConfig { targetSdkVersion 34 // 保留其他原有配置 } } - 同步Gradle后重新构建
2. 修复废弃API问题
原代码使用的registerWith(Registrar)是Flutter旧版插件注册方式,已被废弃,替换为新的嵌入v2实现:
- 更新Java代码为:
package com.zivost.musickit; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; /** MusickitPlugin */ public class MusickitPlugin implements FlutterPlugin, MethodCallHandler { private MethodChannel channel; @Override public void onAttachedToEngine(FlutterPlugin.FlutterPluginBinding flutterPluginBinding) { channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "musickit"); channel.setMethodCallHandler(this); } @Override public void onMethodCall(MethodCall call, Result result) { result.notImplemented(); } @Override public void onDetachedFromEngine(FlutterPlugin.FlutterPluginBinding binding) { channel.setMethodCallHandler(null); } } - 打开
android/src/main/AndroidManifest.xml,将原插件注册的meta-data替换为:<meta-data android:name="flutterEmbedding" android:value="2" />
内容的提问来源于stack exchange,提问作者Harvey Jones
相关产品推荐
相关产品推荐

