android低内存管理策略

android低内存管理策略
android低内存管理策略

android低内存管理策略

.

Revision History

Date Issue Description Author

<11/29/2011> <0.1> android低内存管理策略兰琮

? Tech, 2008 Page 1 of 14

目录

1.ANDROID内存管理简介 (3)

2.LOW MEMORY KILLER介绍 (4)

2.1基本原理 (4)

2.2L OW M EMORY K ILLER与OOM的区别 (4)

2.3L OW M EMORY K ILLER的实现方式 (4)

2.4用户设置的接口 (5)

3.如何计算各进程的ADJ值? (6)

几种查看进程内存的方法:: (9)

4.几种查看进程内存的方法

4.1TOP命令 (9)

4.2CAT PROC/MEMINFO (9)

4.3PS命令 (11)

4.4PROCRANK命令 (11)

4.5DUMPSYS MEMINFO命令 (12)

5.ANDROID中设置中的可用内存的由来 (12)

? Tech, 2008 Page 2 of 14

1. android内存管理简介

android按照进程的重要性,将进程分为6部分,如下图,重要性依次降低。

台进程((foreground):目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer

1.前台进程

Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。

2.可见进程

可见进程((visible):可见进程是一些不再前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)

次要服务((secondary server):目前正在运行的一些服务(主要服务,如拨号等,是不可能被3.次要服务

进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也不太希望他们被终止

后台进程((hidden):虽然作者用了hidden这个词,但实际即是后台进程(background),就4.后台进程

是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点

内容供应节点(content provider):没有程序实体,进提供内容供别的程序去用的,比如日历供5.内容供应节点

应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权

6.空进程

空进程((empty):没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或

? Tech, 2008 Page 3 of 14

者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。

大家知道android是基于linux的,linux的内存管理方式是OOM方式的,但是android的内存管理和linux的不同,linux的进程一旦进程活动结束就结束进程,回收内存,但是android是嵌入式系统,要考虑到应用启动的频繁和嵌入式系统内存,CPU不够强悍的原因,android并不马上结束进程,而是将这些进程保存到内存中,如果你的手机内存足够,会发现你的内存越来越少。直到你启动一个比较消耗内存大的应用,这个时候android的内存管理才会启动自已的优先级策略,杀掉一些他认为的优先级不高和内存阀值太多的应用(low memroy killer策略),平时这些在后台的应用程序只是保存在内存中,只保留了下次启动时所必须的一些变量值,并不在后台运行,即是不占用CPU资源(这个和WINDOWS的应用有很大区别),因此基于这个原理可以说市场上的android的一些后台管理杀进程的软件本身是没有必要的,是违背android的内存设计原理的。杀进程软件只会使得启动新应用更慢,并且耗费额外的CPU资源和其他资源,得不偿失。

2. Low Memory Killer介绍

2.1 基本原理

Android的Low Memory killer是在标准的linux kernel的OOM基础上修改而来的一种内存管理机制,当系统内存不足时,杀死Bad进程释放其内存,Bad进行的选择标准有2个:oom_adj和占用内存的大小,oom_adj代表进程的优先级,数值越大,优先级越高,对应每个oom_adj都有一个空闲内存的阀值。系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,赋予各个进程。Android Kernel每隔一段时间会检查当前内存是否低于某个阀值,如果是,则杀死oom_adj最大的Bad进程,如果有2个以上的Bad进程oom_adj相同,则杀死其中占用内存最多的

2.2 Low Memory Killer与OOM的区别

OOM即Out of Memory是标准linux Kernel的一种内存管理机制,Low Memory Killer在它基础上作了改进:

基于多个标准给每个进程打分,分最高的进程将被杀死;Low Memory Killer则用oom_adj和占用内存的大小来选择Bad进程。

OOM在内存分配不足时调用,而Low Memory Killer每隔一段时间就会检查,一旦发现空闲内存低于某个阈值,则杀死Bad进程。

2.3 Low Memory Killer的实现方式

Low Memory Killer的源代码在drivers/staging/Android/lowmemorykiller.c中,它是通过注册Cache Shrinker 来实现的。Cache Shrinker是标准linux kernel回收内存页面的一种机制,它由内核线程kswapd监控,当空闲内存页面不足时,kswapd会调用注册的Shrinker回调函数,来回收内存页面。

Low Memory Killer是在模块初始化时注册Cache Shrinker的,代码如下:

? Tech, 2008 Page 4 of 14

lowmem_shrinker的定义如下:

register_shrinker 会将lowmem_shrink 加入Shrinker List 中,被kswapd 在遍历Shrinker List 时调用,而Low Memory Killer 的功能就是在lowmem_shrink 中实现的。

进程的依据,这两个数组的定义如下:

lowmem_shrink 用两个数组作为选择Bad

lowmem_minfree 保存空闲内存的阈值,单位是一个页面4K,lowmem_adj 保存每个阈值对应的优先级。

lowmem_shrink 首先计算当前空闲内存的大小,如果小于某个阈值,则以该阈值对应的优先级为基准,遍历各个进程,计算每个进程占用内存的大小,找出优先级大于基准优先级的进程,在这些进程中选择优先级最大的杀死,如果优先级相同,则选择占用内存最多的进程。lowmem_shrink 杀死进程的方法是向进程发送一个不可以忽略或阻塞的SIGKILL 信号:

2.4 用户设置的接口

设置空闲内存阈值的接口:/sys/module/lowmemorykiller/parameters/minfree

设置对应优先级的接口:/sys/module/lowmemorykiller/parameters/adj

设置各个进程优先级的接口:/proc/<进程pid>/oom_adj

同时在system/core/rootdir/init.rc中配置了各进程的优先级:

配置了各进程杀掉的阀值:

? Tech, 2008 Page 5 of 14

配置了用户可以更改的默认值设置:

同时看一下,系统的第一个进程init的adj吧:

Init的默认为-16,最高优先级,永远不会被杀掉。

minfree每一个警戒值对应了一个重要性值,当系统的可用内存低于某个警戒值时,就杀掉所有大于该警戒值对应的重要性值的程序。比如说,当可用内存小于6144 * 4K = 24MB时,开始杀所有的EMPTY_APP,当可用内存小于5632 * 4K = 22MB时,开始杀所有的CONTENT_PROVIDER和EMPTY_APP。

3. 如何计算各进程的ADJ值?

Low Memory Killer主要是依据各进程的adj的值来杀进程的,也就是说adj值越大,越可能被杀掉,那adj的值是如何被计算出来的呢?

参加代码frameworks/base/services/java/com/android/servics/am/AcitityManagerService.java 中的函数computeOomAdjLocked(),此函数用来OOM进程指定应用进程的优先级。

(1)判断该进程是否是TOP_APP。TOP_APP是一个局部变量,保存了当前正在运行的ProcessRecord对象,如果是,那么其优先级自然是最高的,为常量FOREGROUND_APP_ADJ,该值是在Linux系统启动后在init.rc文件中初始化的,其

值为0。

(2)判断该进程中是否包含instrumentationClass,该值一般在UnitTest进程中会存在,而在一般的应用程序中都不包含该对象。

(3)判断进程中是否包含持久的Activity对象,如果有,其优先级也是最高的。

(4)判断是否包含正在执行的Receiver对象,如果有,也是最高优先级。

(5)判断当前是否有正在执行的Service,如果有,也是最高优先级。

以上五步中,adj的赋值都是FOREGROUND_APP_ADJ,即在这五种情况下,指定的客户进程都不能被杀死,其优先级最高,而且平等。

(6)判断指定的进程是否正在调用前台进程的service对象。如果是的话,则其优先级为VISIBLE_APP_ADJ,该值为1,说明这种情况的进程优先级略低于前台进程,但因为它和前台进程正处于互动,所以还是有一定的优先级。

(7)判断forcingToForground变量是否为空,如果不为空,说明该进程正在被用户强制调到前台。这种情况只是瞬间的,当然如果是这样,其优先级自然比较高,为VISIBLE_APP_ADJ。

(8)判断是否为Home进程,是的话优先级调整为HOME_APP_ADJ,其值为4。有些读者觉得奇怪,为什么Home进程的优先级还低于前面的情况呢?原因是,如果当前正在前台执行Home程序,其优先级自然是前面几步的情况,而如果不是前台进程的话,其优先级仅仅比普通进程高一点点而已。

(9)如果当前进程包含的Activity数目大于0,并且包含了visible的Activity,那么其优先级为VISIBLE_APP_ADJ。如果没有visible的Activity,则意味着该进程可以被隐藏了,所以优先级为hiddenAdj,即当前系统中的隐藏值。

? Tech, 2008 Page 6 of 14

(10)对于其他情况,说明仅仅是一个空进程,优先级最低,此时设置app.empty变量为true,并且其adj值为hiddenAdj。

除此之外,进程中还包含了一些不处于运行状态的对象,包括service和provider两种。因此,接下来继续根据这个条件设置adj值。

(1)判断是否为mBackupTarget进程。由于"备份进程"要在后台持续收集数据,因此,其优先级应该高于一般的进程,为.BACKUP_APP_ADJ(2),但却要低于VISIBLE进程。

(2)处理当前进程中包含非前台service的情况。所谓的非前台service是指该service不属于前台进程,也没有和前台进程正在交互,其处理过程如下面子流程。

① 首先以下所有处理均在该app包含的service对象中,并且其优先级不是前台进程FOREGROUND_APP_ADJ或者所在调度组为"背景非交互"类型,如以下代码所示:

② 循环针对每一个service的状态调整adj值。在每一个service对象中,判断该service是否被请求启动过,即判断s.startRequested是否为true。如果为true,说明有某个进程请求启动过该service,否则该service还没有被启动过。如果已经启动,并且还没有超出"待机时间(MAX_SERVICE_INACTIVITY)"30分钟,那么其优先级会被设置为SECONDARY_SERVER_ADJ,仅次于VISIBLE。

③ 处理和该service有连接的客户端(client),并根据其客户端的优先级调整该service的优先级。首先判断客户端是否是该进程本身,即在同一个进程中调用其内部的service,这种当然就不用再处理了,保持已有的优先级即可,如以下代码所示:

④ 判断该service是否以BIND_AUTO_CREATE方式启动,如果是则说明该service的重要程度取决于客户端本身,否则不做任何处理。处理的逻辑是,首先根据client的hiddenAdj值调整当前的hiddenAdj值,规则是如果当前值大于client

VISIBLE_APP_ADJ。

的值,则把当前值调为client值,但不能大于

获得了新的myHiddenAdj值后,以此为新的参数,递归调用computeOomAdjLocked(..., myHiddenAdj, ...),并计算该client的adj值。同样,得到返回的adj后,如果当前adj大于client的adj,则使用client的adj作为该app的adj。

以上规则的另一个意思就是,如果当前app没有client重要,则把其重要性调整成和client相同重要,否则保持当前的重要性。

⑤ 判断这个客户连接是否有对应的Activity,并且该Activity是否处于RESUMED状态或者正在暂停(PAUSING)状态。如果是的话,则说明这个客户连接很重要,同样,该app也就很重要了,优先级重新设置为FOREGROUND_APP_ADJ。

? Tech, 2008 Page 7 of 14

⑥ 估算完service后,如果adj值大于hiddenAdj,则使用hiddenAdj作为adj值。这样仅仅是为了避免"滥杀无辜",因为如果不调整adj为hiddenAdj,那么该进程的优先级会很低,导致会被优先杀死,然而,既然该app包含了service,所以可以暂时让其存在,以便后面再使用时能够快速启动。

(3)接下来处理provider的情况。其处理逻辑和处理service的基本相同,不同处在于,ContentProviderRecord对象有一个externals对象。这是一个int值,代表了连接该provider的非framework的进程id。这是什么意思呢?即可以使用C/C++写一个Linux应用程序,运行于Android底层的Linux系统之上,并且使用Android所提供的底层provider 库来访问系统中已有的provider对象,而这个externals就是这个非framework进程的id号。如果有这种情况存在,则调整adj的优先级为最高,因为framework并不想破坏native进程的访问,毕竟既然能用native去访问,足见该provider的重要性。

(4)以上步骤终于计算出了一个合适的adj值,最后要做的就是查看该adj值是否超过了app所指定的最大值,即maxAdj。如果超过了,则赋值为maxAdj,该变量是在该app进程启动时指定的,其含义是就像在说:"如果系统需要,可以降低我的重要性,但是不能超过maxAdj,这是我的容忍极限。"

(5)此时,adj已经是大家都满意的adj值了,于是把它赋值给app的curAdj值,并把schedGroup赋值给app的curSchedGroup变量。

至此,进程的adj已经计算出来了。真正设置进程adj值的地方在函数updateOomAdjLocked()

中。判断当前的进程如果adj值发生变化,就调用Process.setOomAdj()方法设置进程的adj

在上面也讲到,Low Memory Killer本身就是就是基于linux的OOM来修改的内存管理,setoomAdj实现在文件framewrok/base/core/jni/android_util_Process.cpp中,

实现函数

这里和前面讲的一样,是打开/proc/进程号/oom_adj直接设置进程的Adj的。

? Tech, 2008 Page 8 of 14

? Tech, 2008

Page 9 of 14

4.

几种查看几种查看进程进程进程内存的方法内存的方法内存的方法::

4.1

top 命令

实时显示系统中各个进程的资源占用状况。即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top 命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU 最“敏感”的任务列表.该命令可以按CPU 使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

top [-] [d] [p] [q] [c] [C] [S] [s] [n] 4.2参数说明

d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s 交互命令来改变之。 p 通过指定监控进程ID 来仅仅监控某个进程的状态。

q 该选项将使top 没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top 将以尽可能高的优先级运行。 S 指定累计模式

s 使top 命令在安全模式中运行。这将去除交互命令所带来的潜在危险。 i 使top 不显示任何闲置或者僵死进程。 c 显示整个命令行而不只是显示命令名

4.2

cat proc/meminfo

读出的内核内存信息进行解释 MemTotal: 507480 kB MemFree: 10800 kB Buffers: 34728 kB Cached: 98852 kB SwapCached: 128 kB Active: 304248 kB Inactive: 46192 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 507480 kB LowFree: 10800 kB SwapTotal: 979956 kB SwapFree: 941296 kB Dirty: 32 kB Writeback: 0 kB AnonPages: 216756 kB Mapped: 77560 kB Slab: 22952 kB SReclaimable: 15512 kB SUnreclaim: 7440 kB PageTables: 2640 kB NFS_Unstable: 0 kB Bounce: 0 kB

CommitLimit: 1233696 kB Committed_AS: 828508 kB VmallocTotal: 516088 kB VmallocUsed: 5032 kB

VmallocChunk: 510580 kB

MemTotal: 所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码大小)MemFree: LowFree与HighFree的总和,被系统留着未使用的内存

Buffers: 用来给文件做缓冲大小

Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus SwapCache ). SwapCached:被高速缓冲存储器(cache memory)用的交换空间的大小已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。

Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用. Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径. HighTotal:

HighFree: 该区域不是直接映射到内核空间。内核必须使用不同的手法使用该段内存。LowTotal:

LowFree: 低位可以达到高位内存一样的作用,而且它还能够被内核用来记录一些自己的数据结构。Among many

other things, it is where everything from the Slab is

allocated. Bad things happen when you're out of lowmem.

SwapTotal: 交换空间的总大小

SwapFree: 未被使用交换空间的大小

Dirty: 等待被写回到磁盘的内存大小。

Writeback: 正在被写回到磁盘的内存大小。

AnonPages:未映射页的内存大小

Mapped: 设备和文件等映射的大小。

Slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。

SReclaimable:可收回Slab的大小

SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)

PageTables:管理内存分页页面的索引表的大小。

NFS_Unstable:不稳定页表的大小

VmallocTotal: 可以vmalloc虚拟内存大小

VmallocUsed: 已经被使用的虚拟内存大小。

VmallocChunk: largest contigious block of vmalloc area which is free

? Tech, 2008 Page 10 of 14

4.3 ps命令

该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等

该命令语法格式如下:

ps [选项]

下面对命令选项进行说明:

-e 显示所有进程。

-f 全格式。

-h 不显示标题。

-l 长格式。

-w 宽输出。

a 显示终端上的所有进程,包括其他用户的进程。

r 只显示正在运行的进程。

x 显示没有控制终端的进程

4.4 procrank命令

procrank 命令可以获得当前系统中各进程的内存使用快照,包括PSS,USS,VSS,RSS

我们一般观察Uss来反映一个Process的内存使用情况,Uss 的大小代表了只属于本进程正在使用的内存大小,这些内存在此Process被杀掉之后,会被完整的回收掉,

Vss和Rss对查看某一Process自身内存状况没有什么价值,因为他们包含了共享库的内存使用,而往往共享库的资源占用比重是很大的,这样就稀释了对Process自身创建内存波动。

而Pss是按照比例将共享内存分割,某一Process对共享内存的占用情况。

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

?VSS

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存) ?RSS

PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) ?PSS

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) ?USS

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

? Tech, 2008 Page 11 of 14

? Tech, 2008

Page 12 of 14

4.5

dumpsys meminfo 命令

dumpsys meminfo 可以查出native 和dalvik 分别占用多少内存

dumpsys 用来给出手机中所有应用程序的信息,并且也会给出现在手机的状态。 dumpsys [Option]

meminfo 显示内存信息 cpuinfo 显示CPU 信息 account 显示accounts 信息

activity 显示所有的activities 的信息 window 显示键盘,窗口和它们的关系 wifi 显示wifi 信息

5. android 中设置中的可用内存的由来

在android 手机使用中,如果不断使用,会发现内存会消耗越来越多,后来甚至出现内存不足杀死进程的情况,在android 手机设置-》应用程序设置—》管理应用程序-》正在运行里面可以直观的现实当前的可用内存情况:

那么这个可用的RAM内存怎么算出来的呢?能不能作为系统内存低的依据呢?于是我们看一下其实现的代码:

代码位于packages/apps/settings/src/com/android/settings/application/RunnningProcessesView.java文件实现刷新的函数为refreshUi()

可用内存的计算方法:

先求得当前可用的内存:readAvailMem()

从代码中看到可用内存大小为proc/meminfo中MemFree和Cached的总和。

计算可用大小的公式在下面:

这里算出的是除去次要服务的内存,前面讲了,次要服务是目前正在运行的一些比较重要的服务,一般不可能被中止。再来回顾一下init.rc里面

各进程的优先级,次要服务进程是android能容忍杀死进程的极限,换一种说法,就是说你无论怎么杀进程,次要服务进程是不可能被杀掉的,因此在可用的内存里面必须要减掉。

Sizestr就是计算可用内存的公式,可用内存的还包括后台当前运行的一些进程,这些进程优先级较低,是可以被杀掉的,故可以算在可用的内存范围内。

于是设置的可用内存公式出来了:

? Tech, 2008 Page 13 of 14

设置中可用内存= Free 内存大小+cache内存大小– 次要服务内存大小+当前后台可被杀死的进程运行的内存大小

因此设置中可用内存大小实际上指的是后台可被杀死进程的总大小。

当前后台可被杀死的进程大小具体是怎么计算的呢?我们可以继续追踪代码:

代码在RunningState.java文件下的update函数中。

通过遍历所有的进程,找到importance大于等于IMPORTANCE_BACKGROUND的进程size进行累加:

Importance其实就是根据之前计算的进程的Adj进行赋值的。在文件ActivityManagerService.java中函数getRunningAppProcesses中有如下代码:

由上面的代码看到backgroundProcessMemory其实就是后台所有Adj为空进程+hidden_app+home_app三部分的进程size的总和。其中进程的size大小指的是PSS的大小,这个可以通过procrank和dumpsys meminfo查看出来。

? Tech, 2008 Page 14 of 14

权限说明大全

程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 各种权限说明如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get upload ed) android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location) android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) android.permission.ACCESS_MOCK_LOCA TION 允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) android.permission.ACCESS_NETWORK_STA TE 允许程序访问有关GSM网络信息(Allows applications to access information about networks) android.permission.ACCESS_SURFACE_FLINGER 允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceF linger’s low level features) android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) android.permission.ADD_SYSTEM_SERVICE 允许程序发布系统级服务(Allows an application to publish system-level services). android.permission.BA TTERY_STATS 允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices) android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices) android.permission.BRICK 请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).) android.permission.BROADCAST_PACKAGE_REMOVED 允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application package has been removed) android.permission.BROADCAST_STICKY 允许一个程序广播常用intents(Allows an application to broadcast sticky intents) android.permission.CALL_PHONE

Android用户权限列表

我们在安装Android软件的时候,系统会提示该软件所需要的权限,相对于其他系统,android的权限非常多。我们在开发软件的时候,也需要声明相应的权限,比如希望软件能发短信,需要声明软件调用短信的权限,否则软件运行的时候就会报错。 Android的权限在AndroidManifest.xml文件里配置。AndroidManifest文件中有四个标签与permission有关,它们分别是 。其中最常用的是 ,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明 。 [html]view plain copy 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... 11. 12. 的作用相似,两者之间的不同之处, 是android预定义的权限,是自己定义的权 限。 用的相对较少, 这两个标签就更少见了,简单说 就是声明一个标签,该标签代 表了一组permissions,而是为一组permissions声明了一个namespace。后面三个标签具体使用方法见后续文章。 定义方法如下:

浅谈Android(安卓)

浅谈Android--嵌入式操作系统 Android(读音:[??ndr?id],中文俗称安卓)是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google成立的Open Handset Alliance (OHA,开放手持设备联盟)持续领导与开发中。 --题记.维基百科说起嵌入式系统,曾经在保罗大叔的著作《黑客与画家》里看到多次,然后不明所以,就去查了嵌入式系统。如果说嵌入式系统给我的第一印象是硬件,那么是我还不知道嵌入式在我生活里已经出现了很多年了。 大到冰箱,自动存款机(ATM),小到电子手表,遥控器。在维基百科解答后,我对嵌入式直观的理解,是一种特定的植入硬件并极具针对性的计算机系统。 后来慢慢了解嵌入式的软件方面,就知道了嵌入式操作系统,而其中的佼佼者,就是如今已经超越ios,占据半壁江山的Android。 之所以会说Android,原因有二:一,因为Android如今炙手可热,在新一季度的日本手机软件营销额上,以Java等语言为Android系统开发的Apps,疯狂揽金,李开复断言在两年内,中国内地手机游戏软件市场,将会百花齐放;二,我虽并非研究Java也非致力于Android系统,但是Android系统的内核,却是我所熟悉的Linux内核。而我将自己的开发平台转移到Linux系统,并以Python,Perl以及Lisp语言作为未来的生存工具,所以,就让我们谈一谈Android。 题记中套用维基百科对于Android的介绍,主要的目的,就是为了澄清一件事实“认知”——Android并没有真正的中文名。 Google并没有为Android命名,只有为其版本取名,且翻译成中文:4.2.x Jelly Bean 果冻豆,4.0.x Ice Cream Sandwich 冰激凌三明治,3.x.x Honey

ANDROID BITMAP内存限制OOM,OUT OF MEMORY

ANDROID BITMAP内存限制OOM OUT OF MEMORY 在编写Android程序的时候,我们总是难免会碰到OOM的错误,那么这个错误究竟是怎么来的呢?我们先来看一下这段异常信息: 08-14 05:15:04.764: ERROR/dalvikvm-heap(264): 3528000-byte external allocation too large for this process. 08-14 05:15:04.764: ERROR/(264): VM won't let us allocate 3528000 bytes 08-14 05:15:04.764: DEBUG/skia(264): --- decoder->decode returned false 08-14 05:15:04.774: DEBUG/AndroidRuntime(264): Shutting down VM 08-14 05:15:04.774: WARN/dalvikvm(264): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 08-14 05:15:04.774: ERROR/AndroidRuntime(264): Uncaught handler: thread main exiting due to uncaught exception 08-14 05:15:04.794: ERROR/AndroidRuntime(264): https://www.360docs.net/doc/6d16109415.html,ng.OutOfMemoryError: bitmap size exceeds VM budget 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:447) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:346) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:372) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at com.xixun.test.HelloListView.onCreate(HelloListView.java:33) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.os.Handler.dispatchMessage(Handler.java:99) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.os.Looper.loop(Looper.java:123) 08-14 05:15:04.794: ERROR/AndroidRuntime(264): at android.app.ActivityThread.main(ActivityThread.java:4363)

Android开发内存泄漏及检查工具使用培训资料

Android 开发内存泄漏及检查工具使用培 训资料

目录 1内存泄露 (3) 1.1 内存泄露的概念 (3) 1.2 开发人员注意事项 (4) 1.3 Android(java)中常见的引起内存泄露的代码示例 (4) 1.3.1查询数据库没有关闭游标 (6) 1.3.2 构造Adapter时,没有使用缓存的convertView (6) 1.3.3 Bitmap对象不在使用时调用recycle()释放内存 (7) 1.3.4 释放对象的引用 (8) 1.3.5 其他 (9) 2内存泄露的分析工具 (9) 2.1 内存监测工具DDMS --> Heap (9) 2.2 内存分析工具MAT (Memory Analyzer Tool) (10) 2.2.1 生成.hprof文件 (10) 2.2.2 使用MA T导入.hprof文件 (11) 2.2.3 使用MA T的视图工具分析内存 (12)

1内存泄露 Android 应用程序开发以Java语言为主,而Java编程中一个非常重要但却经常被忽视的问题就是内存使用的问题。Java的垃圾回收机制(Garbage Collection 以下简称GC)使得很多开发者并不关心内存使用的生命周期,只顾着申请内存,却不手动释放废弃的内存,而造成内存泄露,引起很多问题,甚至程序崩溃。Android的虚拟机Dalvik VM和java虚拟机JVM没有什么太大的区别,只是在字节码上稍做优化,所以Android应用开发中同样会出现内存泄露的问题。而且由于Android智能平台主要用于嵌入式产品开发,可用的内存资源更加稀少,所以对于我们Android应用开发人员来说,就更该了解Android程序的内存管理机制,避免内存泄露的发生。 1.1 内存泄露的概念 在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。 一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。 这里我们只简单的理解,在java程序中,如果已经不再使用一个对象,但是仍然有引用指向它,GC就无法收回它,当然该对象占用的内存就无法再被使用,这就造成内存泄露。可能一个实例对象的内存泄露很小,并不会引起很大的问题。但是如果程序反复做此操作或者长期运行,造成内存不断泄露,终究会使程序无内存可用,只好被系统kill掉。在以下情况,内存泄漏导致较严重的后果: * 程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理); * 新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时; * 程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候; * 泄漏在操作系统内部发生; * 泄漏在系统关键驱动中发生; * 内存非常有限,比如在嵌入式系统或便携设备中; * 当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

Android的原理:关于应用自启动,占内存那些问题

Android的原理-不需要太多的剩余内存 Android用RAM的方式,跟windows、WM、Sybiam是两回事。在Android里,RAM被用满了是件好事。它意味着你可以快速打开之前打开的软件,回到之前的位置。所以Android 很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的手机。而实际上,退出后重启这些程序才真正拖慢了手机的响应。而且这些自动杀进程的软件本身是个时刻活跃的进程,它始终在后台保持活跃使得CPU难以消停,反而增加了耗电量。 不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本来就是安卓Android标榜的优势之一,如果人为去关闭进程,没有太大必要.特别是自动关进程的软件. 到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候.这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统.所以,论坛上有个更改内存阀值的程序可以有一定改善. 但改动也可能带来一些问题,取决于值的设定. 那么,进程管理软件有无必要呢?有的.就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度.但一些小程序,完全可交由系统自己管理.谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电.我就说说安卓Android后台的原理,你就明白了.安卓Android 的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态.所以为什么有的程序切出去重进会到主界面.但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务.服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了.这个在进程管理软件里能看到,标签是service.所以没有带服务的应用在后台是完全不耗电的,没有必要关闭.这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个安卓Android的优点呢? 还有一个.为什么安卓Android一个应用看起来那么耗内存.大家知道,安卓Android上的应用是java,当然需要虚拟机,而安卓Android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机.这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存. 以上这些设计确保了安卓Android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现.大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要.

Android permission 访问权限说明手册

Android permission 访问权限说明手册 tech.er 2011年2月12日 android平台上的权限许可分得很细,如果软件无法正常执行时,首先要检查是不是缺少相关的permission声明,以下就把permission 访问权限列举出来供大家参考。 程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location) android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) android.permission.ACCESS_MOCK_LOCATION 允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) android.permission.ACCESS_NETWORK_STATE 允许程序访问有关GSM网络信息(Allows applications to access information about networks) android.permission.ACCESS_SURFACE_FLINGER 允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features) android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) android.permission.ADD_SYSTEM_SERVICE 允许程序发布系统级服务(Allows an application to publish system-level services). android.permission.BATTERY_STATS 允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) android.permission.BLUETOOTH

Android 应用程序内存泄漏的分析

Android 应用程序内存泄漏的分析以前在学校里学习Java的时候,总是看到说,java是由垃圾收集器(GC)来管理内存回收的,所以当时形成的观念是Java不会产生内存泄漏,我们可以只管去申请内存,不需要关注内存回收,GC会帮我们完成。呵呵,很幼稚的想法,GC没那么聪明啊,理论及事实证明,我们的Java程序也是会有内存泄漏的。 (一)Java内存泄漏从何而来 一般来说内存泄漏有两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,没有将其释放,或者是在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。 (二)需要的工具 1.DDMS—Update heap Gause GC Heap 是DDMS自带的一个很不错的内存监控工具,下图红色框中最左边的图标就是该 工具的启动按钮,它能在Heap视图中显示选中进程的当前内存使用的详细情况。下图 框中最右边的是GC工具,很多时候我们使用Heap监控内存的时候要借助GC工具,点 击一次GC按钮就相当于向VM请求了一次GC操作。中间的按钮是Dump HPROF file,它 的功能相当于给内存拍一张照,然后将这些内存信息保存到hprof文件里面,在使用我 们的第二个工具MAT的时候会使用到这个功能。 2.MAT(Memory Analyzer Tool) Heap工具能给我们一个感性的认识,告诉我们程序当前的内存使用情况和是否存在内存 泄漏的肯能性。但是,如果我们想更详细,更深入的了解内存消耗的情况,找到问题所 在,那么我们还需要一个工具,就是MAT。这个工具是需要我们自己去下载的,可以下 载独立的MAT RCP 客户端,也可以以插件的形式安装到Eclipse里面,方便起见,推荐 后者。 安装方法: A.登录官网https://www.360docs.net/doc/6d16109415.html,/mat/downloads.php B.下载MAT Eclipse插件安装包(红框所示,当然你也可是选择Update Site在线安装,个人觉得比较慢)

android内存管理-MAT与防范手段

内存管理与防范手段 目录 内存管理与防范手段 (1) 一.内存分配跟踪工具DDMS–>Allocation tracker 使用 (2) 二.内存监测工具DDMS-->Heap (2) 三.内存分析工具MAT(MemoryAnalyzerTool) (3) 1.生成.hprof文件 (4) 2.使用MAT导入.hprof文件 (5) 3.使用MAT的视图工具分析内存 (5) 四.MAT使用实例 (5) 1.生成heap dump (7) 2.用MAT分析heap dumps (9) 3.使用MAT比较heap dumps (11) 五.防范不良代码 (11) 1.查询数据库没有关闭游标 (11) 2.缓存convertView (12) 3.Bitmap对象释放内存 (13) 4.释放对象的引用 (13) 5.Context的使用 (14) 6.线程 (17) 7.其他 (20) 六.优化代码 (20) 1.使用自身方法(Use Native Methods) (20) 2.使用虚拟优于使用接口 (20) 3.使用静态优于使用虚拟 (20) 4.尽可能避免使用内在的Get、Set方法 (20) 5.缓冲属性调用Cache Field Lookups (21) 6.声明Final常量 (21) 7.慎重使用增强型For循环语句 (22) 8.避免列举类型Avoid Enums (23) 9.通过内联类使用包空间 (23) 10.避免浮点类型的使用 (24) 11.一些标准操作的时间比较 (24) 12.为响应灵敏性设计 (25)

一.内存分配跟踪工具DDMS–>Allocation tracker 使用 运行DDMS,只需简单的选择应用进程并单击Allocation tracker标签,就会打开一个新的窗口,单击“Start Tracing”按钮;然后,让应用运行你想分析的代码。运行完毕后,单击“Get Allocations”按钮,一个已分配对象的列表就会出现第一个表格中。单击第一个表格中的任何一项,在表格二中就会出现导致该内存分配的栈跟踪信息。通过allocation tracker,不仅知道分配了哪类对象,还可以知道在哪个线程、哪个类、哪个文件的哪一行。 尽管在性能关键的代码路径上移除所有的内存分配操作不是必须的,甚至有时候是不可能的,但allocation tracker可以帮你识别代码中的一些重要问题。举例来说,许多应用中发现的一个普遍错误:每次进行绘制都创建一个新的Paint对象。将Paint的创建移到一个实例区域里,是一个能极大提高程序性能的简单举措。 二.内存监测工具DDMS-->Heap 无论怎么小心,想完全避免badcode是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。Androidtools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使eclipse的ADT插件,并以真机为例,在模拟器中的情况类似)。用Heap 监测应用进程使用内存情况的步骤如下: 1.启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的; 2.将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”模式,而不是作为“MassStorage”; 3.链接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息; 4.点击选中想要监测的进程,比如system_process进程; 5.点击选中Devices视图界面中最上方一排图标中的“UpdateHeap”图标; 6.点击Heap视图中的“CauseGC”按钮; 7.此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况 a)点击“CauseGC”按钮相当于向虚拟机请求了一次gc操作;

Android App内存泄露测试方法总结

Android App内存泄露测试方法总结 1、内存泄露 Android系统为每一个运行的程序都指定了一个最大运行内存,超过这个值则会触发OOM机制,反应在界面就是闪退、Crash现象,导致OOM发生的原因比如内存泄露或者是代码不考虑后果使用大量的资源,都有可能导致OOM出现的。OOM的临界值可以通过adb shell getprop | findstr “heap”查看到: 2、Android的GC机制 Android GC机制沿用了java的GC机制,当需要新内存去分配对象的时候而剩余不够的时候,会触发GC,把无用的对象回收掉,其中一个重要的算法便是分代式算法,这个算法把虚拟机分为年轻代、老年代和持久代,对象先分配到年轻代,然后GC多次后还存活的将会移动到老年代,老年代就不会频繁触发GC机制,一般触发频繁的都是年轻代的对象。 3、为什么会内存泄露 上面我们知道了GC机制,那么如果GC过后程序还是没有内存,那么会发生OOM,导致GC后还是没有足够内存分配新对象的主要原因就是内存泄露了。首先要知道内存泄露也就是GC不掉的根源是生命周期长的对象持有生命周期短的对象,导致无用的对象一直无法回收。以下是几个典型的分类: 1)**静态类相关的泄露:**static对象的生命周期伴随着整个程序的生命周期,所以这块要注意不要把一些对象引用添加到static对象里面去,会造成与之关联的对象无法回收。

2)各种资源的释放:包括cursor的关闭,IO流的关闭,bitmap的回收等,进行一些带有缓存的资源一定要关闭或者释放。 3)Handler的泄露:调用handler的delay的时候,会被认为对象是有用的,导致无法回收,还有handler开启线程去下载东西没有下载完成的时候,也会因为线程导致无法回收activity;或者使用handlerThread的时候,有延迟的方法,都会导致无法回收。其主要原因在于handler是持有activity的引用,主线程不是自带一个Looper然后给handler用,导致有关联关系。 4)各种注册引用方法:比如一个常驻的后台线程处理某些时间,把当前对象注册,因为一直持有对象引用,导致这个activity一直保留,所以不用的时候需要反注册。 5)把对象缓存进容器内却忘记remove掉:有时候为了加快页面响应,结果缓存一些对象到容器内,结果越加越多,然后挂掉。 4、系统级别的内存管理 1)LMK机制和oom_adj的值 Android内核有个专用的驱动low-memory-kill,当系统级别的内存不够的时候会根据oom_adj的值以及内存分配状况去kill掉某个进程,oom_adj可以在 /proc/[pid]/oom_adj看到,并且这个值会随着进程的状态改变而改变,比如系统进程一般是-16,越大越容易被干掉。 2)5个进程的优先级 前台进程:当前运行的,基本不死; 可见进程:界面可以见到,比如被遮挡; 服务进程:进程带后台服务的,比如播放器; 后台进程:点击home键,但不退出,就是后台进程了,有比较大几率会被杀;

如何清理释放Android手机内存空间

如何清理释放Android手机内存空间 和PC用户一样智能手机用户也会遇到手机存储不足的问题,对于Android手机来说因为系统不支持安装程序到SD卡,手机配置的存储容量也有限,很多用户都碰到过安装程序太多系统内存不足的问题。虽然Android 2.2系统开始已经支持Apps2SD功能,但是很多用户使用后发现Android 2.2系统下仍然有很多应用程序无法安装到SD卡,即可程序支持移动到SD 卡,但是还会保留一部分系统文件和隐私文件在手机内存里。另外还有一些程序像Widgets,动态壁纸和一些系统程序,如果安装在SD卡根本无法正常工作,内存不足依然是让很多用户感到棘手的问题。 不过Android作为一种优秀的移动操作系统,提供了几种可以清理和释放内存空间的办法,我们总结了下面几点希望可以帮助用户解决燃眉之急。 清理大型应用程序的缓存数据 ●通过清理程序的缓存文件,释放的内存空间会让你喜出望外 ●进入手机设置选项,选择设置>应用程序>管理应用程序 ●按一下Menu键,选择“按大小排序”选项(如果是Android 2.2手机先要选择已下载标 签),然后就可以按照应用程序大小排列所有手机安装的应用程序 ●点击一款列表中的应用程序,如果程序有缓存文件可以显示大小,直接点击“清除缓存” 选项就可以释放这些缓存文件占据的空间 ●有一些应用程序的缓存文件可能多达数MB,比如Google Maps,Market,浏览器和相册 程序,清理这几个程序的缓存文件就可以释放相当可观的空间。 ●很多手机厂商都在旗下手机预装了自己开发的UI程序,比如HTC Sense,MOTOBLUR等, 如果你打算使用LaunherPro或者ADW这样的launcher程序替代HTC Sense,你可以清理甚至删除HTC Sense的数据文件,这个操作可以让你的手机多出几十MB空间。 ●另外Android Market还提供一些自动清除缓存文件的应用程序,比如Quick App Clean Cache这款收费软件。对于已经取得root权限的手机用户,可以从Market下载CacheCleaner, CacheMate和MoveCache这些程序来快速方便的清除程序缓存文件。 删除那些你从来不用或者很少使用的应用程序 这是很多用户都会面对的问题,默默忍受着手机内存不足的报警,甚至牺牲系统性能,就是舍不得删除那些从来不用或者极少使用的应用程序,这可能也是一种强迫症。删除这些程序你会发现手机从此海阔天空,而且你没有任何损失。 移动所以可以移动的应用程序数据到SD

安卓平板电脑ROOT权限说明

安卓平板电脑ROOT权限说明 就在我前面一节中就给大家提到过ROOT相关问题,此篇将给大家详细讲解ROOT权限,如果你以前经常去各大论坛一定也会接触到“ROOT”,他的出现频率很高,在各个论坛上,网友的字里行间经常会出现,那么ROOT权限是什么呢?可以给我们带来怎样的好处呢? 什么是root,我需要它做什么? root就是平板电脑的神经中枢,它可以访问和修改你平板电脑几乎所有的文件,这些东西可能是生产平板电脑的公司不愿意你修改和触碰的东西,因为他们有可能影响到平板电脑的稳定,还容易被一些黑客入侵(Root是Linux等类UNIX系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权利,所有对象他都有可以操作的权利,所以很多黑客在入侵系统时,都要把权限提升到Root权限,就是将自己的非法帐户添加到Root用户组。类比于Administrator是Windows NT内核系统中的超级管理员用户帐户,也拥有最高的权限。但不同的是,在WINDOWS下Administrator的资源和别的用户资源是共享的,简单的说,别的用户可以访问Administrator的文件。而Linux中,别的用户是不能访问Root用户的家目录(/root)下文件的。因此,Linux比Windows更安全) 既然root权限这么重要,我们为什么还要去获取它? 其实用root的权限主要是因为我们很多东西是受限制的,我们只能利用这些权限来做我们被限制的去做的事情,比如Google禁止我们看到市场里很多免费或付费软件,我们可以用Marketenabler进去看;很多朋友只能看不能下,不能绑定gmail,我们可以修改hosts 来搞定他们,但这些都需要root权限(由于Root权限对于系统具有最高的统治权,便可方便的对于系统的部件进行删除或更改。对于玩家而言,最大的诱惑是在于“刷机”,只有获得Root权限,我们便可随心所欲地对自己的爱机进行“重新包装”,感受新版本软件的优点) 取得root的好处? 1 可以备份系统 2 使用高级的程序例如资源管理器 3 修改系统的程序 4 把程序安装在SD卡上(默认是不支持的) 绝大多数自制的rom都已经获取了root,如果你的rom没有的话,就要自己取得。 很重要的提示:如果你的平板电脑是行货,在保修之内,获取root就会丧失保修的权利。不知道通过以上内容,你是否对root权限有了更为透彻的了解了呢?当然ROOT也应该根据我们所需,如果你是个爱玩,爱研究平板电脑的机友,那么root权限就会对你很重要,但是如果你只是用平板电脑看看网页,看看电影,上上QQ,那么root显然和你没什么关系

低端android机内存管理优化

大家好,今天我主要来和大家交流下低端android手机内存优化的问题。 一、问题的引出 前天,我在论坛发了一个帖子,想请教大家关于联想A68e内存优化的问题,但是回复者寥寥无几,课件也很少有机油对这方面有较深入的 学习了解。我今天中午,查了有关资料,也用了自己的手机进行了测试,觉得可能对A68e(其实是广大低端Android手机)用户有点帮助,所以特地来分享以下。(说明:本人用的是Sumsumg I9103,我媳妇用的是电信套餐的联想A68e,这几天我没拿到她的手机来测试,所以只能自己的手机进行测试,但是我觉得还是具有一定的参考价值的)。二、ROM和RAM 首先,我先解释一下ROM和RAM的区别。 ROM是Read Only Memory,即只读存储器;RAM是Access Random Memory,即随即读写存储器。 ROM是存储程序和数据的,类别电脑的硬盘,可以存放安装的程序、文件、数据等。而论坛中有开AppEXT2的方法(我没试过),那个只是节省出更多的ROM空间,这样可以使程序运行得更为流畅,但是不能解决“同时运行程序的数量最大值太小”的问题。以A68e为例,如果开一个QQ、音乐播放器,再开个UC浏览器估计机子就崩溃而导致程序退出。 RAM才是程序运行时所占用的物理空间。RAM的价格比ROM贵很多,所以RAM的大小一半程度上决定了机子的价位(另一半就是CPU)。

我的Sumsung是1G RAM,同时开QQ、QQ游戏、QQ音乐、浏览器、微信等七、八个程序也毫无压力。所以RAM太小是影响A68e(包括很多Android手机)用户体验的原因。如果你是个游戏玩家、手机达人,那么这类机子一定不适合你。如果你希望能像有高端机那样的用户体验,我建议你还是多话点银子购买配置高的Android手机。 关于官方宣传256的RAM实际上只有170,那是有一部分被Android系统占用。我的手机1GRAM,实际上也只有724M。 三、Android系统内存管理机制及进程调度机制 下面开始具体的分析了。 首先Android系统是基于Linux 内核开发的开源操作系统,li nux系统的内存管理有其独特的动态存储管理机制。Android采取了一种有别于Linux的进程管理策略,Linux系统在进程活动停止后就结束该进程,而Android把这些进程都保留在内存中,直到系统需要更多内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。 Android系统这样的设计不仅非常适合移动终端(手机、平板)的需要,而且减少了系统崩溃的可能,确保了系统的稳定性。老想着清理内存的同学完全是因为被塞班或者Windows毒害太深,事实上,经常用Taskiller之类的软件关闭后台所有进程,很容易造成系统的不稳定。很多时候出现问题了,只要重启就能解决的原因也在于此。 广大机油一定会发现,关闭了QQ、微信等程序后,其实并没有完全关闭这些程序。这些程序在后台占用了一定的内存,但是并没有运行时

AndroidManifest.xml配置文件详解

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. . . . 33. 34. 35. 36. 37. 38. . . . 39. 40.

相关文档
最新文档