Android预优化那些事

Android预优化那些事

Preopt ART Dalvik
APK的预优化原理和作用

1.什么是Android预优化

Android预优化,也就是把Android在启动或APP在运行时所需要做的一些事情,把这些事情转移到编译APK时完成,来达到更快的Android系统启动速度和更快的APP运行速度。

2.Android预优化的原理

先来回顾一下Android的发展史,在2014年的Google I/O大会上,Google隆重的发布了Android 4.4操作系统,其中有一个环节着重介绍了ART(Android runtime),也就是虚拟机,也就是运行APP的环境,也就是运行Java代码的虚拟机。虽然Android 4.4版本默认仍然用DVM(Dalvik VM),但到Android 5.0时ART就变成了默认模式,自此,DVM时代一去不再复返。
DVM和ART和Android的预优化有什么关系?先了解Java的几种虚拟机基本的工作机制:

  • (1)JVM:JVM虚拟机运行的是java字节码。Java文件到JVM的过程是:java -> java bytecode(class) -> java bytecode(jar)。
  • (2)DVM:DVM虚拟机解析执行的dex字节码。Java文件到DVM的过程是:java -> java bytecode(class) -> dalvik bytecode(dex)。
  • (3)ART:ART虚拟机执行本地机器码。Java文件到ART的过程是:java -> java bytecode(class) -> dalvik bytecode(dex) -> optimized android runtime machine code(oat)。

在Android 4.4(包括)之前用的是DVM,Android 4.4之后用的是ART,从java文件到虚拟机执行代码,ART比DVM多了oat的过程,ART所使用的AOT(Ahead-Of-Time)编译,在应用首次安装时,字节码预编译成机器码存在本地,而DVM是典型的JIT(Just-In-Time),在此模式下,应用每次运行的时候,字节码都需要即时编译器转换为机器码再执行,ART模式相对于DVM省去了解析字节码的过程,占用内存也相应减少,进而提高APP的运行效率,所以Andorid 5.0发布时,Google号称Android系统可以跑在512 M的内存的机器上,ART发挥了举足轻重的作用。

3.Android ART优化的过程

Zygote进程在启动的过程中,创建ART虚拟机。在ART中,打包在APK里面的Dex字节码是通过LLVM翻译成本地机器指令的。LLVM是一个用来快速开发自己的编译器的框架系统,在Dalvik运行时中,APK在安装的时候,安装服务PackageManagerService会通过守护进程installd调用一个工具 dexopt对打包在APK里面包含有Dex字节码的classes.dex进行优化,优化得到的文件保存在/data/dalvik-cache目录 中,并且以.odex为后缀名,表示这是一个优化过的Dex文件。在ART运行时中,APK在安装的时候,同样安装服务 PackageManager¬Service会通过守护进程installd调用另外一个工具dex2oat对打包在APK里面包含有Dex字节码进翻译。翻译后得到的是一个ELF格式的oat文件,这个oat文件同样是以.odex后缀结束,并且也是保存在/data/dalvik-cache目录中。

4.Android预优化的过程

在第三节可知,Android在首次启动和首次安装应用时,需要将字节码翻译成机器码,这样Android系统的启动速度将会大大减慢,如果没有预优化,APP的运行速度也会加上翻译所需要的时间。所以,这个翻译的工作需要转移到编译上面来,也就是所,在编译APK文件时,将会预先对APK进行翻译的优化,然后再打包到系统里面去,这样Android系统在首次启动时,就不再需要花费大量的时间去翻译APK的字节码。下文赘述这个过程的控制过程:
在项目的device.mk文件中有如下的配置:
这里写图片描述
如上图,当编译user版本时,WITH_DEXPREOPT将会置成true,
继续看WITH_DEXPREOPT的作用范围,如下:
这里写图片描述
在上图中,过滤各种条件,会执行LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT)语句,而DEX_PREOPT_DEFAULT的定义在:
这里写图片描述
抛开其它条件,在user环境下编译,LOCAL_DEX_PREOPT会被置换成true,LOCAL_DEX_PREOPT是怎样控制编译呢?
这里写图片描述
在编译APP时,LOCAL_DEX_PREOPT是true,将会按照相应的规则优化APK文件,这个规则定在dex_preopt.mk文件中。

5.项目中执行的效果

在pixi5-5 4G的项目中Dialer、MMS、Contacts采用独立的仓库,服务器出版本的时候,不再编译源码中的这三个模块,而是已app list的方式,定制apk文件,所以就需要本地编译好apk文件,在上传到服务器。先来看看eng环境下(或关闭预优化)和user环境下编译App后会有什么不一样。
在eng环境下(或关闭预优化),以TctDialer为例,编译后输出的目录是这样的:
这里写图片描述
在看看user下编译的情况,编译后输出的目录是这样的:
这里写图片描述
对比可发现,没有预优化的apk文件有个classes.dex文件,而预优化的没有这个文件了,java代码跑哪里去了,可以看到输出目录多了oat子目录,编译后的java正好在这个目录下。
因此,在user环境下编译,生成的apk文件是不能直接上传到服务器的,因为这个apk已经没有java的代码了。所以在编译apk时,把mk文件中添加LOCAL_DEX_PREOPT := false把预编译关闭。

如果在user下编译的apk,push到daily的系统中,apk依然能够运行,不是没有classes.dex文件了吗?java代码都没有了,为什么还能运行?在第三节可知道,在android系统启动是会优化系统的app,所以daily中的APK的java代码被缓存到手机本地了,push user下编译的apk运行时依然运行的是daily版中apk缓存下来的code。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: android 系统开机优化是为了提高手机开机速度和用户体验而进行的一系列优化措施。以下是一些常见的 android 系统开机优化方法: 1. 延迟应用启动:android 系统在开机时会延迟一些应用的启动,只加载系统核心应用和服务,而将其他应用推迟启动。这样可以加快开机速度,用户可以更快地使用手机。 2. 启动器优化android 系统的启动器负责显示桌面、应用图标等信息。优化启动器可以减少启动器的加载时间,提高用户切换桌面的响应速度。 3. 禁用不必要的装应用:很多手机厂商在出厂时会装一些应用,这些应用可能对用户来说是多余的。禁用不必要的装应用可以减少开机时加载的应用数量,提高开机速度。 4. 清理缓存:android 系统在使用过程中会生成大量的缓存数据,这些数据占用了手机的存储空间,并且可能导致系统开机慢。定期清理缓存可以释放存储空间,并提高开机速度。 5. 系统更新:android 系统的更新通常包含一些性能优化和 bug 修复,及时更新系统可以提高开机速度和系统稳定性。 综上所述,android 系统开机优化是通过延迟应用启动、启动器优化、禁用不必要的装应用、清理缓存和系统更新等方法来提高手机开机速度和用户体验。 ### 回答2: Android系统开机优化是指针对手机的开机过程进行优化,以提高系统启动速度和用户体验。主要涉及以下方面的优化措施: 1. 减少开机自启动应用:开机时系统会自动加载一些应用程序,但这些应用可能会消耗系统资源和影响开机速度。通过减少不必要的自启动应用,可以加快系统启动时间。 2. 禁用系统装应用:大多数手机在出厂时都装了一些应用,但这些应用不一定被用户所需要。通过禁用一些不常用或不必要的装应用,可以加快系统启动速度。 3. 清理系统缓存:开机时,系统会加载许多缓存文件,清理这些无用的缓存文件可以提高系统的启动速度。 4. 更新系统和应用程序:及时更新系统和应用程序可以修复漏洞和优化性能,从而提高系统的启动速度。 5. 使用轻量级应用:一些应用程序可能比较庞大或占用较多内存,启动时需要更多时间。选择轻量级应用可以加快系统的启动速度。 6. 关闭动画效果:在开机过程中,系统会显示一些动画效果,这些效果虽然提升了用户体验,但也会增加系统的启动时间。关闭这些动画效果可以加快开机速度。 7. 清理垃圾文件:开机时,系统会扫描和加载许多垃圾文件,清理这些无用的文件可以提高系统的启动速度。 通过对以上方面的优化,可以加快Android系统的启动速度,提升用户的使用体验。 ### 回答3: Android系统开机优化是为了提高开机速度和用户体验,以下是一些常见的优化方法: 1. 系统加载:Android系统会在开机过程中加载一些常用的应用和组件,以加快后续启动的速度。 2. 减少开机自启动应用:应用在安装时可以选择是否开机自启动,用户可以根据需求调整自启动应用的数量,减少开机时的负担。 3. 应用冷启动优化:冷启动是指应用被启动时,启动过程中需要加载资源和初始化的时间。开发者可以通过优化应用启动流程、延迟加载资源等方式来减少冷启动时间。 4. 优化系统服务启动顺序:Android系统启动时需要依次启动各个系统服务,优化服务启动顺序可以减少等待时间,提高开机速度。 5. 禁用无用的系统应用:Android系统装了很多应用,但用户并不一定都需要使用。可以通过禁用一些无用的系统应用来减少开机负担。 6. 压缩系统文件大小:压缩系统文件可以减少开机时系统读取的文件数量和大小,从而提高读取速度。 7. 使用更快的存储设备:更换为高速的存储设备(如固态硬盘)可以显著提高系统开机速度。 总之,Android系统开机优化可以通过加载、减少自启动应用、冷启动优化优化服务启动顺序、禁用无用系统应用、压缩系统文件大小和使用更快的存储设备等方式来提高开机速度和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值