美文网首页
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