AndroidManifest中android:persistent属性研究
2015-12-16 17:14
495 查看
平台:android4.0
场景:处理一个项目的时候,发现客户内置的一个music相关的apk每次都开机自动启动,同时在eclipse里面如何stop或者是调用killAllBackgroundProcesses()方法都无法停止此apk。
时间:2013.3
反编译apk,发现其AndroidManifest.xml文件中有一个类似如下描述:
在AMS::systemReady()函数中,有启动persistent的标签的app的代码:
将在addAppLocked()函数中调用startProcessLocked()来启动app进程。
关于app一直存在,可实质就是拥有android:persistent=true属性的app将不能被kill或kill后会自动重启。
在AMS中搜索if (app.persistent)字段后,就可以找到问题的原因了。主要讨论下removeProcessLocked()函数:
callerWillRestart是关键变量。
遍历所有的传入值,只有startInstrumentation()函数会将callerWillRestart设为true,此时的注释为
而我们在关闭app时,例如eclipse中点击stop的时,与这个函数无关的。因此会重启android:persistent=true属性的app。
同时在killAllBackgroundProcesses()中:
而不做其他有效操作。具体细节的内容,可以log出结果。
特别注意:此处在AMS中构造的ProcessRecord对象,即上面提到的app,其成员变量persistent的初始值为false。
那仅仅在apk的AndroidManifest.xml文件中设置android:persistent=true即可?
看AMS中的实现代码:
此处获取两个关键的信息:
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来简单的保存设置值。
场景:处理一个项目的时候,发现客户内置的一个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来简单的保存设置值。
相关文章推荐
- Android应用开发:页面跳转和数据传递
- 转战Android Studio 二
- Android开发笔记(二十)顶部导航栏ActionBar
- Android中线程同步之Mutex与Condtion的用法
- XML
- Android学习笔记——自定义TextView模仿验证码效果
- 通过Android Studio 导出Jar包
- Android之ListView实现图文信息混排(服务器端)(一)
- android之ExpandableListView高度显示不全
- Android全屏设置
- 推荐一些顶级的Android开发书籍(转)
- 强烈推荐android studio用的几个插件,androidstudio
- android 自定义dialog弹出和消失动画
- Android Studio 引入第三方jar包和lib工程【一】-- 初识maven仓库
- Android开发之如何使用Intent传递对象
- 如何在android studio中更新maven依赖
- Android 窗体泄露问题
- Android布局属性详解
- Android内存优化杂谈
- Android 目录结构