Android多Flavor下部分变体最小化/打开Intent时Activity销毁问题
Android多Flavor下Activity异常销毁问题
问题现象
- 项目包含3个Flavor,初始基于Flavor1开发,后续新增另外两个变体
- Flavor1中应用最小化后重新打开无异常
- Flavor2、Flavor3中,打开任意Intent或最小化应用时,栈顶Activity会立即被销毁,且触发
onDestroy()方法
已尝试无效方案
- 调整Activity的
launchMode参数 - 实现状态持久化逻辑
- 配置
alwaysRetainTaskState="true"
核心代码
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xxxxxxxxxxx"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_label" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.AppCompat.NoActionBar" android:usesCleartextTraffic="true"> <activity android:name=".SubMenuActivity" android:exported="false" android:label="Submenu" android:parentActivityName=".WebActivity" android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar" /> <activity android:name=".login.LoginActivity" android:alwaysRetainTaskState="true" android:configChanges="orientation" android:label="@string/title_activity_login" android:launchMode="singleTop" android:noHistory="false" android:screenOrientation="portrait" android:exported="true"> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="xxxxx" android:pathPattern="xxxx" android:scheme="https" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:alwaysRetainTaskState="true" android:configChanges="orientation" android:launchMode="singleTop" android:noHistory="false" android:screenOrientation="portrait" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".WebActivity" android:alwaysRetainTaskState="true" android:configChanges="orientation" android:launchMode="singleTop" android:noHistory="false" android:screenOrientation="portrait" /> <service android:name=".MyFirebaseMessagingService" android:stopWithTask="false" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <provider android:name="androidx.core.content.FileProvider" android:authorities="@string/fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/fileprovider" /> </provider> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_action_name" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" /> </application> </manifest>
app/build.gradle
android { .. .. flavorDimensions "version" compileSdkVersion 31 defaultConfig { applicationId "xxxxxx" minSdkVersion 26 targetSdkVersion 31 versionCode 203 versionName "2.0.3" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } productFlavors { janbarn { dimension "version" applicationIdSuffix ".flavor1" } shapeshifterzz { dimension "version" applicationIdSuffix ".flavor2" } dwleven { dimension "version" applicationIdSuffix ".flavor3" } } buildTypes { release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' productFlavors.flavor1.signingConfig signingConfigs.flavor1 productFlavors.flavor2.signingConfig signingConfigs.flavor2 productFlavors.flavor3.signingConfig signingConfigs.flavor3 } } sourceSets { janbarn { res { srcDirs 'src/flavor1/res' } java { srcDirs 'src/flavor1/java' } } shapeshifterzz { res { srcDirs 'src/flavor2/res' } java { srcDirs 'src/flavor2/java' } } dwleven { res { srcDirs 'src/flavor3/res' } java { srcDirs 'src/flavor3/java' } } } compileOptions{ sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } lint { checkReleaseBuilds false } buildFeatures { viewBinding true } }
排查方向
- 检查Flavor专属代码/资源差异:
- 查看Flavor2、Flavor3的
src目录下是否有自定义Application类或Activity基类,是否在onTrimMemory、onLowMemory中主动触发了Activity销毁逻辑 - 确认Flavor专属的AndroidManifest是否覆盖了Activity属性(比如误设
noHistory="true")
- 查看Flavor2、Flavor3的
- 查看系统日志:
- 过滤logcat中的
ActivityManager标签,查看Activity被销毁的具体原因(比如进程被系统回收、异常触发)
- 过滤logcat中的
- 验证构建配置:
- 确认Flavor2、Flavor3的签名配置是否正确,异常签名可能导致系统异常处理
- 检查ProGuard规则,是否误删了Activity生命周期相关的关键代码
- 隔离测试:
- 在Flavor2、Flavor3中新建空白Activity,测试最小化是否会被销毁,排除业务代码干扰
- 暂时移除Firebase、FileProvider等第三方组件,测试是否存在组件冲突
内容的提问来源于stack exchange,提问作者Fons Molenaar
相关产品推荐
相关产品推荐

