我一直在尝试为Flutter开发平台代码,以启动后台服务。在这里,我使用了一个没有完成 actual 工作的最小示例,以表明该应用程序根本无法运行。实际的颤振代码根本没有修改。
MainActivity.java
public class MainActivity extends FlutterActivity {
Intent i = new Intent(this, MainService.class);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
}
}
MainService.java
public class MainService extends IntentService {
public MainService() {
super("MainService");
}
@Override
protected void onHandleIntent(Intent Intent) {
}
}
AndroidManifest.xml
<service android:enabled="true"
android:name=".MainService"></service>
buildVersion为> 27,并且清单文件中已相应添加了service
标签。
使用flutter run -v
进行编译和运行将显示以下消息:
..
[ +121 ms] Starting: Intent { act=android.intent.action.RUN flg=0x20000000 cmp=com.example.hello/.MainActivity (has extras)}
[ +1 ms] Waiting for observatory port to be available...
安装卡住了。
是否有解决方法?如果这是Flutter实施中的实际错误,是否还意味着没有在后台运行Flutter应用程序的方法?
答案 0 :(得分:5)
我遇到了这个问题,并最终将其归结为以下事实:我已在AndroidManifest中将项目的程序包名称更改为com.test。 MyAppName 。这不是有效的Dart软件包名称。您可以通过尝试使用
创建一个新项目来验证这一点 flutter create --org com.test MyAppName
这将导致错误消息:
“ MyAppName”不是有效的Dart程序包名称。
DO 使用
lowercase_with_underscores
作为软件包名称。包名称应全部为小写,并用下划线分隔
just_like_this
个单词。仅使用基本的拉丁字母和阿拉伯语 位数:[a-z0-9_]。另外,请确保名称是有效的Dart标识符 -它不是以数字开头,也不是保留字。
对我来说,解决方案是通过运行重新创建具有所需值的项目
flutter create --org com.test my_app_name
并跨lib文件夹,pubspec文件,任何资产等进行复制。这应该可以解决问题。请注意,这会导致kotlin文件夹(android / app / main / kotlin)具有根据您指定的域正确设置的子文件夹,例如kotlin / com / test / com.test
答案 1 :(得分:2)
如果您遇到这种情况并且使用Firebase,请尝试从Firebase控制台下载并插入“ google-services.json”文件的新副本。此外,请确保您遵循Add Firebase to your Flutter App文档中列出的所有步骤。
如果您还为此启用了Crashlytics,请确保已在Firebase控制台中启用了它,并遵循了Get Started with Firebase Crashlytics文档中列出的其他说明。
我不确定这些问题中的哪一个解决了我的问题,但是直到我检查了这两个文档中列出的所有步骤之后,其他任何方法都无法起作用。
答案 2 :(得分:1)
重现此问题的另一种方法是将AndroidManifest中应用程序的android:name属性从io.flutter.app.FlutterApplication的默认值更改为其他值(在我的示例com.test.my_app_name中)。由flutter创建的标准AndroidManifest中的注释中详细介绍了此属性的用途:
<!-- io.flutter.app.FlutterApplication is an android.app.Application
that calls FlutterMain.startInitialization(this); in its onCreate
method. In most cases you can leave this as-is, but you if you want
to provide additional functionality it is fine to subclass or
reimplement FlutterApplication and put your custom class here. -->
因此,除非要使用您自己的自定义类,否则不要更改该值-这不仅仅是标签。
答案 3 :(得分:1)
此问题的另一个潜在原因是MainActivity.kt中指定的软件包格式错误,它还应使用相同的有效Dart软件包名称,例如
package com.test.my_app_name
代替
package com.test.MyAppName
答案 4 :(得分:1)
首先检查两个名字是否相同:
android/app/src/mainAndroidManifest.xml
中的包名android/app/main/kotlin/MainActivity.kt
中的包名然后,检查 iOS 包名称是否与包名称相似。例如:
com.example.myAppName
com.example.my_app_name
最后,检查 Firebase iOS 应用程序包 ID 的名称是否与 iOS 包名称相同。
在 Firebase 中:
在 Xcode 中:
答案 5 :(得分:0)
我有同样的问题。就我而言,flutter clean
解决了该问题。对我来说,造成问题的原因是Android包中的重命名。重命名该软件包后,您可能需要清除旧的旧构建文件。
答案 6 :(得分:0)
答案 7 :(得分:0)
在@david-conlisk 's answer之后,您还可能:
重命名了Kotlin软件包,而不更新软件包行;
从另一个类/项目复制了MainActivity代码,但是 忘记更新包裹行
所有这些情况都可能导致相同的挂起和崩溃。
恕我直言,Android Studio应该远离当前的文本文件编辑地狱,并提供类似于Xcode或VisualStudio的多合一项目配置UI。需要编辑多个Gradle配置文件以及Android自己的属性页为错误留下了太多的空间。
答案 8 :(得分:0)
此问题的根本原因之一是 ADB 命令中的错误,即使显示应用的 ADB 不存在,某些与应用相关的进程仍在后台运行。 此行为的解决方法是从 ADB 运行卸载:
adb -s <deviceID> uninstall <com.example.appname>