美文网首页
Android 应用启动优化

Android 应用启动优化

作者: maybe0813 | 来源:发表于2021-05-12 22:49 被阅读0次

    Android 应用启动优化

    Android 应用的启动时间长短是衡量应用性能的指标之一,是用户对应用的第一印象,其重要性不言而喻。

    启动状态

    应用启动状态主要有3种,一般来说冷启动耗时较长,启动优化主要是优化冷启动时间,这样做也可以提升温启动和热启动的性能。

    • 冷启动

      冷启动是指应用从头开始启动:系统进程在冷启动后才创建应用进程。发生冷启动的情况包括应用

      自设备启动后或系统终止应用后首次启动。

    • 热启动

      在热启动中,系统的所有工作就是将 Activity 带到前台。只要应用的所有 Activity 仍驻留在内存

      中,应用就不必重复执行对象初始化、布局加载和绘制。例如按Home键

    • 温启动

      温启动包含了在冷启动期间发生的部分操作;同时,它的开销要比热启动高。有许多潜在状态可视

      为温启动。例如

      • 用户在退出应用后又重新启动应用。进程可能未被销毁,继续运行,但应用需要执行onCreate() 从头开始重新创建 Activity。

      • 系统将应用从内存中释放,然后用户又重新启动它。进程和 Activity 需要重启,但传递到onCreate() 的已保存的实例 state bundle 对于完成此任务有一定助益。

    应用启动流程

    启动流程图.png
    1. 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
    2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
    3. Zygote进程fork出新的子进程,即App进程;
    4. App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
    5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
    6. App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
    7. 主线程在收到Message后,通过反射机制创建目标Activity,并回调Activity.onCreate()等方法。
    8. 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

    启动时间

    启动时间跟手机性能有关,主流旗舰机型启动时间保持在 2S 内为佳

    启动耗时统计

    启动耗时统计有两种途径

    • 系统日志统计

      在 Android 4.4(API 级别 19)及更高版本中,logcat 包含一个输出行,其中包含名为 Displayed 的值。此值代表从启动进程到在屏幕上完成对应 Activity 的绘制所用的时间。

    日志查看启动时间.png
    • adb命令统计

      adb shell am start -S -W [packageName]/[activityName]
      
    adb统计启动时间.png

    我们一般关注TotalTime(表示新应用启动的耗时,包括新进程的启动和Activity的启动,但不包括前一个应用Activity pause的耗时),

    启动状态LaunchState有4种情况:

    • LaunchState: COLD (冷启动)
    • LaunchState: HOT (热启动)
    • LaunchState: WARM (温启动)
    • LaunchState: UNKNOWN (0) (应用在前台时,调用adb命令)

    问题诊断

    • 使用DebugAPI及profiler 工具

      Android Studio 3.2+ 提供了 profiler 工具(我目前已升级到4.1+ 版本),可查看xxx.trace文件

      1.在application中添加startMethodTracing

          public MyApplication() {
            //相对sd卡路径,会在sd卡中生成一个app.trace文件(需要sdcard读写权限)。将手机中的trace文件保存至电脑,随后拖入Android Studio即可。
             //跟踪方式
              Debug.startMethodTracing("app");
                //采样方式,间隔1s
                //Debug.startMethodTracingSampling("app",8*1024*1024,1000);
          }
      

      2.在启动页的activity中添加stopMethodTracing

      @Override 
      public void onWindowFocusChanged(boolean hasFocus) { 
        super.onWindowFocusChanged(hasFocus); 
        Debug.stopMethodTracing(); 
      }
      

      3.从sd卡保存到电脑并使用Android Studio查看

    查看火焰图.png 查看耗时方法.png

    4.优先查看耗时较长的方法并分析代码,遵循性能优化方法,例如:

    • 合理的使用异步初始化、延迟初始化、懒加载机制
    • 避免启动时耗时操作
    • 简化布局

    启动黑白屏问题

    当系统加载并启动 App 时,需要耗费相应的时间,这样会造成用户会感觉到当点击 App 图标时会有 “延迟” 现象,为了解决这一问题,Google 的做法是在 App 创建的过程中,先展示一个空白页面,让用户体会到点击图标之后立马就有响应。

    如果application或activity启动的过程太慢,导致系统的BackgroundWindow没有及时被替换,就会出现启动时白屏或黑屏的情况(取决于Theme主题是Dark还是Light)。

    消除启动时的黑/白屏问题,大部分App都采用自己在Theme中设置背景图的方式来解决。

    1.定义主题

    <style name="AppTheme.Launcher"> 
            <item name="android:windowBackground">@drawable/bg</item> 
    </style> 
    

    2.启动页使用主题

    <activity android:name=".activity.SplashActivity" 
              android:screenOrientation="portrait" 
              android:theme="@style/AppTheme.Launcher"> 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
    </activity>
    

    3.启动页还原为应用主题

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    //替换为原来的主题,在onCreate之前调用 
      setTheme(R.style.AppTheme); 
      super.onCreate(savedInstanceState); 
    }
    

    相关文章

      网友评论

          本文标题:Android 应用启动优化

          本文链接:https://www.haomeiwen.com/subject/ovvzdltx.html