VA中最近应用列表中删除VA应用后,VA无法再次启动该应用
bug描述: VA中打开一个应用,然后在最近列表中移除它,再在va中重复打开它,就启动不了了。
目前分析的结果是这样: 最近应用列表移除会调用到AMS的removeTask,并且在里面执行kill进程。但是VA里面启动的进程被移除时,不会被AMS kill掉,这个在removeTask里走了特殊的path,Task相关数据结构被删除了。对比平行空间,通用启动的应用也没有被kill掉。因此 VAMS里的linkToDeath不会生效,ActivityStack.processDied不会被调用。 这个过程VA主进程没有得到通知,VA里再去通过 ActivityManager.moveTaskToFront启动应用是起不来的。AMS里相关数据结构没了。
VA当前缺失了对这种情况处理的代码。
一个思路:利用这个API ActivityManager.getRecentTasks ,VA里 每次luanch intent时,对去比较一下当前系统中存在的Task和VA内部维护的Task列表,如果找到,继续用VA ActivityStack里每次moveTaskFromFront逻辑。找不到说明出现了Task被干掉的情况,但是这时候如何启动client我就没啥思路了。
平行空间里也是利用了这个 getRecentTasks API。
测试代码: https://github.com/prife/VirtualApp/commit/6d568acedf6c2b14a7e556d58528a57d821278e2
思路:VA首次启动应用时,会利用StubProvider来创建一个新桩进程。对于bug描述中的这种情况,不需要重新创建进程,也就省掉了fetchFreeStub的操作。只需走后续的startActivity流程。 修复:https://github.com/prife/VirtualApp/commit/0802d20847bfbc09074ef2585db708e2afb59013 测试:达到预期效果