【问题标题】:Flutter app crashes on launch on AndroidFlutter 应用在​​ Android 上启动时崩溃
【发布时间】:2018-12-26 16:28:09
【问题描述】:

我一直在 iOS 上测试我的第一个 Flutter 应用程序,并且运行良好。现在我第一次在 Android 模拟器中运行它,我得到了这个错误。

07-18 11:42:10.757 4264-4264/? E/AndroidRuntime: 致命异常: main 进程:com.akamojo.liga,PID:4264 java.lang.RuntimeException:无法实例化应用程序 com.akamojo.liga.liga:java.lang.ClassNotFoundException:在路径上找不到类“com.akamojo.liga.liga”:DexPathList [[zip 文件“/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]] 在 android.app.LoadedApk.makeApplication(LoadedApk.java:578) 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4680) 在 android.app.ActivityThread.-wrap1(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 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>

【问题讨论】:

  • 我不确定颤振是如何工作的......但请检查主要活动类名称。它在第一行说什么?另一件事是检查清单。看看是否由于某种原因它为主要活动添加了额外的 liga
  • 我将 AndroidManifest.xml 文件添加到问题中。
  • 这可能就是原因。 android:name="liga" 添加一个 .在它之前并报告......所以 android:name=".liga"... 在你这样做之前。你有一个叫做 liga 的课程吗?所以我的 Android 应用程序,我有一个在 mainactivity 被调用之前被调用的应用程序类。
  • 你试过在AndroidManifest.xml的“android:name”中设置“io.flutter.app.FlutterApplication”吗?
  • 是的,修复了它。谢谢。如果您想将其作为答案,我会接受。

标签: android flutter


【解决方案1】:

在您的mainActivity.kt 文件中添加以下代码

override fun onCreate(savedInstanceState: Bundle?) {
  FlutterMain.startInitialization(this); //Added line
  super.onCreate(savedInstanceState)
  GeneratedPluginRegistrant.registerWith(this)
}

【讨论】:

  • 这不再有效。还有其他可行的解决方案吗?
【解决方案2】:

我的应用程序正在运行,但在 Dart 插件更新后我开始收到此错误。

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

就我而言,这是因为 Dart 和 Flutter 插件不兼容。 我运行了颤振升级命令,应用程序又开始正常工作了。

因此,请确保更新 Dart 和 Flutter 插件。

【讨论】:

    【解决方案3】:

    首先, File>Project Structure> Select Project SDK Latest API Platform and go modules(dependencies)并选择Latest API Platform,应用,OK。 第二, 在 build-gradle => compileSdkVersion 28,targetSdkVersion 28 更改为 30。 第三, 在 build-gradle => GradleException 中更改 FileNotFoundException

    就是这样。

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 2019-01-24
      • 2019-07-17
      • 2020-09-19
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多