Android启动流程优化 上篇

news2024/11/18 4:46:50

Android启动流程优化 上篇

本文链接:Android启动流程优化 上篇_猎羽的博客-CSDN博客

启动流程

各个阶段图

1、各个阶段的概括总结

分为5个大阶段或者10个小阶段

【字节跳动团队】内部论坛分享也是这么处理的

补充一些只是细节点:

  1. application#onCreate()运行在主线程中,如果比较耗时,也会影响到后面Activity阶段的开始(延迟开始)
  2. 每个优化的具体方法可能只有几行代码,但是背后蕴藏的原理是更重要的。

启动优化架构师思想

  1. 理论分析 => 全局思考,对全局和优先级进行把控,不陷入到片面的细节中
  2. 现状分析 => 耗时分析,profile工具对可优化点摸底,确定优化方向
  3. 启动优化 => 具体启动优化项
  4. 持续测试 => 不同时期,需求不同,结合实际场景持续优化,并进行效果验证。

什么是全局思考的能力?

从整个FrameWorek的启动流程中,分析出具体可以优化的阶段和具体方法

Framework层面启动流程和原理解析

Activity启动流程

问题1:是否存在Activity启动了但是Application没有启动的情况?

存在,因为bindApplication和handleLaunchActivity,使用了非阻塞的oneway修饰的IBinder异步通信,可能存在相反情况,有保护机制:performLauncherActivity()中newActivity()后还会LoadedApk去makeApplicaiton()

黑白屏

2、黑白屏出现在哪个阶段?

  1. 在ActivityStarter.java startActivityInner方法中会处理黑白屏 ``

3、黑白屏属于哪个进程?

不属于App进程,在system_server进程中

4、为什么可以设置黑白屏?

该图片在AndroidManifest.xml中设置Application的主题Theme,设置了styles.xml中自定义主题的`android:windowSplashscreenContent`

5、黑白屏有什么用?

用户点击Launcher后,App启动需要时间,要给用户反馈

防止用户多次反复点击icon按钮

App启动需要时间,拦截点击事件,也避免了App的ANR

6、SystemServer和黑白屏

SystemServer本身会设置和准备Context、Theme、ActivityThread、Application

黑白屏直接由SystemServer启动

7、黑白屏启动源码解析

ActivityStarter.java#startActivityInner()
    // 创建启动黑白屏window
    mTargetStack.startActivityLocked
ActivityStack.java#startActivityLocked())
    r.showStartingWindow(prev, newTask, isTaskSwitch(r, focusedTopActivity));
ActivityRecord.java#showStartingWindow()
    addStartingWindow(packageName, theme,
                compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags,
                prev != null ? prev.appToken : null, newTask, taskSwitch, isProcessRunning(),
                allowTaskSnapshot(),
                mState.ordinal() >= STARTED.ordinal() && mState.ordinal() <= STOPPED.ordinal());
        -->mStartingData = new SplashScreenStartingData(mWmService, pkg,
                    theme, compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags,
                    getMergedOverrideConfiguration());
        -->scheduleAddStartingWindow();
            -->mWmService.mAnimationHandler.postAtFrontOfQueue(mAddStartingWindow);
    AddStartingWindow#run()
        -->surface = startingData.createStartingSurface(ActivityRecord.this);
            -->mService.mPolicy.addSplashScreen(activity.token, mPkg, mTheme, mCompatInfo,
                mNonLocalizedLabel, mLabelRes, mIcon, mLogo, mWindowFlags,
                mMergedOverrideConfiguration, activity.getDisplayContent().getDisplayId());
            PhoneWindowManager.java#
                        // Obtain proper context to launch on the right display.
                    -->Context displayContext = getDisplayContext(context, displayId);
                    -->PhoneWindow win = new PhoneWindow(context);
                    -->addSplashscreenContent(win, context);
                        -->int resId = a.getResourceId(R.styleable.Window_windowSplashscreenContent, 0);
                        -->Drawable drawable = ctx.getDrawable(resId);
                        -->View v = new View(ctx);
                        -->v.setBackground(drawable);
                        -->win.setContentView(v);
                    -->view = win.getDecorView();
                    -->wm.addView(view, params);

8、android:windowSplashscreenContent App还没启动为什么可以提前拿到?

PKMS解析Apk后会解析xml文件

SystemServer需要展示黑白屏时可以直接通过ResId加载Drawable

installProvider源码解析

优化实战

1、app怎么算启动了?

点击Launcher后可以看到主界面

2、启动优化的环节在哪儿?

Launcher到App主界面区间

3、正常App启动页面分三个

Logo页面(ss)->广告页面(splash)->主页面MainActivity

4、为什么还需要广告页面?

1、赚钱

2、主页面太复杂避免黑白屏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于多案例系统学习防洪评价报告编制方法与水流数学模型建模(HECRAS、MIKE、EFDC、Delft3D、FVCOM、SWAT、SWMM等模型应用)

目录 ​专题一 《防洪评价报告编制导则解读河道管理范围内建设项目编制导则》&#xff08;SL/T808- 2021&#xff09;解读编制导则解读 专题二 防洪评价相关制度与解析 ★专题三 案例演练解析 专题四 防洪评价地形获取及常用计算实践 专题五 HEC-RAS软件原理及应用案例解析…

leetcode160.相交链表

https://leetcode.cn/problems/intersection-of-two-linked-lists/solution/ 相交链表是指两个单向链表在某个节点处相交&#xff0c;之后形成了共同的后续部分。通常&#xff0c;两个链表的长度不相等。在相交节点之前&#xff0c;两个链表的节点数可能不同&#xff0c;但在相…

Java后端编译与优化

如果我们将字节码看作是程序语言的一种中间表示形式&#xff0c;那编译器无论在何时、在何种状态下把Class文件转换成与本地基础设施相关的二进制机器码&#xff0c;它都可以视为整个编译过程的后端。 1 即时编译器 即时编译器是指运行时将热点代码编译成本地机器码&#xff…

程序员必须掌握哪些算法?——前端开发工程师需要掌握的算法

文章目录 &#x1f4cb;前言&#x1f3af;什么是算法&#xff1f;&#x1f3af;前端开发工程师需要掌握的算法&#x1f9e9;排序算法&#xff08;如快速排序、归并排序&#xff09;&#x1f9e9;搜索算法&#xff08;如二分搜索&#xff09;&#x1f9e9;图算法&#xff08;如广…

【Unity造轮子】2D横版平台跳跃游戏实现多段跳完美手感(含源码)

文章目录 前言先看效果&#xff0c;手感很丝滑原理开始1. 看到检测点的检测范围2. 二段跳实现3. 动画控制器配置 源码扩展完结 前言 随着游戏技术的不断发展&#xff0c;2D横版平台跳跃游戏成为许多玩家的最爱。这类游戏以其简单而有趣的玩法和精致的视觉效果吸引着无数游戏爱…

Kotlin~Decorator装饰器模式

概念 装饰模式指的是在不必改变原类文件和使用继承的情况下&#xff0c;动态地扩展一个对象的功能。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象。可以运行时动态添加新的功能&#xff0c;而无需改变原来的代码。 特点&#xff1a; 灵活扩展新的功能动态…

接口设计的总结

目录 前言 设计好接口的 36 个锦囊 总结 前言 作为后端开发&#xff0c;不管是什么语言&#xff0c;Java、Go 还是 C&#xff0c;其背后的后端思想都是类似的。我们做后端开发工程师&#xff0c;主要工作就是&#xff1a;如何把一个接口设计好。所以&#xff0c;今天就给大家…

北京大学考研机试题:二叉树

【题目来源】https://www.acwing.com/problem/content/description/3474/【题目描述】 如上图所示&#xff0c;由正整数 1&#xff0c;2&#xff0c;3…… 组成了一颗特殊二叉树。 我们已知这个二叉树的最后一个结点是 n。 现在的问题是&#xff0c;结点 m 所在的子树中一共包括…

MobileNeRF在Windows上的配置

MobileNeRF于2023年提出&#xff0c;源码地址&#xff1a;https://github.com/google-research/jax3d/tree/main/jax3d/projects/mobilenerf &#xff0c;论文为&#xff1a;《MobileNeRF: Exploiting the Polygon Rasterization Pipeline for Efficient Neural Field Renderin…

QT自定义工具条渐变背景颜色一例

使用样式定义&#xff1a; QWidget* toolbar new QWidget(this);toolbar->setObjectName("main_tool");toolbar->setStyleSheet("#main_tool{background: qlineargradient(x1:0 , y1:0 , x2:1 , y2:0,""stop:0 rgba(0,255,0, 0.2),"&q…

Nuxt3 components公共组件

1.目录结构 效果实现&#xff1a;写一个公共的right组件&#xff0c;在index和about页面同时引用它 2.index页面引入 index页面显示效果 about页面引用及效果

组件的自定义事件

src/components/School.vue <template><div class"school"><h2>学校名称&#xff1a;{{ name}}</h2><h2>学校地址&#xff1a;{{ address }}</h2><button click"sendSchoolName">把学校名给App</button>…

数据集成的强大联盟:Elasticsearch、Kibana、Logstash、MySQL

通常&#xff0c;很多关系数据项目都使用 MySQL。 它对于标准的 CRUD 操作是有益的&#xff0c;但有时我们需要做额外的过程。 当我们搜索某些内容时&#xff0c;我们会消耗资源或合并多个表。 有时&#xff0c;即使不是&#xff0c;可能仍然需要复杂的 SQL 查询。 也许这不是正…

如何查看OpenAI的AccessToken?

如何查看OpenAI的AccessToken&#xff1f; 记录一下如何查看 OpenAI的 AccessToken 文章目录 如何查看OpenAI的AccessToken&#xff1f;前提具体操作总结 前提 &#x1f4a7;首先&#xff0c;在获取AccessToken前&#xff0c;你需要达成 以下两个条件: 拥有一个可用的OpenA…

ARM CORETEX M0简介

ARM CORETEX M0简介 1. M0处理器简单框图 处理器内核&#xff1a;逻辑控制与运算 内部总线系统&#xff1a;单总线将处理器与外部的存储器和外部连接&#xff0c;进行数据交互&#xff08;冯诺依曼架构&#xff0c;数据与指令一起&#xff09; NVIC&#xff1a;嵌套向量中断控…

【Matlab】智能优化算法_亨利气体溶解度优化算法HGSO

【Matlab】智能优化算法_亨利气体溶解度优化算法HGSO 1.背景介绍2.数学模型2.1 亨利定律2.2 HGSO 3.文件结构4.伪代码5.详细代码及注释5.1 Create_Groups.m5.2 Evaluate.m5.3 fun_checkpoisions.m5.4 fun_getDefaultOptions.m5.5 HGSO.m5.6 main.m5.7 sumsqu.m5.8 update_posit…

机器学习总览

机器学习 1.什么是机器学习&#xff1f; 机器学习是使计算机像人类一样学习与行动的科学&#xff0c;并通过观察与现实世界交互的形式向计算机提供数据和信息&#xff0c;从而随着时间的推移以自主的方式改善其学习。 通过经验提高某些任务性能的计算机程序。 人工智能>机器…

FreeRTOS ~(六)信号量 ~ (1/3)信号量解决同步缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;1/3&#xff09;同步的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;1/5&#xff09;队列解决同步缺陷 举例子说明&#xff1a;利用信号量解决前述的"同步的缺陷&…

最具价值开源项目收藏--持续更新

轻量级开源笔记应用&#xff08;memos&#xff09; 该项目基于 Go React.js SQLite 技术栈开发&#xff0c;兼具高性能与可定制性&#xff0c;适用于日常生活办公中的各类笔记管理场景。 开源地址&#xff1a;https://github.com/usememos/memos 跨平台无缝传输文件&#…

揭秘python函数:编程艺术的核心力量(3)

文章目录 前言递归lambda表达式lambda 的参数形式无参数位置参数关键字参数缺省参数可变参数1.包裹位置传递2.包裹关键字传递 带判断条件的lambda表达式列表数据按照字典key的值进行排序 高阶函数的使用内置高阶函数1.map()2.reduce()3.filter() 前言 前面我们已经学习了 pyth…