- 浏览: 677649 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 23018Android 安全机制概述 ... -
Android的权限机制之—— “沙箱”机制sharedUserId和签名
2013-12-13 11:29 14706Android“沙箱”的本质是为了实现不同应用程序和进程之 ... -
AIL(Android init Language)
2013-12-03 14:16 1914AIL(init.rc) Init.rc是i ... -
Android源码下编译自己的so库
2013-11-07 17:33 2933环境:win7 64位,虚拟机ubuntu10.04,TI ... -
修改framework代码使锁屏完全透明
2013-11-04 14:30 13901,修改KeyguardViewManager.java的ma ... -
开机动画流程
2013-11-01 10:30 14171、开机动画程序bootanimation程序目录:fram ... -
Android 软件测试日志文件抓取
2013-10-17 10:43 37991 log文件分类简介 实时打印的主要有: ... -
android 驱动开发介绍
2013-10-10 11:12 7780前言 意外在网上发现了这扁文章,看后感觉很有必要分享,所 ... -
Android系统Recovery工作原理之使用update.zip
2013-09-13 11:06 97921 总述 为了方便客户日后的固件升级,本周研究 ... -
android 升级策略
2013-09-12 09:50 1170Android系统而言升级意味着二个方面的升级 一个是系 ... -
Android FactoryTest 流程
2013-09-10 17:52 2728Android内置的Factory Test(有测试模式/工 ... -
Ubuntu下ADB调试Android找不到设备的解决方法
2013-09-10 10:13 2005首先确认,我已经在的settings-application ... -
系统移植之为Android启动加速
2013-05-15 13:50 3135Android的启动速度一直以来是他的诟病,虽然现在And ... -
Android系统做了哪些优化?
2013-04-23 10:11 1460Android系统框架和上层应用是类java( ... -
CM10之Setting的快速设置面板按钮布局
2013-04-19 16:03 1842开发环境 ubuntu12.04-desktop-amd6 ... -
Android编译CPU架构体系不同引起的错误解决方法
2013-04-19 10:53 5347转至http://blog.csdn.net/canjian ... -
android系统硬件抽象层(HAL)原理及实现之原理
2013-04-17 15:48 4173Android系统硬件抽象层(HAL)原理 在androi ... -
正确了解ROM,基带,以及RIL
2013-04-17 15:45 5867一、正确了解ROM,基带,以及RIL。 1)、R ... -
Android系统开发之修改调试SystemUI
2013-04-11 10:44 3979开发环境 ubuntu12.04-desktop-amd6 ... -
下载cm10.1源码编译
2013-03-21 10:43 2830开发环境 http://dengzhangta ...
相关推荐
通过关联这个源代码到Eclipse或Android Studio,开发者可以深入研究Android API的内部机制,调试问题,优化性能,甚至为Android系统做出贡献。这对于提升开发技能,解决复杂问题,以及创建高效能的应用程序都极其...
本篇文章将围绕Android 4.0源码展开,揭示其内部工作机制,帮助开发者更好地理解和利用源码进行程序编写。 一、源码的用途与价值 在Android开发中,查看源码能够帮助开发者: 1. **理解API工作原理**:源码是API的...
### Android 4.0 源代码下载及解析 #### Android 概述 Android 是一个基于 Linux 内核的开放源代码操作系统,主要用于各种移动设备,如智能手机和平板电脑等。自 2003 年由 Andy Rubin 开发以来,Android 经历了多...
6. **多进程架构**:为了提高稳定性,Android 4.0 Browser采用了多进程架构,将渲染引擎放在单独的进程中运行,防止网页崩溃影响整个应用。 7. **缓存机制**:Browser使用本地缓存来加快页面加载速度,源码中可以...
这个压缩包文件“android4.0_Browser”很可能包含与Android 4.0浏览器相关的源代码、资源文件和其他开发文档,帮助开发者理解和改进这个版本的浏览器。 Android 4.0浏览器采用了WebKit渲染引擎,WebKit是开源项目,...
### 最新的Android 4.0模拟器安装与使用教程 #### 一、前言 随着移动互联网技术的发展,Android系统已成为智能手机市场的主导力量之一。为了更好地进行应用开发、测试及用户体验,开发者通常需要借助模拟器来模拟...
【Android 4.0 系统详解】 Android 4.0,代号"Ice Cream Sandwich"(冰淇淋三明治),是Google在2011年推出的一个重要版本,旨在为智能手机和平板电脑提供统一的操作系统体验。这个版本的发布标志着Android系统在...
在Android 4.0(Ice Cream Sandwich)系统中,Camera模块是系统的重要组成部分,它为开发者提供了丰富的功能,包括拍照、录制视频、设置参数等。本文将深入探讨Android 4.0 Camera源码中的关键知识点。 一、Camera...
在Android 4.0中,开发者可以使用AsyncTask、HandlerThread、IntentService等机制来管理网络线程。 8. 网络安全性:随着网络应用的广泛普及,网络安全越来越受到重视。Android 4.0提供了SSL/TLS支持,开发者可以...
在Android 4.0(Ice Cream Sandwich,简称ICS)系统中,设计团队为用户带来了全新的图标设计风格,旨在提供更加统一、现代且易识别的视觉体验。这个压缩包文件"android 4.0系统自带图标"显然是包含了这一版本系统中...
以下是关于"android4.0 日历源码Calendar"的一些关键知识点: 1. **日历服务(Calendar Service)** - Android中的日历服务由`com.android.calendar`包下的`CalendarProvider2`类提供,它是Android系统的Content ...
《细说Android 4.0 NDK编程》是一本深入探讨Android Native Development Kit(NDK)的书籍,专为Android开发者提供关于NDK使用的详细指南。NDK是Google推出的一个工具集,允许开发者使用C/C++等原生代码在Android...
这些内容是Android开发的基石,掌握它们将有助于理解Android系统的运作机制,从而能够编写出高效、稳定的应用程序。 通过黑马程序员的课程学习,你可以逐步建立起Android开发的知识体系,无论是想要从事移动应用...
对于Android 4.0(也称为Ice Cream Sandwich,简称ICS),了解如何下载源码是开发者和研究者的基础工作。本文将详细介绍如何使用`repo`工具下载Android 4.0的源码。 首先,`repo`是一个由Google开发的Python脚本,...
4. **应用程序框架**:这部分源代码定义了Android应用程序的结构和行为,如Android运行时(ART)、Android应用程序组件模型、Intent机制等。开发者可以通过这些接口构建自己的应用程序。 5. **UI框架**:Android ...
2. **ddms (Dalvik Debug Monitor Service)**:这是Android系统的一种强大的调试工具,提供设备内存使用情况、线程和进程信息、UI事件追踪等功能,支持模拟器和物理设备。 3. **emulator**:Android模拟器,用于在...
在Android 4.0(代号Ice Cream Sandwich,简称ICS)时代,测试代码的重要性得到了显著提升,因为这个版本引入了许多新特性和优化,为开发者带来了更丰富的功能和更好的用户体验。以下是一些关于Android 4.0测试代码...
《深入剖析Android 4.0 SDK源码》 Android 4.0,也被称为Ice Cream Sandwich(ICS),是Google发布的一个重要版本,为移动设备带来了许多新的特性和改进。源码是理解Android系统运行机制的关键,它揭示了操作系统...
本文将围绕"android4.0 Launcher2"这一主题,深入探讨其关键知识点。 一、Launcher2概述 Launcher2是在Android 4.0系统中默认的启动器,负责管理应用程序的快捷方式和小部件。它是一个基于组件的系统服务,运行在...