您的位置:首页 > 移动开发 > Android开发

AndroidManifest中android:persistent属性研究

2015-12-16 17:14 495 查看
平台:android4.0

场景:处理一个项目的时候,发现客户内置的一个music相关的apk每次都开机自动启动,同时在eclipse里面如何stop或者是调用killAllBackgroundProcesses()方法都无法停止此apk。

时间:2013.3

反编译apk,发现其AndroidManifest.xml文件中有一个类似如下描述:

<application android:name="PhoneApp"
android:persistent="true"


在AMS::systemReady()函数中,有启动persistent的标签的app的代码:

List apps = AppGlobals.getPackageManager().
getPersistentApplications(STOCK_PM_FLAGS);
if (apps != null) {
int N = apps.size();
int i;
for (i=0; i<N; i++) {
ApplicationInfo info
= (ApplicationInfo)apps.get(i);
if (info != null &&
!info.packageName.equals("android")) {
addAppLocked(info);
}
}
}


将在addAppLocked()函数中调用startProcessLocked()来启动app进程。

关于app一直存在,可实质就是拥有android:persistent=true属性的app将不能被kill或kill后会自动重启。

在AMS中搜索if (app.persistent)字段后,就可以找到问题的原因了。主要讨论下removeProcessLocked()函数:

if (app.persistent) {
if (!callerWillRestart) {
addAppLocked(app.info);
} else {
needRestart = true;
}
}


callerWillRestart是关键变量。

遍历所有的传入值,只有startInstrumentation()函数会将callerWillRestart设为true,此时的注释为

// Instrumentation can kill and relaunch even persistent processes。


而我们在关闭app时,例如eclipse中点击stop的时,与这个函数无关的。因此会重启android:persistent=true属性的app。

同时在killAllBackgroundProcesses()中:

// we don't kill persistent processes


而不做其他有效操作。具体细节的内容,可以log出结果。

特别注意:此处在AMS中构造的ProcessRecord对象,即上面提到的app,其成员变量persistent的初始值为false。

那仅仅在apk的AndroidManifest.xml文件中设置android:persistent=true即可?

看AMS中的实现代码:

if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ;
}


此处获取两个关键的信息:

1.

(1).在apk的AndroidManifest.xml文件中设置android:persistent=true

(2).此apk需要放入到system/app目录下,成为一个systemapp

2.app.persistent = true不仅仅标志着此apk不能轻易的被kill掉,亦或在被kill掉后能够自动restart,并且还涉及到了进程的优先级。将被设置为CORE_SERVER_ADJ,此值为-12,而核心进程init的值为-16。当前正在前台运行的进程的值为0。

另:

在xml文件中对于Preference管理的配置,也可以使用app.persistent = true来简单的保存设置值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: