Flutter应用从Play Store下载后启动显示空白界面问题排查
Flutter应用构建异常排查:空白界面与Activity类找不到问题
问题现象
将Flutter应用上传至Google Play Store内部测试渠道后,安装启动仅显示空白界面;在Android Studio中选择「app」配置构建到模拟器时也出现相同问题。
但通过Build>Flutter>build Apk生成APK,或选择「main.dart」作为配置构建到模拟器时,应用均可正常运行,推测问题出在「app」配置或项目整体设置上。
AndroidManifest文件差异
两种构建流程使用不同的AndroidManifest文件:
- App Manifest:路径为
Project>app>src>main>Android.Manifest.xml,用于「app」配置构建及Play Store签名APK。启动Activity配置为android:name = "myapplication.app.name.LaunchAppActivity",曾出现“LaunchAppActivity类未找到”错误,但文件无语法错误。该Activity文件存放于Project>app>src>main>java>{myapplication.app.name}.LaunchAppActivity(注:因无法在java文件夹创建普通目录,通过新建package并填入applicationId创建,这可能是问题根源)。最初上传Play Store时因缺少该Activity导致无打开按钮,添加后出现空白界面问题。 - Android侧Manifest:路径为
Project>android>app>src>main>Android.Manifest.xml,启动Activity配置为android:name="myapplication.app.name.MainActivity",IDE提示无法解析MainActivity类,但该配置仍可正常运行,文件存放于Project>android>app>src>main>java。
项目配置
- Flutter版本:3.3.10
- Gradle版本:7.6
项目根目录包含android目录、app目录、build.gradle文件、pubspec及自定义代码库文件夹;android目录内有build.gradle及app子目录下的build.gradle;app目录下的build.gradle配置了applicationId(myapplication.app.name)及版本信息。
代码文件
LaunchAppActivity.java
package myapplication.app.name; import android.app.Activity; public class LaunchAppActivity extends Activity { }
MainActivity.java
package myapplication.app.name; import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { }
app>src>main>AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="myapplication.app.name" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.VIBRATE"/> <!-- Next 2 are to keep tasks running in the background --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <!-- Add the WRITE_EXTERNAL_STORAGE permission For exporting logs--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication" tools:targetApi="31"> <activity android:name="myapplication.app.name.LaunchAppActivity" android:label="My New Activity" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/Theme.MyApplication" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
Project>android>app>src>main>AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="myapplication.app.name"> <uses-permission android:name="android.permission.VIBRATE"/> <!-- Next 2 are to keep tasks running in the background --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <!-- Add the WRITE_EXTERNAL_STORAGE permission For exporting logs--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:label="App Name" android:name="${applicationName}" android:icon="@mipmap/ic_launcher"> <activity android:name="myapplication.app.name.MainActivity" android:exported="true" 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"> <!-- Specifies an Android theme to apply to this Activity as soon as the Android process has started. This theme is visible to the user while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <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> </manifest>
错误信息及尝试的解决方法
出现如下错误:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{myapplication.app.name/myapplication.LaunchAppActivity}: java.lang.ClassNotFoundException: Didn't find class "myapplication.LaunchAppActivity" on path: DexPathList[......
已尝试在Project>app>build.grade中添加multidex配置,但无效果:
release { minifyEnabled false shrinkResources false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' multiDexEnabled true }
内容的提问来源于stack exchange,提问作者O'Malley G.
相关产品推荐
相关产品推荐

