一、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具有以下优势:
1.更快的应用启动速度:由于ART采用了AOT编译方式,所以在应用启动时就已经将DEX字节码转换为本地代码,从而避免了解释执行的过程,提升了应用启动速度。
2.更少的内存占用:ART在执行应用时,不仅能够减少运行时的内存使用,还可以优化内存使用方式。相比Dalvik机制的一次性分配,ART可以更灵活地管理内存,并且只会在真正需要增加堆内存的时候才会进行增量分配,因此能够更加高效地利用内存资源。
3.更好的应用性能:由于ART采用了预编译的方式,所以相比Dalvik,应用的性能表现更加出色。当应用存在大量重复执行的代码时,ART会将其转换为本地机器代码,从而提高了应用的执行效率。
2.2 劣势
ART的缺点在于:
1.安装应用时间较长:由于ART在安装应用时需要将DEX字节码编译为本地代码,因此会比Dalvik机制花费更长的时间。
2.升级应用时间较长: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编译等多个方面进行优化,从而提高应用的性能表现。