【性能优化】App启动优化

200 阅读3分钟

​目录

收起

App启动流程

App启动的整个过程,可以分解成下面几个过程:

起始终止点,获取启动时间的方法:

解决方案

工具参考:

总结

App启动流程

App启动的整个过程,可以分解成下面几个过程:

  • 用户在Launcher上点击App Icon

  • 系统为App创建进程,显示启动窗口

  • App在进程中创建自己的组件
    这个过程可以用下面这幅图来描述:

而我们能够优化的,也就是下面Application的创建部分,系统的进程分配以及一些窗口切换的动画效果等,都是跟ROM相关的,我们无法处理。所以,我们需要把重点放到Application的创建过程。

起始终止点,获取启动时间的方法:

  • 查看Logcat

在 Android Studio Logcat 过滤关键字 “Displayed”, 可以查看到如下日志:2020-10-11 10:27:15.198 1254-1326/? I/ActivityTaskManager: Displayed com.armrest.application/.MainActivity: +685ms后面的+685ms就是冷启动耗时

  • adb dump

通过终端执行“adb shell am start -W -S <包名/完整类名> ” “TotalTime:685”即为本次冷启动耗时(单位ms)

C:\1_FTD_E\Task_handrail\armrest-app-0925>adb shell am start -W -S com.armrest.application/com.armrest.application.ui.main.SplashActivity
Stopping: com.armrest.application
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.armrest.application/.ui.main.SplashActivity }
Status: ok
LaunchState: COLD
Activity: com.armrest.application/.MainActivity
TotalTime: 685
WaitTime: 686
Complete

解决方案

  • App release版本,相比debug版本,包括app和使用第三方库release版本的代码压缩和资源优化都会提升启动效率

  • 显示优化,当App没有完全起来时, 屏幕会一直显示一块空白的窗口(一般来说是黑屏或者白屏, 根据App主题). 这种现象带来的用户体验非常差,所以需要启动页做主题优化,启动页加载一个windowBackground的自定义启动页效果让体验更好,常见的启动页广告,微信地球界面都是这种作用。

    <item name="android:windowBackground">@drawable/background</item>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
  • 优化生命周期内的非UI行为,比如第三方依赖库和初始化等,常见的比如延迟初始化或者IntentService异步初始化等等,目的和懒加载思路基本一致,不是必须开机立马初始化的可以延迟或者等待用的时候再去初始化更合理,最难得优化也在这部分执行初始化还要保证用的时候是可用,这个是重点

    getWindow().getDecorView().post(new Runnable() {

    @Override public void run() { …… } }); public class InitIntentService extends IntentService {

    private static final String ACTION = "com.xys.startperformancedemo.action";
    
    public InitIntentService() {
        super("InitIntentService");
    }
    
    public static void start(Context context) {
        Intent intent = new Intent(context, InitIntentService.class);
        intent.setAction(ACTION);
        context.startService(intent);
    }
    
    @Override
    protected void onHandleIntent(Intent intent) {
        SystemClock.sleep(2000);
        Log.d(TAG, "onHandleIntent: ");
    }
    

    }

  • 资源优化:一个自然是优化布局、布局层级,一个是优化资源,尽可能的精简资源、避免垃圾资源,这些可以通过混淆和tinyPNG这些工具来实现。 大图或者层级过多都会导致UI渲染慢,不能快速的展示给用户

工具参考:

  • 需要学会使用工具去分析Trace文件:
  1. 分析应用性能 | Android 开发者 | Android Developers
  • 启动时序优化需要借助工具去生成开机启动的trace:
  1. 集成和文件获取介绍:hanshuliang.blog.csdn.net/article/det…

  2. 工具介绍:[【Android 性能优化】应用启动优化 ( Trace 文件分析 | 结合代码分析 Trace 文件 )​

    blog.csdn.net/shulianghan/article/details/106898494/](link.zhihu.com/?target=htt…)

  3. [

    blog.csdn.net/shulianghan/article/details/106898494/](link.zhihu.com/?target=htt…)

[

blog.csdn.net/shulianghan/article/details/106898494/](link.zhihu.com/?target=htt…)

         //★ 1. 将追踪信息存放到该文件中
        File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");
        // ★ 2. 开启方法追踪
        Debug.startMethodTracing(traceFile.getAbsolutePath());
           XXXXXX  (onCreate内部的耗时逻辑)
        // ★ 3. 停止方法追踪
        Debug.stopMethodTracing();

总结

  • Application的onCreate到首屏Activity的onResume不要做太多耗时操作. 能异步的尽量异步去初始化或者执行