ART与Dalvik的区别
在谈到Android Runtime(ART)之前,先来了解一下它与Dalvik的区别。Dalvik是Android早期使用的虚拟机,它的执行方式是解释执行,即每次执行都需要重新翻译字节码。而ART则采用了预编译的方式,将字节码转换为本地机器指令后再执行,因此相比Dalvik,ART具有更快的启动速度和更好的性能表现。 ART的运行方式为Ahead-of-Time(AOT)编译,即在应用安装时,ART会将应用的DEX字节码转换为本地机器代码,并将其保存在存储空间中,这样在应用运行时就不需要再重新编译,直接加载本地代码即可。而Dalvik采用的是Just-in-Time(JIT)编译,即每次应用运行时都要解释执行字节码,当应用经常重复运行某些代码时,Dalvik才会将其编译为本地代码,从而提高性能。 ART与Dalvik最大的区别就在于ART采用了AOT编译方式,相比Dalvik的JIT编译方式,ART在启动速度和内存占用上均有优化,因此可以帮助应用提升性能。
ART的优势与劣势
2.1 优势
ART相比Dalvik具有以下优势:
- 更快的应用启动速度:由于ART采用了AOT编译方式,所以在应用启动时就已经将DEX字节码转换为本地代码,从而避免了解释执行的过程,提升了应用启动速度。
- 更少的内存占用:ART在执行应用时,不仅能够减少运行时的内存使用,还可以优化内存使用方式。相比Dalvik机制的一次性分配,ART可以更灵活地管理内存,并且只会在真正需要增加堆内存的时候才会进行增量分配,因此能够更加高效地利用内存资源。
- 更好的应用性能:由于ART采用了预编译的方式,所以相比Dalvik,应用的性能表现更加出色。当应用存在大量重复执行的代码时,ART会将其转换为本地机器代码,从而提高了应用的执行效率。
2.2 劣势
ART的缺点在于:
- 安装应用时间较长:由于ART在安装应用时需要将DEX字节码编译为本地代码,因此会比Dalvik机制花费更长的时间。
- 升级应用时间较长:ART在Android系统升级时,需要重新处理应用的本地代码,因此会比Dalvik机制花费更长的时间。
优化应用性能关键:如何深入理解ART
3.1 通过日志了解应用的启动情况
在优化应用性能的过程中,首先需要了解应用的启动环节,看看有没有过度消耗时间的地方。通过日志可以查看应用启动的过程,从而找出启动耗时最多的环节。 我们可以通过开启应用的StrictMode模式,来捕捉在主线程中执行的耗时操作:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
这段代码可以在应用启动时,开启StrictMode模式,捕捉主线程中的耗时操作,并将日志输出到控制台,从而帮助我们找出耗时操作,优化应用性能。
3.2 通过Android Profiler监控应用性能
Android Studio提供了一个工具叫做Android Profiler,可以用来监测应用的CPU、内存、网络、磁盘等性能数据,帮助我们找出应用的性能瓶颈。 在Android Studio中,点击菜单栏的"Run"->"Profile",就可以打开Android Profiler工具。在工具中,我们可以查看应用的CPU使用率、内存使用率、网络传输速度等数据,这些数据可以帮助我们找出应用的性能瓶颈,进行针对性的优化。
3.3 使用ART的Profile Guided Optimization(PGO)功能
ART的Profile Guided Optimization(PGO)功能可以根据实际应用的运行情况,生成相应的性能数据,以便优化应用性能。 在使用PGO功能时,需要在编译应用时,在gradle文件中添加以下代码:
buildTypes {
debug {
debuggable true
jniDebuggable true
//启用PGO功能
if (Boolean.valueOf(System.getProperty('enablePGO'))) {
ndk {
debugSymbolLevel 'NONE'
arguments '-fprofile-generate=${project.buildDir}'
}
}
}
//Release版本
release {
//启用PGO功能
if (Boolean.valueOf(System.getProperty('enablePGO'))) {
debuggable false
jniDebuggable false
minifyEnabled true
ndk {
debugSymbolLevel 'NONE'
arguments '-fprofile-use=${project.buildDir}'
}
}
}
}
这段代码可以启用PGO功能,并将相关的命令行参数传递给NDK编译器,在应用编译期间生成性能数据。应用在运行时,ART会分析性能数据,并利用其做出更优的编译决策,从而提升应用性能。
3.4 使用AOT编译方式
当应用使用ART时,可以采用AOT编译方式,将DEX字节码编译为本地代码,从而提升应用性能。 在应用构建时,可以使用以下代码将应用的DEX字节码编译为本地代码:
android {
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {//在release版本下开启
minifyEnabled false
useProguard false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
//使用AOT编译方式
dexOptions {
javaMaxHeapSize "4g"
preDexLibraries true
//指定编译输出目录
dexOutputDir rootProject.file('output/dex')
//指定编译模式为native
dexInProcess true
}
}
}
}
这段代码可以将编译模式设置为native,将DEX字节码编译为本地代码。这样,在应用启动时,ART就不需要再进行编译,在性能方面就会更具优势。
总结
优化应用性能是Android开发过程中十分重要的一个环节,ART作为Android中的运行时,与Dalvik相比,在启动速度和应用性能方面均有优化。通过深入理解ART的机制,我们可以针对性地进行优化,在日志查看、Android Profiler、PGO功能、AOT编译等多个方面进行优化,从而提高应用的性能表现。