`
寻梦者
  • 浏览: 635533 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Android开发之性能优化概述

 
阅读更多

程序能否运行的快速而高效,这在资源有限的移动终端设备上尤其显得重要。因为即使目前最强大的移动终端的计算能力也无法和市场上普通的桌面PC相抗衡。简单地说,有两个原则在资源受限的系统中必须遵守:

不做不必要的事情。

不分配不必要的内存。

在Android中,设计人员已经从UI、框架、基础平台等多个层次的多个方面进行了优化。但对于开发者而言,在开发过程中,仍然需要针对消耗资源比较多的设计进行规避或者优化。在接下来的内容中,将会针对Android已经进行的优化做简略的介绍。对开发者在开发过程中需要注意的地方进行一些说明。

一、资源读取

对资源的读取可以分为对资源文件的读取和对挂载的SD卡上的内容的读取。

1.资源文件

资源文件的优化读取,Android在编译时对描述UI 的XML文件进行了优化。

2.SD卡

Android的图片浏览器等多媒体应用可以加载整个SD卡内的所有图像,在加载前会把数据做成数据库,不用每次扫描,这大大加快了启动速度。事实上扫描操作是通过MediaScanner来实现的,目前支持的文件类型在MediaFile.java中定义。主要包括音频、MIDI、视频、图片、播放列表等。MediaScannerService服务的启动仅在收到"android.intent.action.BOOT_
COMPLETED"、"android.intent.action.MEDIA_MOUNTED"、"android.intent.action.MEDIA_
SCANNER_SCAN_FILE"后才会启动。

当然,在SD卡容量较大且文件较多时,MediaScannerService服务将会运行一段不短的时间,这对电池的持续能力会造成一定的影响,尤其是在电池技术始终不能有显著突破的前提下。

二、DEX文件和APK加载

在Android中,对编译出来的DEX字节码和APK文件的加载过程,也进行了尽可能的优化。

对于预置应用,Android会在系统编译后,生成优化文件,以ODEX后缀结尾,这样在发布时除APK文件(不包含DEX)外,还有一个相应的ODEX文件。

对于非预置应用,运行前,Android会优化DEX文件,在第一次启动应用时,执行文件的DEX被优化成DEY文件并放在/data/dalvik-cache目录。如果应用的APK文件不发生变化,DEX文件不会被重新生成,加快了以后的启动速度。APK文件的加载过程如图1所示。


图1 APK加载

DEX文件由header、string_ids、type_ids、proto_ids、field_ids、method_ids、class_defs、data等几部分构成。图2显示了这几部分内容在DEX文件中的布局。


图2 DEX格式

在Java中,每一个类会被编译成相应的CLASS文件,一个应用会定义若干个类,这就导致同一个应用的多个CLASS文件中会存在冗余信息,而在Android中,“dx”工具会将同一个应用的所有CLASS文件内容整合到一个DEX文件中,这样就减小了整体的文件尺寸,I/O操作也提高了类的查找速度。“dx”工具整合CLASS文件的过程如图3所示。


图3 “dx”工具整合CLASS文件的过程

原来每个CLASS文件中的常量池,在DEX文件中由一个常量池来统一管理,具体如图4所示。


图4 DEX的常量池

具体到DEX文件,经过“dx”工具优化后的内部逻辑如图5所示。


图5 DEX的内部逻辑

三、虚拟机和平台实现

在虚拟机和原生库层面,Android同样进行了很多的优化。

1.虚拟机

虚拟机中指令的解释时间主要分为3个方面:分发指令、访问运算数、执行运算。其中“分发指令”这个环节对性能的影响最大,为了加快运行速度,必须提高分发指令的速度。

与传统的Java虚拟机基于栈不同,Dalvik是基于寄存器的。基于寄存器的虚拟机实现,虽然在硬件通用性上稍逊一筹,但是数据处理速度却有明显的改善,可以更为有效地减小冗余指令的分发和减小内存的读写访问。

Dalvik虚拟机针对移动终端所做的优化,使得其不需要很快的CPU速度和大量的内存空间。根据Google的测算,Android的早期版本只需要64MB的RAM即可使系统正常运转,其中24MB被用于底层系统的初始化和启动,另外20MB被用于高层启动、高层服务。当然,随着Android版本的不断升级和应用功能的扩展,Android对内存的消耗也在逐渐增加。

另外需要注意的是,Dalvik并不是按照Java虚拟机的规范来实现的,两者并不兼容。

Java虚拟机运行的是Java字节码,而Dalik虚拟机运行的则是其专有的DEX(Dalvik Executable)字节码。

在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class),然后打包成JAR文件。在执行期间,Java虚拟机会从JAR文件抽取相应的CLASS文件并从中读取指令和数据。而Android虽然也是基于Java语言进行编程的,但是在编译成CLASS文件后,Android会通过“dx”工具将应用所有的CLASS文件转换一个DEX文件,接着将DEX和应用的其他如资源文件等一起打包构成APK文件,而后Dalvik虚拟机会从其中读取指令和数据。图6显示了Android的编译过程。


图6 Android的编译过程

Dalvik虚拟机的主要特征包括:专有的DEX字节码、支持新的操作码、文件结构非常简洁、使用等长的指令、借以提升解析速度、尽量扩大只读结构的大小、借以提高跨进程的数据共享比例。

2.平台优化

充分挖掘CPU的性能,针对armv5te进行了优化,充分利用armv5te的执行流水线来提高执行的效率。

3.C库

优化和裁剪的libc库Bionic,具有更高的效率、低内存占用、非常快和小的线程实现、内置了对Android特有服务的支持等特点。

4.创建进程

Linux在创建一个新进程时利用了写时拷贝(Copy-on-Write)机制,使得创建一个新的进程非常高效。Android中每个进程都是基于虚拟机的,并且也要加载基本的库,实际上这些都是可以共享的。基于这方面的考虑,Andoid引入了写时拷贝机制,使得Android启动一个新的进程,实际上并不消耗很多的内存和CPU资源。

另外,Android在后台一直有个Zygote虚拟机在运行,实际上是一个虚拟机实例的孵化器。如果要启动一个新的应用,Zygote就会创建出一个新的子进程来执行该应用程序,十分高效。图7显示了Zygote创建子进程的过程。


图7 Zygote创建子进程

Android在开机过程中,会首先启动Zygote虚拟机而不是系统服务器(System Server),也是出于利用写时拷贝机制创建进程比较高效的考虑。Zygote虚拟机在启动后会完成虚拟机的初始化、库的加载、预置类库的加载和初始化等操作。并在系统需要一个新的虚拟机对象时,Zygote可以通过写时拷贝机制高效地创建出新的虚拟机对象。

5.渲染机制

在进行渲染时,Android 会根据变化的部分进行局部更新,并不是每次都需要重绘整个屏幕。首先计算需要重绘的区域(mInvalidRegion),如果DisplayHardware:: UPDATE_ ON_DEMAND ,则通过设定需要重绘的区域的边界来进行局部重绘。

(摘自华清远见系列图书《Android多媒体编程从初学到精通》)

分享到:
评论

相关推荐

    Android应用性能优化【高清】

    ### Android应用性能优化概述 #### 一、性能优化的重要性 在移动互联网时代,用户对于应用程序的体验要求越来越高。一款优秀的应用不仅需要功能强大,还需要具备良好的性能。性能优化可以显著提升用户体验,降低...

    Android系统概述——底层开发的资料

    9. **性能优化**:包括CPU调度、内存管理、电池寿命等方面的优化,是底层开发的重要任务。通过分析和调整系统参数,可以提升整体性能。 10. **调试工具**:如ddms、traceview、logcat等,是Android底层开发的必备...

    android性能优化之内存泄露

    ### Android性能优化之内存泄露 #### 一、内存泄露概述 在Android开发中,内存管理是确保应用程序稳定性和性能的关键因素之一。不当的内存管理可能导致内存泄露,进而引发一系列问题,如应用程序运行缓慢、崩溃...

    Android开发教程笔记完全版 pdf

    Android开发是全球最受欢迎的移动应用开发平台之一,广泛应用于智能手机、平板电脑以及各种智能设备上。这份"Android开发教程笔记完全版"涵盖了Android开发的基础到高级主题,旨在帮助开发者全面理解并掌握Android...

    名师讲坛:Android开发实战经典(PDF)

    《名师讲坛:Android开发实战经典》是一本深入探讨Android应用程序开发的专业书籍,以其PDF格式提供了丰富的知识内容。这本书旨在帮助读者从理论到实践全面掌握Android开发技能,无论是初学者还是有一定经验的开发者...

    Android应用开发详解.pdf

    1. **安装JDK(Java Development Kit)**:这是进行Android开发的基础,因为Android应用程序主要是用Java或Kotlin编写的。 2. **安装Android Studio**:官方推荐的集成开发环境,内置了所有必要的工具和库,支持从...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 ...

    Android驱动开发与移植实战详解_android驱动_android驱动_android_

    在Android系统中,驱动程序是操作系统与...通过实际项目经验积累,开发者可以掌握驱动的开发、移植和优化技巧,提升Android系统的性能和稳定性。在实践中,不断学习和探索,是成为一名优秀的Android驱动开发者的关键。

    Android应用开发揭秘-pdf(全)

    ### 五、性能优化与调试 1. **性能分析工具**:介绍如何使用Profiler等工具对应用进行性能分析。 2. **内存泄漏检测**:讨论常见的内存泄漏场景及解决方法。 3. **日志记录**:强调正确使用Log类记录程序运行时信息...

    Android性能优化篇 [ 谷歌官方 ]-102116321

    Android性能优化是开发高质量应用程序的关键,尤其是在资源有限的移动设备上。谷歌官方推出的Android性能优化系列视频,旨在帮助开发者创建更快速、更高效的App。本篇文章将概述其中的一些核心概念,包括渲染性能、...

    Android开发工具之jdk

    **Android开发工具之JDK详解** Java Development Kit (JDK) 是Java编程语言的核心组件,是开发者进行Android应用开发的基础工具。在Android平台上,虽然Kotlin、Dart等语言也得到了广泛应用,但Java仍然是Android...

    Android开发的贪吃蛇(专门用于课程设计)

    【Android开发的贪吃蛇——课程设计详解】 贪吃蛇是一款经典的电子游戏,深受各年龄段玩家的喜爱。在Android平台上开发这款游戏,不仅可以帮助开发者巩固基础知识,还能提升对Android应用开发的理解和实践能力。本...

    ANDROID 开发文档.pdf

    ### Android开发文档知识点总结 #### 一、系统与硬件配置 **1. 修改系统的USERDATA区域大小** - **概述**:调整系统USERDATA区域的大小,以适应不同的存储需求。 - **应用场景**:当需要增大应用程序存储空间或者...

    本人整理的android开发文档

    **3.1 性能优化** - **内存管理**:了解Java内存模型,避免内存泄漏。 - **性能分析工具**:使用Android Studio提供的工具进行性能监控和优化。 - **异步任务处理**:使用AsyncTask或其他线程库来处理耗时操作,...

    Android开发

    ### Android开发概述 Android作为一款基于Linux 2.6内核的操作系统,其设计初衷是为了满足移动设备领域的软件需求,尤其是智能手机和平价翻盖手机。然而,随着时间的发展和技术的进步,Android的应用范围已远超最初...

    Android应用程序开发

    了解各个组件的生命周期对于优化应用性能至关重要。 - **Activity生命周期**:包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等方法。 - **Service生命周期**:主要包括onCreate()、...

    [Android开发精要]范怀宇PDF

    《Android开发精要》是Android开发者必读的经典之作,作者范怀宇是一位在移动开发领域具有深厚造诣的专家。这本书全面且深入地探讨了Android应用程序开发的关键技术和实践方法,旨在帮助读者掌握Android开发的核心...

    Android开发实战经典(PDF)

    最后,调试技巧和性能优化也是Android开发的重要组成部分。学会使用Android Studio的调试工具,如Logcat、内存分析器和性能监视器,可以帮助找出并修复问题。同时,理解内存管理和UI性能优化策略,如避免内存泄漏、...

    HTML5开发Android应用程序概述

    ### HTML5开发Android应用程序概述 在移动互联网领域,HTML5作为一种跨平台的开发技术,正逐渐成为Android应用程序开发的新趋势。HTML5不仅提供了丰富的API集合,还具备良好的跨平台兼容性,使得开发者能够使用标准...

Global site tag (gtag.js) - Google Analytics