Android AAB架构下动态特性崩溃时如何维持Base App持续存活?
解决动态特性模块崩溃时Base App存活的方案
要实现动态特性模块崩溃后Base App(桌面)继续存活并自动返回,核心思路是让动态特性模块运行在独立进程,避免模块崩溃牵连主进程,再配合崩溃后的跳转逻辑回到Base App桌面。以下是具体实现步骤:
1. 为动态特性模块配置独立进程
在动态特性模块的AndroidManifest.xml中,给所有入口Activity指定独立进程。这样模块崩溃只会杀死自身进程,不会影响Base App所在的主进程:
<activity android:name=".FeatureMainActivity" android:process=":feature_process"> <!-- 保持原有的intent-filter配置 --> </activity>
进程名使用:feature_process这种私有命名,避免与其他应用进程冲突。
2. 捕获模块崩溃并主动返回Base App
在动态特性模块的入口Activity(或模块专属的Application类)中设置自定义异常处理器,在崩溃时完成日志记录、资源清理,然后主动跳转到Base App的桌面页面,最后结束当前进程:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置未捕获异常处理器 Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { // 记录崩溃日志(按需实现) Log.e("FeatureCrash", "Dynamic feature module crashed", throwable); // 跳转到Base App的桌面Activity Intent backToDesktop = new Intent(getApplicationContext(), BaseDesktopActivity.class); // 确保跳转后清除模块的Activity栈,直接回到桌面 backToDesktop.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(backToDesktop); // 结束当前模块进程 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); }); // 其他初始化逻辑 }
3. 优化Base App的桌面页面特性
针对IoT场景的唯一应用需求,给Base App的桌面Activity设置singleTask启动模式,确保每次返回都是同一个实例,避免重复创建:
<activity android:name=".BaseDesktopActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
同时可以根据IoT设备的系统特性,申请必要的进程保活权限(如低内存豁免、自启动权限),确保Base App不会被系统意外回收。
4. 验证效果
在动态特性模块中主动触发崩溃(例如throw new RuntimeException("Test crash")),验证以下两点:
- Base App的桌面页面正常显示,主进程未被杀死
- 动态特性模块的进程被终止,不会影响Base App运行
内容的提问来源于stack exchange,提问作者Li Zhenxin
相关产品推荐
相关产品推荐

