android:persistent误用带来的灾难

定义

Whether or not the application should remain running at all times — “true” if it should, and “false” if not. The default value is “false”. Applications should not normally set this flag; persistence mode is intended only for certain system applications.

上述为官网的描述,简言之:persistent属性是用来设置应用是否要一直运行。这个属性是为了系统级应用而设置,常规应用不应该将此属性置true。当被设为true时,此应用将永不会被杀死。

背景

前段时间由于公司的相关业务,一直在和定制Pad厂商对接相关的技术。我们需求大致为:Pad启动时,我们自己的App将作为默认Launcher随系统一起启动。Pad出厂时我们的App作为系统级应用被一并打进Rom包,App升级时将采用静默安装的方式进行升级,升级过后的App将从系统级应用变为普通用户级应用。此过程可防止App被手动卸载后,依然可以保留初版的系统App。

App安装升级带来的问题

  • 从系统App通过静默安装(pm install)升级为普通App,提示安装成功,但打开App时会崩溃。
  • 通过adb install安装apk,提示安装成功,但打开App依然为旧版App的内容。此时跳转别的页面App会崩溃。
  • 使用Android Studio安装(pm install),提示安装成功,但打开App依然为旧版App的内容。此时跳转别的页面App会崩溃。

注:上述的崩溃log均显示为当前Activity不能强转为当前的Activity,且系统设置里边显示版本号已经是安装后新版的版本号。上述问题重启Pad后,App均变为新版,一切变正常。

尝试解决上述问题

  • 在Rom层级监听apk安装成功后,主动kill下App进程后再重启一下App,依然发现上述问题依旧,此方案无效。
  • 排查App代码,发现注册文件application下android:persistent="true",去之。重新打包并内置Rom,测试后,上述问题解决。

总结

android:persistent="true"此属性最好只在系统级App下使用,即始终位于/system/app下的App。普通用户级的App要避免此属性的使用。当被设为true时,应用升级时进程将不会被正常杀死,所以才导致了上述问题的发生。






0%