Android 应用冷启动优化

在应用启动期间,您的应用会给用户留下第一印象。应用在启动时必须快速加载并显示用户使用应用所需的信息。如果应用启动时间过长,用户可能会因为等待太久而退出应用。

1、查看应用冷启动时间,可以在android studio的logcat中输入displayed

或者通过命令adb shell am start -W 包名/Activity全路径

2、优化应用启动体验,build.gradle添加依赖库

复制代码
implementation'androidx.core:core-splashscreen:1.2.0'
复制代码
styles.xml里面添加
java 复制代码
<!-- 启动页专用主题 -->
<style name="Theme.App.Starting" parent="Theme.SplashScreen">
<!-- 启动页背景颜色 -->
<item name="windowSplashScreenBackground">@color/white</item>
<!-- 中心显示的 Logo 图片 -->
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_icon_start</item>
<!-- 启动页退出后,跳转到的真正 App 主题 -->
<item name="postSplashScreenTheme">@style/BaseLaunchTheme</item>
</style>

最后在启动的activity中添加下面代码,需要在super.onCreate之前

复制代码
val splashScreen = installSplashScreen()

3、优化应用启动时间

在 Android 系统中,冷启动时间(Cold Start Time) 的计算涵盖了从点击图标到第一帧内容显示的全过程。

  1. 计算的起点 (Time Zero)触发点: 用户点击 App 图标或通过 ADB 命令发起 am start。 系统动作:

•系统服务(ActivityTaskManager)接收到 Intent。

•系统发现该应用进程 不存在。

•系统请求 Zygote 进程 Fork(派生)出一个新的子进程。

  1. 中间环节 (你的代码执行区)这一部分是冷启动时间中耗时最不稳定的部分,也是你可以优化的核心:

1.进程初始化: 虚拟机(ART)启动,加载 Application 类。

2.attachBaseContext 阶段(核心瓶颈点):•super.attachBaseContext(base) 执行

3.Application.onCreate 阶段:

4.Activity 创建:•Activity 实例化 -> onCreate -> setContentView (解析 XML 布局)。

  1. 计算的终点 (The Displayed Point)结束点: 系统窗口管理器(WindowManager)确认 Activity 的第一帧(First Frame) 已经成功渲染并绘制到屏幕上。 标志:•你在 Logcat 中看到的 Displayed ... +852ms 日志。•ADB 命令 am start -W 中显示的 TotalTime

所以我们需要优化应用从application的attachBaseContext到activity的onResume之间的耗时操作

具体项目优化,这里Application中广告初始化改成在协程异步初始化

Kotlin 复制代码
CoroutineScope(Dispatchers.IO).launch {
// 1. 初始化广告 (大多数现代广告SDK支持异步初始化)
ShowAdsHelper.initAds(this@MyApplication)
    ShowAdsHelper.setCountSize(5)
}

启动Activity页面初始化显示需要在docoView绘制完成后执行,里面包含一些初始化tabLayout、ViewPager的加载显示等

Kotlin 复制代码
window.decorView.post {
initData()
}

广告延迟初始化

Kotlin 复制代码
llMain.postDelayed({
initAds()
}, 800)

布局使用ConstraintLayout减少布局层级

app:lottie_autoPlay="true"改完false,在代码中用到再执行

复制代码
View.playAnimation()
复制代码
用完需要执行
复制代码
View.cancelAnimation()

优化前冷启动时间,需要一秒多

优化后冷启动时间降到了五百多毫秒

每个项目代码不一样,核心就是把所有"非首屏渲染必须"的代码,要么丢进子线程,要么推迟到首帧绘制之后执行即可。

相关推荐
mmsx34 分钟前
Android 防二次打包第一道锁:签名校验与完整性校验
android·kotlin
mmsx35 分钟前
Android 混淆不等于安全:二次打包链路完整走一遍
android·kotlin
工业HMI实战笔记2 小时前
优化工业HMI报警提示只需4步
性能优化·交互·设计语言
小宋10213 小时前
Agent轨迹级评测实战:工具选择、预算超限与回归门禁
android·网络·人工智能·回归
gwf2163 小时前
SSD I/O路径全栈优化与Linux内核存储栈性能调优实战
性能优化·linux内核·nvme·性能调优·固态硬盘·存储技术·io_uring
李纲明4 小时前
WordPress 站点变慢:按 TTFB → 缓存 → 查询 → 前端 分层排查(含配置注意)
前端·缓存·性能优化·wordpress·后端开发
墨天梦4 小时前
D05_ViewModel与单向数据流
android·kotlin
蒸鱼Yuzheng6 小时前
Android 构建可复现性:APK 指纹、文件级差异与供应链审计
android·apk·devops·软件供应链·可复现构建
无名猿6 小时前
constexpr 能力扩张:从 C++11 到 C++20 的编译期计算
c++·性能优化·现代c++·编译期
yunwei378 小时前
eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
linux·后端·性能优化