Flutter应用在安卓启动时崩溃

4
我已经在iOS上测试了我的第一个Flutter应用程序,并且运行得很好。现在我第一次在Android模拟器上运行它,但是出现了以下错误。
07-18 11:42:10.757 4264-4264/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.akamojo.liga, PID: 4264
    java.lang.RuntimeException: Unable to instantiate application com.akamojo.liga.liga: java.lang.ClassNotFoundException: Didn't find class "com.akamojo.liga.liga" on path: DexPathList[[zip file "/data/app/com.akamojo.liga-1/base.apk"],nativeLibraryDirectories=[/data/app/com.akamojo.liga-1/lib/x86, /data/app/com.akamojo.liga-1/base.apk!/lib/x86, /vendor/lib, /system/lib]]
        at android.app.LoadedApk.makeApplication(LoadedApk.java:578)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4680)
        at android.app.ActivityThread.-wrap1(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我觉得让人怀疑的是,它说正在寻找“com.akamojo.liga.liga”类。这是否正确?我的applicationId是“com.akamojo.liga”。Flutter框架是否创建一个名为“liga”的启动类?
以下是build.gradle。
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    compileSdkVersion 27

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        applicationId "com.akamojo.liga"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

以下是AndroidManifest.xml文件。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.akamojo.liga">

    <!-- The INTERNET permission is required for development. Specifically,
         flutter needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- 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. -->
    <application
        android:name="liga"
        android:label="liga"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- This keeps the window background of the activity showing
                 until Flutter renders its first frame. It can be removed if
                 there is no splash screen (such as the default splash screen
                 defined in @style/LaunchTheme). -->
            <meta-data
                android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                android:value="true" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

我将AndroidManifest.xml文件添加到了问题中。 - dakamojo
我没有名为liga的类。我猜这是Flutter框架正在创建的东西。我添加了句号,但它既没有修复任何问题也没有更改错误。然后我甚至将名称属性更改为"liiiiiga",但仍然没有更改错误消息。 - dakamojo
4
你有尝试在 AndroidManifest.xml 文件中的 "android:name" 中设置 "io.flutter.app.FlutterApplication" 吗? - Vinicius Braz Pinto
1
是的,问题已经解决了。谢谢。如果你想把这个作为答案,我会接受它。 - dakamojo
大家将包名替换为app>src>main>kotlin>activity.kt内相同的包名。 - Deepak sahoo
显示剩余4条评论
4个回答

1
在您的mainActivity.kt文件中添加以下代码。
override fun onCreate(savedInstanceState: Bundle?) {
  FlutterMain.startInitialization(this); //Added line
  super.onCreate(savedInstanceState)
  GeneratedPluginRegistrant.registerWith(this)
}

这个已经不起作用了。有其他可行的解决方案吗? - Alex

0
我曾经有过同样的经历,后来我将项目的包名更改为android> app> src> main> MainActivity.kt或MainActivity.java,并将您的包com.example.name替换为另一个。 这个名称也需要在AndroidManifest和应用级别的构建文件中进行修改。

0
首先,在“文件”>“项目结构”>选择“最新API平台”的“项目SDK”和“去模块”(依赖项)中选择“最新API平台”,应用,确定。 其次,在build.gradle中,将compileSdkVersion 28和targetSdkVersion 28更改为30。 第三,在build.gradle中,将GradleException更改为FileNotFoundException。 就这样。

0

我的应用程序之前是可以运行的,但在Dart插件更新后,我开始收到这个错误。

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo com.package.name.MainActivity

在我的情况下,是由于Dart和Flutter插件不兼容所致。我运行了flutter upgrade命令,应用程序又恢复正常了。
因此,请确保保持Dart和Flutter插件的更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接