【问题标题】:Flutter Android app "Unable to instantiate activity"Flutter Android 应用程序“无法实例化活动”
【发布时间】:2020-10-30 12:36:21
【问题描述】:

我将我的应用程序构建为“发布”版本(包括签名和所有内容)以将其发布到 PlayStore。我从 PlayStore 中的“发布前报告”中获得了很多崩溃报告,它们看起来都像这样:

Crash java.lang.RuntimeException: Unable to instantiate activity 
ComponentInfo{com.domain/com.domain.MainActivity}: java.lang.ClassNotFoundException: Didn't find 
class "com.domain.MainActivity" on path: DexPathList[[zip file "/data/app/com.domain-1/base.apk", zip 
file "/data/app/com.domain-1/split_config.arm64_v8a.apk", zip file "/data/app/com.domain- 
1/split_config.xxhdpi.apk"],nativeLibraryDirectories=[/data/app/com.domain-1/lib/arm64, 
/data/app/com.domain-1/base.apk!/lib/arm64-v8a, /data/app/com.domain- 
1/split_config.arm64_v8a.apk!/lib/arm64-v8a, /data/app/com.domain- 
1/split_config.xxhdpi.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]

但是,构建过程按预期工作,没有任何失败。此外,调试构建和 split-by-abi 构建工作正常,没有任何问题或崩溃。

这是 Android 应用的文件夹结构(最初我使用了另一个文件夹结构“app/main/kotlin/com/domain/MainActivity.kt”但结果相同):

这是 androids 文件夹级别的 gradle.build

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')
logger.info("DEBUG - FLUTTER ROOT: " + flutterRoot)
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

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

buildscript {
    ext.kotlin_version = '1.3.50'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.3.3'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

/*
task clean(type: Delete) {
    delete rootProject.buildDir
}
*/

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    compileSdkVersion 28
    packagingOptions {
        exclude ("META-INF/shared_core_release.kotlin_module")
    }
    defaultConfig {
        applicationId "com.domain"
        minSdkVersion 25
        targetSdkVersion 28
        compileSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release
            sourceSets {

                main {
                    manifest.srcFile 'app/src/main/AndroidManifest.xml'
                    res.srcDirs = ['app/src/main/res']
                }
            }
        }
    }
}

flutter {
    source '..'
}

dependencies {
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

这是引用的AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.domain">
    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="App"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />


    </application>
    <!-- omitted -->
</manifest>

这是app/src/main/kotlin/com.domain/MainActivity.kt的内容:

package com.domain

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}

这是flutter doctor的摘录:

[√] Flutter (Channel stable, v1.17.5, on Microsoft Windows [Version 10.0.18362.900], locale de-DE)
    • Flutter version 1.17.5 at C:\flutter
    • Framework revision 8af6b2f038 (9 days ago), 2020-06-30 12:53:55 -0700
    • Engine revision ee76268252
    • Dart version 2.8.4

[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at C:\Users\xxx\AppData\Local\Android\Sdk
    • Platform android-29, build-tools 29.0.3
    • ANDROID_HOME = C:\Users\xxx\AppData\Local\Android\Sdk
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    X Android license status unknown.
      Try re-installing or updating your Android SDK Manager.
      See https://developer.android.com/studio/#downloads or visit visit
      https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions.

[√] Android Studio (version 4.0)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 46.0.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] IntelliJ IDEA Ultimate Edition (version 2019.3)
    • IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4
    • Flutter plugin version 44.0.3
    • Dart plugin version 193.6911.31

[√] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 10 (API 29) (emulator)

非常欢迎任何帮助来解决这个问题。

编辑#1:

关闭修改后,com.domain.MainActivity似乎不在dex中了。

但我不明白为什么不包括在内。

【问题讨论】:

  • 您在开发应用时没有遇到任何与Dex相关的问题吗?
  • 部署到 PlayStore 本身没有问题。我已经查看了 AAB 文件(和 .dex 文件),但它被混淆了。我已经尝试使用--no-shrink--no-obfuscate 进行构建,但由于某种原因这不起作用。
  • 那么它可能与颤振本身有关。也许在flutter github中问会更好
  • 您是否尝试将minifiedEnabled 设置为false 来为您的发布版本启用ProGuard?我猜你的 MainActivity 类被 Proguard 混淆了。清单中的条目可能会保留原来的类名 -> MainActivity 找不到。要检查这一点,您可以使用 Android Studio 中内置的分析 APK 功能。
  • @muetzenflo 我已经更新了我的帖子。似乎 MainActivity 不存在于包中。知道为什么它不存在吗?

标签: android flutter google-play


【解决方案1】:

我终于能够在一定程度上解决这个问题。

在尝试了所有作为 cmets 提供的解决方案(其中一个都不起作用)之后,我创建了一个全新的项目并复制了我认为可能导致问题的部分并尝试复制问题。

在没有任何工作(没有破坏新项目的构建或应用程序)之后,我复制了所有内容并调整了新创建的项目。据我所知,没有任何变化,甚至 GIT 也没有发现任何明显的变化。

即使解决方案远远落后于我的预期,它现在也能正常工作。由于该项目也没有显着变化,因此我无法提供更深入的见解或可能导致问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多