Flutter 在启动时崩溃:在路径 DexPathList 上找不到类 .MainActivity

Posted

技术标签:

【中文标题】Flutter 在启动时崩溃:在路径 DexPathList 上找不到类 .MainActivity【英文标题】:Flutter crashes on startup: Didn't find class .MainActivity on path DexPathList 【发布时间】:2020-10-24 22:37:34 【问题描述】:

我在为 android 启用 MultiDex 构建器的情况下使用 Flutter,遇到了一个非常棘手的问题。我的应用程序运行时没有任何异常,但是添加 video_player 包后它在启动时崩溃了:

FATAL EXCEPTION: main
Process: com.rsg.anygoal, PID: 5883
java.lang.RuntimeException: Unable to instantiate activity ComponentInfocom.rsg.anygoal/com.rsg.anygoal.MainActivity: java.lang.ClassNotFoundException: Didn't find class "com.rsg.anygoal.MainActivity" on path: DexPathList[[zip file "/data/app/com.rsg.anygoal-tCKWlQXJD-iwdHtVRl0qqA==/base.apk"],nativeLibraryDirectories=[/data/app/com.rsg.anygoal-tCKWlQXJD-iwdHtVRl0qqA==/lib/x86, /data/app/com.rsg.anygoal-tCKWlQXJD-iwdHtVRl0qqA==/base.apk!/lib/x86, /system/lib, /vendor/lib]]
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.rsg.anygoal.MainActivity" on path: DexPathList[[zip file "/data/app/com.rsg.anygoal-tCKWlQXJD-iwdHtVRl0qqA==/base.apk"],nativeLibraryDirectories=[/data/app/com.rsg.anygoal-tCKWlQXJD-iwdHtVRl0qqA==/lib/x86, /data/app/com.rsg.anygoal-tCKWlQXJD-iwdHtVRl0qqA==/base.apk!/lib/x86, /system/lib, /vendor/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

后来在调查该问题时,我尝试禁用 MultiDex 并且似乎修复了它,但随后添加额外的 Flutter 包再次破坏了该应用程序,因此我认为它并非严格由 multiDex 引起并重新启用它。

我在论坛中发现的另一个修复尝试是将 ".MainActivity" 重命名为确切的类路径 "com.*...*.MainActivity",但这也没有帮助。

希望有人会建议解决此问题!留下一些我在调查期间收集的日志和代码 sn-ps,其中可能包含对您有帮助的线索。

完整的 Android logcat 日志:https://pastebin.com/vPs614jj

Flutter pubspec(故意省略名称和描述):

version: 1.0.6+16
environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.2
  intl: ^0.15.8
  firebase_core: ^0.4.3+1
  firebase_admob: ^0.9.0+10
  firebase_analytics: ^5.0.9
  firebase_auth: ^0.15.3
  firebase_crashlytics: ^0.1.2+4
  firebase_performance: ^0.3.1+5
  firebase_remote_config: ^0.3.0+1
  firebase_messaging: ^6.0.9
  firebase_dynamic_links: ^0.5.0+9
  cloud_firestore: ^0.13.0+1
  cloud_functions: ^0.4.1+6
  google_sign_in: ^4.1.1
  provider: ^4.0.1
  data_connection_checker: ^0.3.4
  shared_preferences: ^0.5.6
  flutter_markdown: ^0.3.2
  url_launcher: ^5.4.1
  barcode_scan: ^1.0.0
  qr_flutter: ^3.2.0
  share: ^0.6.3+5
  video_player: ^0.10.11+2

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  fonts:
    - family: Raleway
      fonts:
        - asset: fonts/Raleway-Regular.ttf
  uses-material-design: true

Android 清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="$APP_DOMAIN">
    <application android:name="io.flutter.app.FlutterApplication" android:label="$APP_NAME" 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|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
            <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>
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="$APP_ADS_ID"/>
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/notification_icon" />
    </application>

    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

MainActivity.java:

import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity 
  @Override
  protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
  

Flutter Doctor 输出(XCode 无关紧要):

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.4 19E287, locale en-BG)
 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[!] Xcode - develop for ios and macOS
    ✗ Xcode installation is incomplete; a full installation is necessary for iOS development.
      Download at: https://developer.apple.com/xcode/download/
      Or install Xcode via the App Store.
      Once installed, run:
        sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
        sudo xcodebuild -runFirstLaunch
[✓] Android Studio (version 3.5)
[✓] VS Code (version 1.46.1)
[✓] Connected device (1 available)

【问题讨论】:

您找到解决方案了吗?我也面临这个问题.. @Radi Cho @fajarainul 查看我在 GitHub 上的评论以及可能的解决方法:github.com/flutter/flutter/issues/60831#issuecomment-654070155 您的解决方案不适合我。您还有其他解决方案吗? 我的项目使用firebase云消息pub.dev/packages/firebase_messaging/versions/5.1.8(我使用v.5.1.8并且由于多种原因无法更新)并且想要处理后台消息。当我将 Application.java 添加到 AndroidManifest.xml 时发生错误。这是日志在路径上找不到类“id.kasku.kasku_mobile_flutter.Application”:DexPathList[[zip file“/data/app/id.kasku.kasku_mobile_flutter-2/base.apk”]。 【参考方案1】:

在“包名”更改后,我遇到了类似的错误。 我的解决方案是: 在 MainActivity.kt 中更新包名。

简而言之,所有包名都应该相应地固定。

之后,它就被修复了。

【讨论】:

这对我有用。我进行了搜索并将所有旧包名称替换为新包名称。我使用了 pub.dev 中的 change_app_package_name 库 - 但它没有更改 MainActivity.kt 和 project.pbxproj 文件。搜索替换修复了这个问题。【参考方案2】:

我的发现表明这不是 Flutter 本身的问题,而是在特定 Flutter 软件包安装后发生的。 升级 Gradle 和 AndroidX 库后,崩溃消失了,然后在另一个 Flutter 包添加后重新出现。然后我再次清理了 (IDE 中的build-&gt;clean android 项目,它再次被修复。因此,这可能是由于我的环境中存在一些 Gradle 混淆,并且可能只是不时以正确的方式编译某些类。

【讨论】:

这是错误的。这不是 Flutter 的问题。在我使用 pub.dev 中的 change_app_package_name 更改包名称后,它发生在我身上。显然它并没有在所有地方更改包名称。它没有更改 MainActivity.kt 和 project.pbxproj 文件。我进行了搜索和替换,这解决了问题。【参考方案3】:

这发生在我 [部分地] 将包名称(应用程序 ID)从 com.example.myappone 重命名为 com.myapp.one 时。我认为只更改 android/app/src/mainAndroidManifest.xmlios/Runner.xcodeproj/project.pbxproj 中的值就足够了。

原来实际的包名也需要更改,以便编译器找到源文件

【讨论】:

【参考方案4】:

这不是一个漂亮的解决方案,但它确实有效。 由于某种原因,dex 文件没有编译 MainActivity

所以我们直接在清单中添加了FlutterActivity,这就解决了我们的问题

<application
        android:label="morari"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name="io.flutter.embedding.android.FlutterActivity"
            ...>
            ...
 </application>

Dex 文件:

【讨论】:

作为一个临时解决方案,它就像一个魅力,谢谢!【参考方案5】:

如果使用 Android Studio/Flutter,最简单的解决方法是:

1:停止应用,然后打开 MainActivity.kt:

path : "**android/src/main/kotlin/MainActivity.kt**"

如果您在 MainActivity 中的包名称与您的应用不匹配,请在 MainActivity.kt 中更新它。

2:然后转到编辑>查找>在文件中替换并在整个应用程序和所有文件中将以前的包名称替换为新的。重新启动Android Studio在继续下一步之前。(使缓存无效并重新启动)

3:重启后...打开app/src/build.gradle并启用multidex:

defaultConfig 
    applicationId "com.your.apppackage"
    minSdkVersion 28
    targetSdkVersion 30
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    multiDexEnabled true //add multidex enabled

...别忘了在同一个 gradle 文件中添加 multidex 依赖:

**dependencies **
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.multidex:multidex:2.0.1' // add it as a dependency here

最后使缓存无效并重新启动。 (File&gt;Invalidate Caches/Restart)。

【讨论】:

【参考方案6】:

就我而言,这发生在我不小心注释掉(删除)该行时:

package com.mypackagename

在我编辑时来自“MainActivity.kt”文件!只需将其添加回来即可解决问题。

【讨论】:

以上是关于Flutter 在启动时崩溃:在路径 DexPathList 上找不到类 .MainActivity的主要内容,如果未能解决你的问题,请参考以下文章

在flutter中释放apk安卓程序在启动时崩溃

如果我包含某个包,Flutter android 应用程序在启动时崩溃

Flutter Release 应用程序在启动时崩溃:找不到 libflutter.so

Flutter iOS 应用程序在从 ipa 文件启动时崩溃,但在从 xCode 运行时工作正常

使用相机功能时,Flutter 应用程序崩溃并从启动画面重新启动

在 playstore (SQLiteConnection.java) 上启动后,我的 Flutter 应用程序在多个设备上崩溃