- 浏览: 668015 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qinshubao152:
参考:http://www.see-source.com/bl ...
关于android USB Host 串口编程 -
q328965539:
哥们 我做的数据也都是错误的啊····我怎么可以知道自己otg ...
关于android USB Host 串口编程 -
hgkmail:
好文
android中跨进程通讯的4种方式 -
cczscq:
楼主,我这里有个问题!我这里有个自己制作的font.ttf,这 ...
android字体的工作原理 -
blueice1986:
既然springMVC比struts好那么多的话那struts ...
为什么有了Struts 还要Spring MVC
Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收.
由此带来三个问题:
l 回收规则: 什么时候回收与回收哪一个
l 避免误杀: 如何阻止被回收
l 数据恢复与保存: 被回收了怎么办
Android将进程分为6个等级,它们按优先级顺序由高到低
依次是:
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3. 次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)
特征:
1.如果一个进程里面同时包含service和可视的activity,那么这个进程应该归于可视进程,而不是service进程.
2.另外,如果其他进程依赖于它的话,一个进程的等级可以提高.例如,一个A进程里的service被绑定到B进程里的组件上,进程A将总被认为至少和B进程一样重要.
3.系统中的phone服务被划分到前台进程而不是次要服务
进程.
android4.0的ProcessList.java中
static final int HIDDEN_APP_MAX_ADJ = 15;
static int HIDDEN_APP_MIN_ADJ = 9;
static final int SERVICE_B_ADJ = 8;
static final int PREVIOUS_APP_ADJ = 7;
static final int HOME_APP_ADJ = 6;
static final int SERVICE_ADJ = 5;
static final int BACKUP_APP_ADJ = 4;
static final int HEAVY_WEIGHT_APP_ADJ = 3;
static final int PERCEPTIBLE_APP_ADJ = 2;
static final int VISIBLE_APP_ADJ = 1;
static final int FOREGROUND_APP_ADJ = 0;
static final int PERSISTENT_PROC_ADJ = -12;
static final int SYSTEM_ADJ = -16;
static final int MIN_HIDDEN_APPS = 2;
static final int MAX_HIDDEN_APPS = 15;
在android中以进程的oom_adj值也就代表了它的优先级.
oom_adj值越高代表该进程优先级越低.
回收时机:
private final int[] mOomAdj = new int[] {
FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ,
BACKUP_APP_ADJ, HIDDEN_APP_MIN_ADJ, HIDDEN_APP_MAX_ADJ
};
// HVGA or smaller phone with less than 512MB. Values are in KB.
private final long[] mOomMinFreeLow = new long[] {
8192, 12288, 16384,
24576, 28672, 32768
};
// These are the high-end OOM level limits. This is appropriate for a
// 1280x800 or larger screen with around 1GB RAM. Values are in KB.
private final long[] mOomMinFreeHigh = new long[] {
32768, 40960, 49152,
57344, 65536, 81920
};
通过计算最大和最小值,得出8084,10114,12144,14192,16222,20264
对应的mOomAdj里成员的内存阈值,一旦低于该值,Android
便开始按顺序关闭相应的进程 .
同时把计算结果保存在
cat /sys/module/lowmemorykiller/parameters/minfree
具体的回收实现在ActivityManagerService.java中的函
数trimApplications()
1.首先移除package被移走的无用进程.
2.基于进程当前状态,更新oom_adj值,然后进行以下操作.
l移除没有activity在运行的进程
l如果AP已经保存了所有的activity状态,结束这个AP.
3.最后,如果目前还是有很多activities 在运行,那么移除那些activity状态已经保存好的activity.
更新oom_adj的值
Android kernel中的low memory killer
Android的Low Memory Killer根据需要(当系统内存短
缺时)杀死进程释放其内存,源代码在
kernel/drivers/misc/lowmemorykiller.c
简单说就是寻找一个最合适的进程杀死,从而释放
它占用的内存.
最合适:
•oom_adj越大
•占用物理内存越多
一旦一个进程被选中,内核会发送SIGKILL信号将之杀死.
for_each_process(p) {
……
if(selected == NULL || p->oomkilladj > selected->oomkilladj ||
(p->oomkilladj == selected->oomkilladj &&
tasksize > selected_tasksize))
{
selected = p;
}
}
if(selected != NULL) {
force_sig(SIGKILL, selected);
}
查看LRU列表:Adb shell dumpsys activity
当activitydemo在前台时:
包含Service的进程的优先级比较高,在computeOomAdjLocked
中将其分为了两小类:
static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if (adj > SECONDARY_SERVER_ADJ) {
adj = SECONDARY_SERVER_ADJ;
app.adjType = "started-services";
app.hidden = false;
}
}
if (adj > SECONDARY_SERVER_ADJ) {
app.adjType = "started-bg-services";
}
}
完全让进程不被kill是不可能的,我们可以通过一些操作
,使进程被kill的几率变小:
1.提高进程的优先级:
l后台操作采用Service形式,因为一个运行着service的进程比一个运行着后台activity的等级高。
l按back键使得进程中的activity在后台运行而不是destory,需重载back按键(没有任何activity在运行的进程优先被杀).
l依赖于其他优先级高的进程.
强制修改进程属性:
•在程序中设置setPersistent(true);
•在project的AndroidManifest.xml的<application>中加入属性android:persistent="true"
android:persistent(SDK)
Whether or not the application should remain running at all times . The default value is "false". Applications should not normally set this flag; persistence mode is intended only for certain system applications(phone,system).
1.使用killProcess (int pid)可以杀死指定PID的进程
public void onClick(View v) {
android.os.Process.killProcess(android.os.Process.myPid());
}
使用System.exit(0);可以达到同样的效果.
2.使用finish()可以杀死当前的activity
1. 保存资料:最好在每次Activity 运行到onPause或
onStop状态时先保存资料,然后在onCreate时将资
料读出来(生命周期方法).
2. OnSaveInstanceState(非生命周期方法)
onRestoreInstanceState
由此带来三个问题:
l 回收规则: 什么时候回收与回收哪一个
l 避免误杀: 如何阻止被回收
l 数据恢复与保存: 被回收了怎么办
Android将进程分为6个等级,它们按优先级顺序由高到低
依次是:
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3. 次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)
特征:
1.如果一个进程里面同时包含service和可视的activity,那么这个进程应该归于可视进程,而不是service进程.
2.另外,如果其他进程依赖于它的话,一个进程的等级可以提高.例如,一个A进程里的service被绑定到B进程里的组件上,进程A将总被认为至少和B进程一样重要.
3.系统中的phone服务被划分到前台进程而不是次要服务
进程.
android4.0的ProcessList.java中
static final int HIDDEN_APP_MAX_ADJ = 15;
static int HIDDEN_APP_MIN_ADJ = 9;
static final int SERVICE_B_ADJ = 8;
static final int PREVIOUS_APP_ADJ = 7;
static final int HOME_APP_ADJ = 6;
static final int SERVICE_ADJ = 5;
static final int BACKUP_APP_ADJ = 4;
static final int HEAVY_WEIGHT_APP_ADJ = 3;
static final int PERCEPTIBLE_APP_ADJ = 2;
static final int VISIBLE_APP_ADJ = 1;
static final int FOREGROUND_APP_ADJ = 0;
static final int PERSISTENT_PROC_ADJ = -12;
static final int SYSTEM_ADJ = -16;
static final int MIN_HIDDEN_APPS = 2;
static final int MAX_HIDDEN_APPS = 15;
在android中以进程的oom_adj值也就代表了它的优先级.
oom_adj值越高代表该进程优先级越低.
回收时机:
private final int[] mOomAdj = new int[] {
FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ,
BACKUP_APP_ADJ, HIDDEN_APP_MIN_ADJ, HIDDEN_APP_MAX_ADJ
};
// HVGA or smaller phone with less than 512MB. Values are in KB.
private final long[] mOomMinFreeLow = new long[] {
8192, 12288, 16384,
24576, 28672, 32768
};
// These are the high-end OOM level limits. This is appropriate for a
// 1280x800 or larger screen with around 1GB RAM. Values are in KB.
private final long[] mOomMinFreeHigh = new long[] {
32768, 40960, 49152,
57344, 65536, 81920
};
通过计算最大和最小值,得出8084,10114,12144,14192,16222,20264
对应的mOomAdj里成员的内存阈值,一旦低于该值,Android
便开始按顺序关闭相应的进程 .
同时把计算结果保存在
cat /sys/module/lowmemorykiller/parameters/minfree
具体的回收实现在ActivityManagerService.java中的函
数trimApplications()
1.首先移除package被移走的无用进程.
2.基于进程当前状态,更新oom_adj值,然后进行以下操作.
l移除没有activity在运行的进程
l如果AP已经保存了所有的activity状态,结束这个AP.
3.最后,如果目前还是有很多activities 在运行,那么移除那些activity状态已经保存好的activity.
更新oom_adj的值
Android kernel中的low memory killer
Android的Low Memory Killer根据需要(当系统内存短
缺时)杀死进程释放其内存,源代码在
kernel/drivers/misc/lowmemorykiller.c
简单说就是寻找一个最合适的进程杀死,从而释放
它占用的内存.
最合适:
•oom_adj越大
•占用物理内存越多
一旦一个进程被选中,内核会发送SIGKILL信号将之杀死.
for_each_process(p) {
……
if(selected == NULL || p->oomkilladj > selected->oomkilladj ||
(p->oomkilladj == selected->oomkilladj &&
tasksize > selected_tasksize))
{
selected = p;
}
}
if(selected != NULL) {
force_sig(SIGKILL, selected);
}
查看LRU列表:Adb shell dumpsys activity
当activitydemo在前台时:
包含Service的进程的优先级比较高,在computeOomAdjLocked
中将其分为了两小类:
static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if (adj > SECONDARY_SERVER_ADJ) {
adj = SECONDARY_SERVER_ADJ;
app.adjType = "started-services";
app.hidden = false;
}
}
if (adj > SECONDARY_SERVER_ADJ) {
app.adjType = "started-bg-services";
}
}
完全让进程不被kill是不可能的,我们可以通过一些操作
,使进程被kill的几率变小:
1.提高进程的优先级:
l后台操作采用Service形式,因为一个运行着service的进程比一个运行着后台activity的等级高。
l按back键使得进程中的activity在后台运行而不是destory,需重载back按键(没有任何activity在运行的进程优先被杀).
l依赖于其他优先级高的进程.
强制修改进程属性:
•在程序中设置setPersistent(true);
•在project的AndroidManifest.xml的<application>中加入属性android:persistent="true"
android:persistent(SDK)
Whether or not the application should remain running at all times . The default value is "false". Applications should not normally set this flag; persistence mode is intended only for certain system applications(phone,system).
1.使用killProcess (int pid)可以杀死指定PID的进程
public void onClick(View v) {
android.os.Process.killProcess(android.os.Process.myPid());
}
使用System.exit(0);可以达到同样的效果.
2.使用finish()可以杀死当前的activity
1. 保存资料:最好在每次Activity 运行到onPause或
onStop状态时先保存资料,然后在onCreate时将资
料读出来(生命周期方法).
2. OnSaveInstanceState(非生命周期方法)
onRestoreInstanceState
发表评论
-
Android的权限机制总结
2013-12-16 11:07 22939Android 安全机制概述 ... -
Android的权限机制之—— “沙箱”机制sharedUserId和签名
2013-12-13 11:29 14583Android“沙箱”的本质是为了实现不同应用程序和进程之 ... -
AIL(Android init Language)
2013-12-03 14:16 1859AIL(init.rc) Init.rc是i ... -
Android源码下编译自己的so库
2013-11-07 17:33 2891环境:win7 64位,虚拟机ubuntu10.04,TI ... -
修改framework代码使锁屏完全透明
2013-11-04 14:30 13481,修改KeyguardViewManager.java的ma ... -
开机动画流程
2013-11-01 10:30 13741、开机动画程序bootanimation程序目录:fram ... -
Android 软件测试日志文件抓取
2013-10-17 10:43 37621 log文件分类简介 实时打印的主要有: ... -
android 驱动开发介绍
2013-10-10 11:12 7703前言 意外在网上发现了这扁文章,看后感觉很有必要分享,所 ... -
Android系统Recovery工作原理之使用update.zip
2013-09-13 11:06 97191 总述 为了方便客户日后的固件升级,本周研究 ... -
android 升级策略
2013-09-12 09:50 1138Android系统而言升级意味着二个方面的升级 一个是系 ... -
Android FactoryTest 流程
2013-09-10 17:52 2657Android内置的Factory Test(有测试模式/工 ... -
Ubuntu下ADB调试Android找不到设备的解决方法
2013-09-10 10:13 1967首先确认,我已经在的settings-application ... -
系统移植之为Android启动加速
2013-05-15 13:50 3088Android的启动速度一直以来是他的诟病,虽然现在And ... -
Android系统做了哪些优化?
2013-04-23 10:11 1426Android系统框架和上层应用是类java( ... -
CM10之Setting的快速设置面板按钮布局
2013-04-19 16:03 1802开发环境 ubuntu12.04-desktop-amd6 ... -
Android编译CPU架构体系不同引起的错误解决方法
2013-04-19 10:53 5299转至http://blog.csdn.net/canjian ... -
android系统硬件抽象层(HAL)原理及实现之原理
2013-04-17 15:48 4132Android系统硬件抽象层(HAL)原理 在androi ... -
正确了解ROM,基带,以及RIL
2013-04-17 15:45 5824一、正确了解ROM,基带,以及RIL。 1)、R ... -
Android系统开发之修改调试SystemUI
2013-04-11 10:44 3885开发环境 ubuntu12.04-desktop-amd6 ... -
下载cm10.1源码编译
2013-03-21 10:43 2791开发环境 http://dengzhangta ...
相关推荐
android4.0测试代码;android4.0测试代码;android4.0测试代码;android4.0测试代码
Android4.0源码编译方法介绍,记录基于Ubuntu10.04编译Android4.0源码的过程。
android 4.0 sources 源码。主要用于编写程序时查看代码,即ctrl+鼠标单击
《细说Android 4.0 NDK编程》
Android 4.0 组件库 for Axure 模板 一个中文模板,一个详细组件,组合使用,相得益彰
android4.0 电子支付源码 NFC
android4.0 日历源码Calendar
mtk6577 android4.0 root工具
android4.0的原生照相机源代码,原生camera代码。
《细说Android4.0NDK编程》由王家林所著,通过NDK,应用程序可以非常方便地实现Java与C/C++代码的相互沟通。本书顺应Android软/硬件、云计算整合潮流,详细剖析了NDK开发中涉及的各类问题和解决方案:搭建Android ...
之前上传的(http://download.csdn.net/detail/michael__li/3797623)有网友反应有部分API没有包含,这次是修复好了,包含所有的API,最完整的Android4.0 API 源代码。 下载的压缩包里有使用方法,下载后在Eclipse里...
android4.0-api14 无需解释
压缩包内是原生的android4.0图库代码
android4.0_Browser
压缩包内是android4.0的电话模块源代码
Android4.0 拥有十大重点新特性。集成谷歌电视和Chrome OS的智能停放 ,运行速度得到进一步提升。2011年10月19日上午十点,谷歌与三星联手在中国香港举办发布会,公布有关Android 4.0系统信息。
Android 4.0 Camera源码,该代码为Andriod 4.0 系统相机源代码。
《Android 4.0网络编程详解》对Android 4.0网络编程中的XML形式,JSON操作,需要掌握的HTTP知识,数据下载上传,Socket编程,浏览器开发,Android中软件界面设计新大陆——采用HTML设计软件界面,Android应用程序的...
本文将指导你如何在电脑上安装模拟器体验Android 4.0
android sdk API Level 14 android 4.0 part4