Android性能优化——APP启动优化及Trace使用

本文介绍了解决APP启动时黑白屏问题的三种方法,包括自定义启动画面、使用透明背景和利用Trace工具进行性能分析。同时,文章还提供了详细的实现步骤和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发APP时候,如果不做任何处理,在用户打开应用时总会先出现黑屏或者白屏,之后才进入MainActivity中。这是加载程序时间过长造成的。具体的启动原理我就不再这里叙述了,可以百度一下,很多博客讲的都很清楚。我这里只说主要的部分。简单来说,从用户点击应用时,程序会执行Application的onCreate和Activity(入口Activity)的onCreate,之后才进行界面的展示。所以说呢,我们尽量要减少onCreate方法中程序的执行,能进行懒加载的要进行懒加载;可以放在子线程中执行的要放在子线程中。这样可以使白屏时间减少。但是现在应用需要接入大量的三方,而且都要求方法Application中的onCreate方法中,导致优化onCreate的方法的行为很少了。那应该怎么办呢?

现在很多应用当点击的时候都不会出现黑白屏,而是先出现一个自定义的页面,过了不定时长之后进入应用内。这个方法就是很好的解决办法。具体怎么实现呢?

一、APP启动优化

方法1

首先我们在style.xml文件中定义自己的主题,在android:windowBackgroud属性中写上替代白屏的图片。

<style name="AppTheme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/welcom_icon</item>
        <item name="android:windowFullscreen">true</item>
</style>

给入口Activity设置刚刚定义的主题

<activity
      android:name=".MainActivity"
      android:theme="@style/AppTheme.MyTheme">
      <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
</activity>

之后再在入口的Activity中的onCreate方法中设置原本的主题进行恢复

setTheme(R.style.AppTheme)

再次启动App之后就会方法,自己替换的图片代替了黑白屏。

方法2

先创建drawable文件,我们可以通过gravity设置位置,也可以通过item的bottom等属性设置margin距离

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:gravity="fill">
        <bitmap android:gravity="fill" android:src="@drawable/splash_bac_white" />
    </item>
    <item android:bottom="@dimen/splash_bottom_margin">
        <bitmap
            android:gravity="center"
            android:src="@mipmap/splash_top"/>
    </item>
    <item>
        <bitmap
            android:gravity="bottom"
            android:src="@mipmap/splash_bottom"/>
    </item>
</layer-list>

这里有个地方需要注意,那就是bitmap中图片的尺寸及位置。让UI切图的时候,图片的宽度一定要是720或者1080的尺寸(个人建议720),720的图片要放在mipmap-xhdpi文件夹;1080的图片要放在mipmap-xxhdpi文件夹。

在style中的windowBackground中设置drawable

<style name="AppTheme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/my_drawable</item>
        <item name="android:windowFullscreen">true</item>
</style>

之后的操作和方法1是一样的,现在清单文件中设置theme,然后再onCreate方法中进行恢复。

方法3

还有两种方式也可以替代黑白屏的显示,那就是不让黑白屏展示出来。以下代码在自定义的主题中添加,替代android:windowBackground

<item name="android:windowIsTranslucent">true</item>

<item name="android:windowBackground">@null</item>
<item name="android:windowDisablePreview">true</item>


如果应用开始的延迟时间过长的话,点击应用没有任何反应,等加载完成之后直接进入应用。不会有黑白屏,也没有自己的图片。其实就是让黑白屏透明。这两种方法第二种要比第一种的内存消耗要小一点,第一种只是隐藏了黑白屏,但是依然会在内存中加载,第二种则不会加载内存。我们需要知道,黑白屏其实是Android系统加载应用过程防止时间过长而展示的,如果我们采用第二种方法,相当于把这种优化取消了。

 

二、Trace的使用

trace是Android自带的调优工具。我们通过以下的写法,就可以计算出某代码块的执行时间

//参数:分析结果文件生成的路径,文件后缀为.trace
Debug.startMethodTracing(traceFile.getAbsolutePath());
....
伪代码
....
Debug.stopMethodTracing();

我们在手机中找到此文件,把它在AS中打开,如图

我们可以清楚的知道我们所监测代码块的执行时间,对耗时的方法或代码进行优化

当然我们每次写这样的两行代码不太方便,所以我们完全可以使用AOP的方法进行切面监测,一行注解就可以监测一个方法,很方便

### Android 应用程序启动流程 Android 应用启动是一个复杂的过程,涉及多个组件之间的交互。以下是应用启动的主要阶段及其描述: #### 1. **Launcher 发起 Intent** 当用户点击应用程序图标时,Launcher 将发送一个 `Intent` 给系统的 ActivityManagerService (AMS),该 `Intent` 包含目标活动(Activity)的信息[^1]。 #### 2. **Zygote 创建进程** AMS 接收到请求后会检查目标应用是否已经运行在一个现有的进程中。如果未找到,则 AMS 请求 Zygot 进程创建一个新的虚拟机实例并加载必要的库文件。 #### 3. **Application 对象初始化** 新进程被创建之后,系统调用 Application 类的构造函数以及其子类中的 `onCreate()` 方法完成全局上下文环境设置工作[^3]。 #### 4. **Activity 加载与显示** 随后进入主线程执行栈中第一个待处理的任务——即我们定义的第一个 activity 的生命周期方法链:从 attach 到 window decor view inflation 再到最终绘制界面给用户看整个过程都需要耗费一定时间资源去完成操作。 ### 常见启动问题及解决方案 #### 性能优化建议 为了提高用户体验,在实际开发过程中需要注意以下几个方面可能影响到冷热启速度的因素,并采取相应措施加以改进: - **减少不必要的依赖注入框架** 如果项目里引入了很多第三方库来做DI(比如 Dagger,Hilt),那么这些工具本身也会增加额外开销,尤其是在第一次打开的时候因为它们需要解析配置文件等等动作都会延长耗时. - **延迟非必要逻辑至后台线程或者后续时机再做** 把一些不紧急但又必须做的事情安排在稍后的时刻去做而不是放在app刚起来就马上干掉它这样可以有效降低首屏渲染所需的时间成本从而让页面更快呈现出来供访问者查看内容. - 使用 TraceView 工具定位瓶颈所在位置以便针对性修复性能缺陷等问题 ```java @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); // Example of delaying non-critical tasks to background thread. new Thread(() -> { heavyTask(); }).start(); setContentView(R.layout.activity_main); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值