android2.x内存需求分析

来源:互联网 发布:eve ios软件 编辑:程序博客网 时间:2024/06/05 02:41


Android内存分析(主要针对android2.x

译文来自TIwiki官网:http://processors.wiki.ti.com/index.php/Android_Memory_Analysis

1 简介

1.1 Android移植到非移动领域

  • 以下android特征已经使这种操作系统可以移植到非移动领域

    • 对投资者与公司提供有吸引力的许可证

    • 开放源代码

    • 具有强生态系统特性

    • 支持嵌入式c/ c + +组件

    • 便利的开发和调试工具

1.2 非电话领域面临的挑战

  • 平衡性价比

    • 减少大量的原材料必然对成本有大的影响。这主要是成本与内存的大小和电源效率成正比。

    • 使用DSPSGX将在性能方面提供获益

  • 启动时间:减少启动时间是非常重要的,比如汽车信息娱乐系统,医疗个人助理,汽车导航设备等。

  • 本地应用程序(Nativeapplication) 需要与android应用程序(app)一起运行。每个非手机领域对特定的应用场合有定制的应用。如汽车导航系统具有本地地图应用程序应该与另外的androidapps共同运行。


以上提及的所有挑战——为了定制androidOS,通过脚本分析和简单的技术,当前wiki将侧重于 降低内存成本 。Wiki将包括

  • 启动时间内存要求(eMMCMMC/SD卡、NAND等)。

  • 运行时间内存要求(DRAMDDR3等)。

  • 为优化引导时和运行时的内存进行android定制

注意: 在本文档中提到所有的例子或测试是在AM37x设备的程序中进行测试。同时分析和定制技术可应用到类似的体系结构 

2 引导时内存

非易失性存储器持有大量的数据(bootloader, kernel images, file system ),这些是启动android系统所需的。有各种android系统的引导选项。它可以从NANDeMMCSD卡或串行闪存或可用的其他任何内存设备上进行系统启动。

  • 以下是这些组件是这种非易失性存储器的一部分

    • 引导加载程序BootLoader

    • 内核Kernel

    • 文件系统FileSystem(引导前+引导后)

    • 媒体/数据文件(如果可用)


如上图介绍的是AM37x设备的"TI-Android-Gingerbread-2.3.4-DevKit-2.1"版本的存储器占用量。
"/data"是启动后文件系统中的一部分。Android系统会

              核心架构和应用程序创建缓存历史记录

               创建应用程序将要使用的数据库文件

根据上述统计数字,需要最小105MB的非易失性存储器启动android系统。
如何可以减少这个数字吗?-以下有说明。

3 运行时(RunTime)内存

  • 这是执行应用程序或进程或服务所需的运行时内存。通常主要是RAM发挥作用。

  • 运行时内存要求完全取决于android操作系统上执行所需的应用程序情况。实际上大量的android系统内存是需要在多个进程之间共享。因此一个进程需要多收内存不是明确的。

3.1 Android的运行时环境

android的层次图中主要有三个可能的运行时环境
3.1.1 Androidapp -> Runtime Service ->Libs


AndroidAPPJavaApplication

RuntimeService :Java Service

LibSharedObject

3.1.2 Androidapp -> Runtime Service -> Native Service ->Lib


AndroidAppJavaAppliation

RuntimeService :Java Serice

NativeService : C/C+ + Executable

LibSharedObject

3.1.3 Android app -> Runtime Service -> Native Daemon –>Lib


AndroidAppJavaApplication

RuntimeService : Java Service

NativeDaemonC/C+ + Daemon

LibSharedObject

  • 对于每个java应用程序和服务,DVMDalvikVrtual Machine)的实例将加载到内存中。

  • 运行时服务(RuntimeService)和本地服务(NativeService)将使用IPCbinderAndroidImplementation)进行通信。因此binder程序库将被加载到内存中。

  • 运行时服务和本地守护程序(NativeDaemon)将使用套接字(KernelImplementation)进行通信。

  • 概要地说android的运行的时环境主要分类成

    • Libraries:共享对象SharedObjects

    • 应用程序Applications.apk

    • 框架Frameworks:核心库科技服务

    • 服务Servies:运行时间android服务:

    • 守护程序Daemon:运行时Linux守护程序

    • 系统实用程序UtilitiesAndroidShell/system/bin/system/xbin

3.2 内存剖析

3.2.1 PSS:比例设置大小(ProportionalSet Size

与其他进程共享的内存量以一定方式平均分配在分享它的进程之间。如果一个进程被终止,它拥有的内存不会被释放,而是指示该数量内存对总共内存负载有了“贡献”。

3.2.2 USS:唯一集的大小(UniqueSet Size

USS是对于一个进程独有的页表集。如果应用终止,该部分内存量将被释放量。

3.2.3堆(Heap

可用于分配的运行时内存(用于应用程序、 服务、 守护程序)

3.2.4 Dalvik Heap

Dalvik堆通过zygote进行预加载上类和数据。当zygotefork启动一个应用程序时,新的应用程序获得这堆的一个写入拷贝映射。正如下面DanBorstein说的,这有助于减少内存以及应用程序启动时间。Dalvik,像用于很多其他语言的虚拟机一样,在堆上进行垃圾回收。似乎有单独的线程(称为'HeapWorker')在每个虚拟机进程中执行垃圾收集操作。
DanBorstein
论堆共享:
(
http://www.koushikdutta.com/2009/01/dalvik-vs-mono.html)
“It'sused in Android to amortize the RAM footprint of the large amount ofeffectively-read-only data (technically writable but rarely actuallywritten) associated with common library classes across all active VMprocesses. 1000+ classes get preloaded by the system at boot time,and each class consumes at least a little heap for itself, includingoften pointing off to a constellation of other objects. The heapcreated by the preloading process gets shared copy-on-write with eachspawned VM process (but again doesn't in practice get written much).This saves hundreds of kB of dirty unpageable RAM per process andalso helps speed up process startup.”

在Android里,堆共享是用来对所有活动的VM进程适用的大量有效的只读数据(技术上是可写的,但实际上很少被写)和公用库类进行分摊RAM占用空间。在启动时超过1000个类是被系统预加载,并且每个类自身消耗少量的堆空间,包括经常指向一群另外的对象的引用。通过预加载进程创建的堆获取共享的写时拷贝和每个衍生的VM进程(但实际上同样很少被写)。该技术节省了每个进程成百上千KB的脏非分页RAM,同时帮助加速进程启动。

3.3 运行时内存使用的命令

  • 显示关于每个JAVA进程内存使用的信息

$adbshell dumpsys meminfo

  • 若要查看特定进程的内存信息:(例如系统)

$adbshell dumpsys meminfo system

  • 总内存的使用汇总

$adbshell cat /proc/meminfo

3.4 运行时内存:库使用案例

运行时内存使用情况将取决于运行在android系统上的使用案例类型。以下是通过android系统分配的运行时内存分配内容。

  • 所有java进程将都运行DVM实例。基于java应用程序代码复杂性,DVM将再次有其自身运行时堆的要求。

  • BinderIPC将分配编组对象的运行时内存

  • 服务或守护程序将会分配供内部使用的运行时内存

  • 考虑到库应用程序使用情况,以下示例将显示运行时堆改变情况。

    • 大小:特殊堆的总大小

    • 分配:堆的部分被分配到进程

    • 本地使用:应用程序或服务代码的使用内存情况

    • Dalvik使用:由Dalvik虚拟机(libdvm)使用的内存


                                                                         com.cooliris.media
android启动后
                                       
 
                                               com.cooliris.media
:打开库应用程序(galleryapplication)后

                                       

  • 请注意,在Dalvik堆没大的改变,但增加了大约2MB的本地代码堆。进一步将使用案例和应用程序代码复杂化将同时增加Dalvik堆空间。

3.5 Android框架:内存占用量

  • 下表简要的分析对于不同核心组件的android操作系统的最低内存要求。为了支持具有SGXandroid启动,平均65-80 MB最小内存是需要的。Android系统启动后将启动许多服务,这将增加更多的内存。(应用与服务程序将启动创建dalvikVM与许多另外的对象的实例)


1android的内存— — 框架framework

模块#

描述#

约大小(MB

备注#

核心Java

一套的Android系统的各种组件所使用的Java

13

库将分配更多运行时空间来创建每个应用的实例

核心系统库

一套的Android系统的各种组件所使用的C/C+ + 库。包括系统c库、webcore(用于浏览器),SGX,蓝牙、SQLlitefreetype和其他杂项

27


Surface

Flinger

管理显示子系统的访问和无缝地包含多应用个程序的无2D3D图形图层

5

Surfaceflinger将分配缓冲区用于

-显示曲面

-启动器图标

-状态栏— —正常&扩大

这以显示系统分辨率而异。在这里所示的图是为640x 480分辨率

Dalvik

运行androidjava应用程序的虚拟机。

1.5-16

每一个Android应用程序运行在其自己的进程中,具有自己的Dalvik虚拟机实例.16MBdalvikVM将使用的最大堆大小。这可以是可配置的。

SGX

本模块通过使用硬件加速的图形卡加快图形体验

8-40

最小8MB +使用情况需求;这一数字可以达到40MB
如库图标网格视图:4x 4,每个图标是100x 100 像素的那么SGX会分配:100x 100 x 2 (每个像素字节)x4 x 4 = 312 KB +背景(640x 480 x 2)

高速缓存的内存

缓冲区高速缓存。

14-20


3.6在运行时的android系统

  • 下表概要关于由不同的android进程于应用使用的运行时内存情况

   注意: 代表数据取自RSS(实际使用物理内存大小-Residentset size)域的"ps-a"命令。但是从各种内存工具收集的数据如DDMSsmemmeminfo,/proc/dumsys获得相似数据,并在这里描述。选择RSS是一个某一时刻进程占有的可以测量的物理页,它描绘了运行进程的RAM利用率。有关RSS的更多详细信息,请参阅

    • http://linux.about.com/od/commands/l/blcmdl5_proc.htm

    • http://miknight.blogspot.com/2005/11/resident-set-size-in-mac-os-x.html

Table2: Android at run-time

#

process#

sizein MB#RSS

remark#

Androidcore processes

(用来正常启动)

zygote

16


system_server

34

正在运行41个不同的服务,参考#frameworks/base/services/java/com/android/server/SystemServer.java

com.android.systemui

19

处理所有状态条上的通告.如果在产品使用场合不需要通知处理,该进程可以从android文件系统移除

mediaserver

1.5


OtherProcesses

(在低内存方案中可以杀死)

com.android.launcher

21


com.android.phone

15


com.android.bluetooth

16


Gallery/Music

android.process.media

18


com.cooliris.media

17



com.android.inputmethod.latin

5




  • 考虑到表中提到的内存数字,最小android启动配置:android core process (16 +34+19+1.5) + com.android.launcher (21) -将需要大约91.5MB内存.

表中描述的数字是参考了AM37xevm中默认的gingerbreaddevkit版本情况



4 BootTime-非易失性内存定制

  • 这里该问题特指androidOS使用场合。由于androidOS正移植到非手机领域,就有必要对使用环境没有必要的应用和库。

  • Example:

Android用于简单手持HMI设备。对于正常的手持设备使用场合—HMI,对于像phonecontactsoundrecord等都是没有必要的。移除这些应用能节省启动时内存大小,同时也能节省运行时内存空间(由于许多预加载class将被移除)

  • Toremove contact and phone usecase;移除contactphone的使用场合,下面相关的classeslibraries将被移除。
    BootTime memory gain: ~8.10 MB.


  • 具体参见如下xls表格
    http://processors.wiki.ti.com/index.php/File:Android_Memory_Calculation_v1.0.zip
    通过移除android文件系统不需要的库,该文件计算出内存增量。标为“Y”的组件不能从android文件系统移除。因为这些是androidOS或组件需要的核心组件,与许多模块高度耦合。



5 Run Time-易失性内存定制

该部分描述几种android定制的配置,这些配置可以在内存小于256MB的非的后己设备使用。

    Note:Onlysanity test cycle has been validated against following describedconfigurations.  

5.1定制的Android参品包

  • Step1:定制产品包文件:

#<android-source>/build/target/product/generic.mk.

    • 实际文件参考#http://gitorious.org/rowboat/build/blobs/rowboat-gingerbread/target/product/generic.mk

>>打开文件:<android-source>/build/target/product/generic.mk

>>移除所有应用场合不需要的产品包

>>选择下面的配置作为试验


说明:选择Galley(2D)代替Gallery3D将节省用于SGX高速缓存和3D加速部分的空间

PRODUCT_PACKAGES:= \

Bluetooth\

CertInstaller\

DrmProvider\

Gallery\

Launcher2\

Music\

Provision\

Settings\

SystemUI\

LatinIME\

  • Step2:移除电话支持

    • 实际文件

参考#http://gitorious.org/rowboat/build/blobs/master/target/product/core.mk

>>打开文件:<android-source>/build/target/product/core.mk


>>移除下面的包('-'符号列出)


PRODUCT_PACKAGES:= \

libz\

sqlite-jdbc\

Browser\

- Contacts \

Home\

HTMLViewer\

- Phone \

ApplicationsProvider\

- ContactsProvider \

DownloadProvider\

DownloadProviderUi\

MediaProvider\

PicoTts\

SettingsProvider\

- TelephonyProvider \

TtsService\

VpnServices\

- UserDictionaryProvider \

PackageInstaller\

DefaultContainerService\

Bugreport


说明:如果浏览器(Brouser)不是产品使用中一部分,也可以移除

  • Step2.1:移除服务(可选):LocationManager,Vibrator,Telephony Registry

    • 移除上面提及的服务将移除telephony,location,和vibratorRun-time内存将增加大约3MB+Performance

    • Patch参考#http://processors.wiki.ti.com/index.php/File:0001-removed-telephony-vibratior-location-manager-service.patch

请应用patch<android-src>/frameworks/base

$patch-p1 < {patch-file}

  • Step2.2:移除WallpaperService(可选)

    • 移除wallpaperservice将创建黑色背景。没有wallpaper可以设为背景。Run-time内存可以增加大约2MB+performance(具体是在视图间切换)

    • Patch参考#http://processors.wiki.ti.com/index.php/File:0001-wallpaper-service-dependency-removed.patch

##Remove following lines from file:<android-src>/frameworks/base/services/java/com/android/server/SystemServer.java

- try {

- Slog.i(TAG, "Wallpaper Service");

- wallpaper = new WallpaperManagerService(context);

- ServiceManager.addService(Context.WALLPAPER_SERVICE,wallpaper);

- } catch (Throwable e) {

- Slog.e(TAG, "Failure starting Wallpaper Service",e);

- }


##Remove wallpaper dependency from launcher application

Kindlyapply mentioned patch to <android-src>/packages/apps/Launcher2

$patch-p1 < {patch-file}

  • Step3:编译定制配置.参考步骤见:#http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3-DevKit-1.0_UserGuide#Building_Android_Sources

  • Step4:烧写新编译的文件系统,启动开发板

5.2 Configuration1 : 144 MB run-time memory

  • 创建定制包步骤见这部分:定制的Android产品包,不包括step2.1step2.2

  • 显示配置:640x480-16 bpp(bits per pixel)

  • Bootarguments

setenv bootargs 'console=ttyO0,115200n8 androidboot.console=ttyO0 mem=144M root=/dev/mmcblk0p2  rw rootfstype=ext3 rootdelay=1 init=/init ip=dhcp omap_vout.vid1_static_vrfb_alloc=y vram="2M" omapfb.vram=0:2M‘

  • Observations:

    • Normalboot

    • Gallery,Music, Bluetooth, Wifi, Browser, Settings -operationsare normal as expected

5.3 Configuration2 : 128 MB run-time memory

  • 创建定制包步骤见这部分:定制的Android产品包,不包括step2.1step2.2

  • 显示配置:640x480-16 bpp(bits per pixel)

  • Bootarguments

setenv bootargs 'console=ttyO0,115200n8 androidboot.console=ttyO0 mem=128M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=dhcp omap_vout.vid1_static_vrfb_alloc=y vram="2M" omapfb.vram=0:2M‘

  • Observations:

    • Normalboot

    • Gallery,Music, Wifi, Browser, Settings - operations are normal as expected

    • Bluetoothconnectivity is fine

    • Howeversometime file transfer overbluetoothsuffers from "low memory"and service gets killed.

5.4 Configuration3 : 128 MB run-time memory

  • 创建定制包,移除SystemUI(没有状态栏)和LatinIME(没有虚拟键盘支持)

  • 显示配置:640x480-16 bpp(bits per pixel)

  • Bootarguments

setenv bootargs 'console=ttyO0,115200n8 androidboot.console=ttyO0 mem=128Mroot=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=dhcp omap_vout.vid1_static_vrfb_alloc=y vram="2M" omapfb.vram=0:2M‘

  • Observations:

    • Normalboot

    • Gallery,Music, Wifi, Browser, Settings - operations are normal as expected

    • Novirtual keyboard, one has to have external keyboard to enter text.

    • Sendinga file over bluetooth works fine.

    • Receivinga file over bluetooth can not be tested as notification comes overstatus bar; which is not a part of this package

5.5 Configuration4 : 128 MB run-time memory,NoSGX(用于3D

  • 创建定制包步骤见这部分:定制的Android产品包

  • 编译Android没有SGX支持;请参考链接

#http://processors.wiki.ti.com/index.php/Building_TI_Android_DevKit_Filesystem_without_SGX

  • 显示配置:640x480-16 bpp(bits per pixel)

  • Bootarguments

setenvbootargs 'console=ttyO0,115200n8 androidboot.console=ttyO0 mem=128Mroot=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=dhcpomap_vout.vid1_static_vrfb_alloc=y‘

  • Observations:

    • Normalboot

    • Gallery,Music, Wifi, Browser,Bluetooth, Settings - operations are normal asexpected

    • Graphicsexperience is poor compared to SGX powered graphics.

    • Ifstep 2.1 & 2.2 gets includedin customized build, then system can run with 114MB memory withoutsgx

6 总结

在对Andorid进行内存分析之后,需要最小的内存来运行android特征系统(来自Google公司的标准android源代码)如下:

  • Boottime memory : 128 MB

  • Runtime memory : 256 MB

进一步减少运行时内存导致android系统经常杀死不需要的/后台活动activities和进程processes,这将影响我们熟知android所具有的用户体验。

       免责声明:
Memorynumbers mentioned above are with respect to standard androiddistribution from Google Inc. with all basic features workingsmoothly. However one can always remove unwanted libs, applications,services etc. and
makecustom android, which can run on lower memory than specified in thisdocument.

7 References

http://www.elinux.org/Android_Memory_Usage
http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_DevKit_1_0/index_FDS.html
http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android/2299813#2299813
http://www.koushikdutta.com/2009/01/dalvik-vs-mono.html



附录:

1、来自2008年三星android技术网站,主要针对android1.x版本,http://www.kandroid.org



2、android4.x ICS系统要求

Android4.0 Ice Cream Sandwich Minimum Hardware Requirements – 256MB RAM orMore ?

    1. Phonemust have more than 256mb RAM

    2. Phonemust cotain a decent GPU


Sinceyesterday all Android Devices users get ICS fever, some of them alsowonder if their smartphone or tablet are able to run with Android 4.0update such asGalaxyNexuswhich has superb hardware. You might heard from another source thatyou should not worry if your devices will meetminimumhardware requirements to run Android 4.0 Ice Cream Sandwichupdate as Google stated that it will be run on all android device.You should know, “run all on devices” mean this update isdesigned to operate with tablet or smartphone, whatever the screensize is.

HeadModerator of CyanogenMod forum also said that there’stwo basic requirements to run Ice Cream Sandwich update smoothly,all android devices must have 256 MB RAM or more and also decent GPUsince Hardware-accelerated 2D drawing might be needed, 2Dacceleration depends on your phone GPU not the CPU so, there’s noproblem if your smartphone still powered with ARMv6. I think onlymiddle and high-end phone meet that criteria. But if your phonedoesn’t meet those, it doesn’t mean you will never has chance toinstall it, CyanogenMod Team with CM9 and another developers willwork hard to make it work on all android phone. While wait you cantry thelauncherorthemebased on SDK.


原创粉丝点击