提高Android应用性能的关键:深入理解Android Runtime

发布时间:2023-05-14

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编译等多个方面进行优化,从而提高应用的性能表现。