- 浏览: 681139 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
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 23043Android 安全机制概述 ... -
Android的权限机制之—— “沙箱”机制sharedUserId和签名
2013-12-13 11:29 14868Android“沙箱”的本质是为了实现不同应用程序和进程之 ... -
AIL(Android init Language)
2013-12-03 14:16 1923AIL(init.rc) Init.rc是i ... -
Android源码下编译自己的so库
2013-11-07 17:33 2946环境:win7 64位,虚拟机ubuntu10.04,TI ... -
修改framework代码使锁屏完全透明
2013-11-04 14:30 13981,修改KeyguardViewManager.java的ma ... -
开机动画流程
2013-11-01 10:30 14281、开机动画程序bootanimation程序目录:fram ... -
Android 软件测试日志文件抓取
2013-10-17 10:43 38131 log文件分类简介 实时打印的主要有: ... -
android 驱动开发介绍
2013-10-10 11:12 7808前言 意外在网上发现了这扁文章,看后感觉很有必要分享,所 ... -
Android系统Recovery工作原理之使用update.zip
2013-09-13 11:06 98131 总述 为了方便客户日后的固件升级,本周研究 ... -
android 升级策略
2013-09-12 09:50 1182Android系统而言升级意味着二个方面的升级 一个是系 ... -
Android FactoryTest 流程
2013-09-10 17:52 2776Android内置的Factory Test(有测试模式/工 ... -
Ubuntu下ADB调试Android找不到设备的解决方法
2013-09-10 10:13 2018首先确认,我已经在的settings-application ... -
系统移植之为Android启动加速
2013-05-15 13:50 3146Android的启动速度一直以来是他的诟病,虽然现在And ... -
Android系统做了哪些优化?
2013-04-23 10:11 1470Android系统框架和上层应用是类java( ... -
CM10之Setting的快速设置面板按钮布局
2013-04-19 16:03 1856开发环境 ubuntu12.04-desktop-amd6 ... -
Android编译CPU架构体系不同引起的错误解决方法
2013-04-19 10:53 5366转至http://blog.csdn.net/canjian ... -
android系统硬件抽象层(HAL)原理及实现之原理
2013-04-17 15:48 4181Android系统硬件抽象层(HAL)原理 在androi ... -
正确了解ROM,基带,以及RIL
2013-04-17 15:45 5883一、正确了解ROM,基带,以及RIL。 1)、R ... -
Android系统开发之修改调试SystemUI
2013-04-11 10:44 4004开发环境 ubuntu12.04-desktop-amd6 ... -
下载cm10.1源码编译
2013-03-21 10:43 2845开发环境 http://dengzhangta ...
相关推荐
源代码是理解Android系统运行机制的关键,它揭示了操作系统背后的逻辑和实现细节。本篇文章将深入探讨Android 4.0源码的主要组成部分及其功能。 1. **系统架构**:Android 4.0源代码包含了系统的各个层次,从底层...
### Linux Kernel for Android 4.0 与标准 Linux 3.0 内核的区别 #### 一、背景介绍 随着2011年10月19日上午10点谷歌发布的代号为“Ice Cream Sandwich”(简称ICS,冰淇淋三明治)的Android 4.0系统的发布,标志...
通过研究Android 4.0的源码,开发者可以学习到系统级别的编程技巧,理解Android系统的运行机制,并且能够为优化应用性能、开发自定义系统或模块提供坚实的基础。源码的探索不仅限于上述内容,还包括了各种服务、广播...
3. **多任务与内存管理**:Android 4.0增强了多任务处理能力,源码中的`frameworks\base\core\java\android/app`目录下的`ActivityManagerService.java`是管理活动栈和进程的关键。同时,内存管理策略也在`libcore\...
源码中包含了类加载器、垃圾回收、字节码解释器等关键部分,这对于优化应用性能和理解Dalvik的工作机制至关重要。 3. **UI系统**: ICS引入了新的Holo设计风格,源码中展示了如何构建和自定义用户界面组件。你可以...
本篇文章将聚焦于Android 4.0(代号Ice Cream Sandwich,简称ICS),通过分析“android-14.rar”压缩包中的源码,揭示这一版本的关键特性与实现机制。 “android-14.rar”文件包含了Android 4.0的源代码,这对于...
Android源码是一个对开发者至关重要的资源,特别是对于那些想要深入理解Android系统运行机制以及应用程序开发的程序员。Android 4.0(代号冰淇淋三明治)是Google发布的一个重要版本,它引入了许多新特性和改进,为...
- 跨进程通信(IPC)机制。 4. **《Android程序开发初级教程》PDF版技术文档** - **概述**:针对初学者,提供了从零开始学习Android开发的方法。 - **核心知识点**: - Java语言基础复习。 - Android Studio的...
- Android中进程间通信(IPC)机制包括Intent、Binder、ContentProvider、Messenger等。 25. Android程序入口: - Android应用程序的入口是ActivityThread中的main方法。 26. 网络访问方式: - Android中可以...