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

android使程序进程不被LMK杀死| application运行环境初始化

2011-09-05 00:40 501 查看
http://blog.sina.com.cn/s/blog_470f05070100qewk.html

通过在androidmanifest.xml中的application标签中加入android:persistent="true" 属性后的确就能够达到保证该应用程序所在进程不会被LMK杀死。但有个前提就是应用程序必须是系统应用,也就是说应用程序不能采用通常的安装方式。必须将应用程序的apk包直接放到/system/app目录下。而且必须重启系统后才能生效。

除了一般的几种优先级外,还存在着coreserver,system这样的永远不会被LMK回收的优先级。系统中的电话应用就是coreserver优先级的。

通过查看源代码可以知道,只有应用程序的flag同时为FLAG_SYSTEM和FLAG_PERSISTENT时,才会被设置为coreserver优先级

if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {

app.persistent = true;

app.maxAdj = CORE_SERVER_ADJ;

}

FLAG_SYSTEM在应用程序apk放在/system/app下时会被设置。所以才会出现只设置android:persistent="true"仍然会被杀死的情况。

测试时发现,将应用程序放到/system/app后不重启系统,仍然会被识别为普通的进程。当系统重新启动时,会在一开始就启动该进程并把它优先级设置为coreserver。

通过dumpsys activity命令能够很明显的看出其中差别。

Running processes (most recent first):

App # 3: adj= 2/1 ProcessRecord{30858c20 1877:com.android.email/10014} (started-services)

PERS # 2: adj=-100/0 ProcessRecord{308fb390 1713:system/1000} (fixed)

App # 1: adj= 0/0 ProcessRecord{30908198 1794:android.process.acore/10005} (top-activity)

PERS # 0: adj= -12/0 ProcessRecord{3090d488 1789:xiao.xiong.test/10026} (fixed)

而且adj=-12时,这个进程通过ddms手动stop后会立即启动

-----------------------------------------------------------------------------------------Android
java application运行环境初始化简介
:

在kernle启动之后, 系统将通过App_main进程来初始化android Runtime JAVA 运行环境,zygote是android的第一个进程,所有android的应用都是通过zygote fork出来的子进程。与QT不一样的是系统调用fork启动新进程而不再通过execv将子进程完全替换,这样做的目的是每一个子进程都保留了JAVA VM所需的启动信息比如JNI 信息。

与Navtive 层一样, JAVA application 层也有一个system service ,service 中启动了很多的服务如ActivityManagerService,windowManagerService, powerManagerService等等,每启动一个新的应用或者Service, ActivityManangerService都将为该进程创建一个ApplicationThread客户端,当有其他应用需要创建新的Activity或者Bind
Service时,system service 就会通过binder IPC 机制通知到相应的JAVA application。一旦JAVA Application在ActivityManangerService中创建了客户端,则客户端与客户端,客户端与Server的IPC连接都建立了,在Binder IPC通信中已经说了,对于需要IPC通信的两个不同进程,只要获得了对方在Binder Kernel中建立的Binder参考,就可以互相传递数据了。应用由system service进程启动,具体过程可以参考下面的示意图,这里就不贴源码分析了。

两个重要的service:

上面提到system service进程起来的过程过,启动了很多的系统service,这中间有两个service非常重要一个是ActivitManangerService,另一个是windowManagerService.

AcvivityManagerService:

主要管理Activity, service的加载,卸载,应用的创建等,当在一个应用程序中调用StartActivity时,应用就通过IPC机制向System Service请求启动新的Activity,System Service首先会查找,这个Activity是否已经被创建,如果没有,查找这个Activity所在的应用程序是否已经起来,如果没有就先启动应用。然后向此应用发送launchActivity消息创建Activity。

WindowManagerService:

主要管理窗体的加载,事件的分发。启动每个Activity系统都会创建一个viewRoot用于保存所有的view,通过viewRoot将窗体加载到WindowManagerService并创建窗体的客户端,当服务程序接收到按键事件后,就会查找当前窗体是否是焦点控件,如果是的话就会将窗体事件通过客户端IPC传递到相应的应用程序,如果在焦点View中有注册接收KeyEvent的消息则事件就在该view中得到处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐