关于android属性persistent的问题

在系统应用开发中,persistent属性可能导致应用在强制关闭后重启,引发ClassCastException。问题源于persistent应用启动时系统对Manifest的缓存。解决方案包括卸载重装应用、删除系统缓存或修改应用版本号。对于系统应用,不推荐使用persistent属性。

persistent属性介绍

系统应用开发中,一些特殊的应用需要加上 persistent 属性来保证应用的持久性,提高应用的存活。persistent 是用于控制应用程序特殊持久模式的标志。通常情况下不应被应用程序使用,要求系统始终保持应用程序的运行。persistent 为true时则当应用被强制杀掉后,应用会进行重启,当然如果应用奔溃也会导致一系列问题。
persistent 属性用法如下:

    <application
        android:name=".MainApplication"
        android:allowBackup="true"
        android:icon="@mipmap/settings_launcher_ic"
        android:label="@string/app_name"
        android:persistent="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            ...

问题描述

在一次系统应用的运行调试中,出现下面的报错:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.test/com.android.test.TestMainActivity}: java.lang.ClassCastException: android.support.v7.widget.ContentFrameLayout cannot be cast to android.support.v7.widget.ContentFrameLayout

明明时同个类型确却报出类型转换异常,考虑当前系统应用的特殊性,对比其他应用从未发现此现象,发现此问题是声明了 persistent属性持久化带来的影响。

解决方案

persistent应用不建议用于安装,如果已经安装了应用,则需要卸载后再安装,或者push到系统app目录下。
由于persistent应用在启动时 AM S会对系统system应用的 Manifest 进行缓存,因此在push应用后,Manifest 依旧为原来的配置,需要对此目录中对应的应用缓存删除,Android 9的目录为:

/data/system/package_cache/1

或者删除原有 /system/priv-app/ 下的应用,再install apk安装,每次安装apk时会生成新的安装应用的缓存。
如果不想删除缓存,也可以修改版本号编译新apk放入系统目录下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言并肃

感谢大哥支持!您的鼓励是我动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值