精华内容
下载资源
问答
  • APP启动优化
    千次阅读
    2022-03-27 13:04:10

    启动状态

    1.冷启动:冷启动是指应用从头开始启动;
    2.热启动:在热启动中,系统所有的工作就是将Activity带到前台。只要应用所有的Activity仍驻留在内存中,应用就不必重复对象的初始化、布局的加载和绘制。
    3.温启动:温启动包含了冷启动期间发生的部分操作,同时它的开销要比热启动高,有许多潜在状态可以视为温启动。例如:
    (1)用户在退出应用后又重新启动应用。进程可能还未被销毁,继续运行,但应用需要执行onCreate()重新创建Activity。
    (2)系统将应用从内存中释放,然后用户又重新启动它。进程和Activiy需要重启,但传递到onCreate()的已保存的实例state bundle对于完成任务有一定助益。
    一般我们优化的是冷启动时间。

    系统日志统计

    在Android 4.4(API 级别19)及更高版本中,logcat包含一条输出,其中包含名为Displayed的值,此值代表进程启动到在屏幕上完成对Activity的绘制所用的时间。

    ActivityManager: Displayed com.android.example/.MainActivity: +1s48ms
    

    如果我们使用异步懒加载的方式来提升程序画面的显示速度,这通常会导致的一个问题是,程序画面已经显示,同时Displayed日志已经打印,可是内容还在加载中。为了衡量这些异步加载资源所耗费的时间,我们可以在异步加载完毕之后调用activity.reportFullyDrawn()方法来让系统打印到调用此方法为止的启动耗时。

    adb命令统计

    查看启动耗时的另一种方式是使用命令:
    adb shell am start -S -W packageName/.MainActivity
    启动完成后将输出:
    This Time:415
    Total Time:415
    Wait Time:437
    WatiTime:总的耗时,包括前一个应用Activity pause的时间和新应用启动的时间;
    ThisTime:表示一连串启动Activity的最后一个Activity的启动耗时;
    TotalTime:表示新应用启动的耗时,包括新进程的启动和Activity的启动,但不包括前一个应用Activity pause的耗时。
    开发者一般只需要关心TotalTime即可。

    CPU Profile/TraceView

    分析启动时间我们可以使用CPU Profile/TraceView,但是目前TraceView已弃用,如果使用Android Studio 3.2或更高版本,则应改为使用CPU Profiler。
    1.依次选择Run > Edit Configurations。
    2.在Profiling标签中,勾选Start this recording on startup旁边的复选框。
    3.在菜单中选择CPU记录配置,这里我们选择Trace Java Methods。
    Sample Java Methods:采样Java方法;
    Trace Java Methods:跟踪Java方法;
    Sample C/C++ Functions:采样C/C++函数;
    Trace System Calls:追踪系统调用;
    4.点击Apply。
    5.依次选择Run > Profile,将您的应用部署到搭载Android 8.0 (API 26)或更高版本的设备上。点击Stop,结束跟踪后即可显示跟踪结果。
    Call Chart(系统为橙色,自己写的是绿色,第三方为蓝色)
    Flame Chart
    Top Down
    Bottom Up

    Debug API

    在低版本的设备上,我们可以使用Debug API生成trace文件。

    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            Debug.startMethodTracing("enjoy");
        }
    }
    
    public class MainActivity extends AppCompatActivity {
        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            Debug.stopMethodTracing();
        }
    }
    

    运行App就会在sdcard中生成enjoy.trace文件将enjoy.trace拖入Android Studio分析即可。我运行后却没有在sdcard根目录中找到enjoy.trace,进入startMethodTracing()方法,方法上有说明:

    By default, the trace file is called "dmtrace.trace" and it's placed under your package-specific directory 
    on primary shared/external storage, as returned by Context.getExternalFilesDir(String).
    

    去/sdcard/Android/data/包名/files/目录下找到了enjoy.trace文件。

    StrictMode严苛模式

    StrictMode可以检测出我们可能无意中做的事情,以便我们能够修复它们。StrictMode常用于捕获应用程序主线程上的意外磁盘或网络访问,

    
    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            if(BuildConfig.DEBUG){
                //线程检测策略
                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()  //读写操作
                .detectDiskWrites()
                .detectNetwork()  //or .detectAll() for all detectable problems
                .penaltyLog()
                .build());
                //虚拟机检测策略
                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()  //Sqlite对象泄露
                .detectLeakedClosableObjects()  //未关闭的Closeable对象泄露
                .penaltyLog()  //违规打印日志
                .penaltyDeath() //违规崩溃
                .build());
            }
        }
    }
    

    常见的耗时操作有哪些:
    1.IO操作
    2.数据库访问
    3.网络访问(现在已经不允许在UI线程访问网络了)
    4.初始化Sdk->可以使用IdleHandler优化

    其他常用的启动速度优化示例:
    ViewPager懒加载(换成ViewPager2 懒加载一行代码搞定)
    WebView
    自定义View,View的绘制流程里面不能有耗时操作
    xml的加载->可以使用AsyncLayoutInflater

    启动优化为什么跟内存优化有关?
    因为内存抖动会导致频繁GC,从而导致Stop the world

    更多相关内容
  • app启动优化,目的是喂了提升用户体验。防止出现启动慢,启动白屏问题。 一般在启动app时,我们会在application中初始化一些工具和加载大量的资源。 这就会导致app启动速度慢,启动速度会直接导致启动白屏的时间。 ...
  • App 启动方式 冷启动 App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等。在这个过程中,屏幕会显示一个...
  • android开发app启动优化

    2021-01-09 15:07:18
    android开发app启动优化
  • Android性能优化系列之App启动优化

    万次阅读 多人点赞 2017-02-22 00:23:29
    Android性能优化系列之布局优化Android性能优化系列之内存优化Android性能优化系列之apk瘦身应用的启动速度缓慢是我们在开发过程中经常会遇到的问题,比如启动缓慢导致的...,本篇博客就将介绍App启动优化的相关知识...

    Android性能优化系列之布局优化

    Android性能优化系列之内存优化

    Android性能优化系列之apk瘦身

    应用的启动速度缓慢是我们在开发过程中经常会遇到的问题,比如启动缓慢导致的黑屏,白屏问题,本篇博客就将介绍App启动优化的相关知识。

    应用的启动方式

    通常来说,启动方式分为两种:冷启动和热启动。

    1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

    2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。

    App的启动过程

    本文所指的优化针对冷启动。简单解释一下App的启动过程:

    1.点击Launcher,启动程序,通知ActivityManagerService

    2.ActivityManagerService通知zygote进程孵化出应用进程,分配内存空间等

    3.执行该应用ActivityThread的main()方法

    4.应用程序通知ActivityManagerService它已经启动,ActivityManagerService保存一个该应用的代理对象,ActivityManagerService通过它可以控制应用进程

    5.ActivityManagerService通知应用进程创建入口的Activity实例,执行它的生命周期

    启动过程中Application和入口Activity的生命周期方法按如下顺序调用:

    1.Application 构造方法

    2.attachBaseContext()

    3.onCreate()

    4.入口Activity的对象构造

    5.setTheme() 设置主题等信息

    6.入口Activity的onCreate()

    7.入口Activity的onStart()

    8.入口Activity的onResume()

    9.入口Activity的onAttachToWindow()

    10.入口Activity的onWindowFocusChanged()

    这里写图片描述

    什么才是应用的启动时间

    从点击应用的启动图标开始创建出一个新的进程直到我们看到了界面的第一帧,这段时间就是应用的启动时间。

    我们要测量的也就是这段时间,测量这段时间可以通过adb shell命令的方式进行测量,这种方法测量的最为精确,命令为:

    adb shell am start -W [PackageName]/[PackageName.MainActivity]
    

    1、ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
    2、TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。
    3、WaitTime:一般比TotalTime大点,包括系统影响的耗时。

    利用TraceView分析启动时间

    在onCreate开始和结尾打上trace.

    Debug.startMethodTracing("TestApp");
    ...
    Debug.stopMethodTracing();
    

    运行程序, 会在Android/data/包名/files.之后调用buildpath返回路径即最终结果是:storage/emulated/0/Android/data/包名/files/dmtrace.trace
    注意: 需要给程序加上写存储的权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    通过adb pull将其导出到本地

    adb pull /sdcard/TestApp.trace ~/testSpeed.trace
    

    打开DDMS分析trace文件,会出现以下的界面
    这里写图片描述

    一般只需要关注:Calls + Recur Calls / Total和 Cpu Time / Call
    Cpu Time / Call反映调用次数不多,但每次调用却需要花费很长时间的函数
    Calls + Recur Calls / Total反映自身占用时间不长,但调用却非常频繁的函数

    如何减少应用启动时的耗时

    针对冷启动时候的一些耗时,可以采取以下策略:

    1、在Application的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,可以采取Callable实现。
    2、对于sp的初始化,因为sp的特性在初始化时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是需要放在异步线程中处理。
    3、对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中避免做耗时操作。

    遵循上面三种策略可明显提高app启动速度。

    优化应用启动时的体验

    对于应用的启动时间,只能是尽量的避免一些耗时的、非必要的操作在主线程中,这样相对可以缩减一部分启动的耗时,另外一方面在等待第一帧显示的时间里,可以加入一些配置以增加体验,比如加入Activity的background,这个背景会在显示第一帧前提前显示在界面上。 对于应用的启动时间,只能是尽量的避免一些耗时的、非必要的操作在主线程中,这样相对可以缩减一部分启动的耗时,另外一方面在等待第一帧显示的时间里,可以加入一些配置以增加体验,比如加入Activity的background,这个背景会在显示第一帧前提前显示在界面上。

    方案1:

    1、先为主界面单独写一个主题style,设置一张待显示的图片,这里我设置了一个颜色,然后在manifest中设置给MainActivity:

    <style name="AppTheme.Launcher">
     <item name="android:windowBackground">@drawable/bule</item>
    </style>
    //...
      <activity
       android:name=".MainActivity"
       android:label="@string/app_name"
       android:theme="@style/AppTheme.Launcher">
       <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
      </activity>
    

    2、然后在MainActivity中加载布局前把AppTheme重新设置给MainActivity:

    @Override
     protected void onCreate(Bundle savedInstanceState) {
     
      setTheme(R.style.AppTheme);
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    } 
    

    这样在启动时会先显示background,然后待界面绘制完成再显示主界面:
    这里写图片描述

    方案2:通过设置Style
    (1)设置背景图Theme
    通过设置一张背景图。 当程序启动时,首先显示这张背景图,避免出现黑屏

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="android:screenOrientation">portrait</item>
            <item name="android:windowBackground">>@mipmap/splash</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowNoTitle">true</item>
    </style>
    

    (2)设置透明Theme
    通过把样式设置为透明,程序启动后不会黑屏而是整个透明了,等到界面初始化完才一次性显示出来

    
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowBackground">@android:color/transparent</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:screenOrientation">portrait</item>
        </style>
    

    两者对比:
    Theme1 程序启动快,界面先显示背景图,然后再刷新其他界面控件。给人刷新不同步感觉。
    Theme2 给人程序启动慢感觉,界面一次性刷出来,刷新同步。
    (3)修改AndroidManifest.xml

     <application
            android:name=".App"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true">
            <activity android:name=".MainActivity"
             android:theme="@style/AppTheme">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
        //......
    
    </application>
    

    参考文献:
    http://www.jianshu.com/p/a0e242d57360

    展开全文
  • Android性能优化(一):APP启动优化

    千次阅读 2020-05-20 13:41:57
    App启动的方式有三种: 1. 冷启动:App没有启动过或App进程被killed, 系统中不存在该App进程, 此时启动App即为冷启动。 2. 热启动:热启动意味着你的App进程只是处于后台, 系统只是将其从后台带到前台, 展示给用户...

    Android性能优化(一):APP启动优化

    性能优化系列文章:

    Android性能优化(一):APP启动优化

    Android性能优化(二):UI布局优化
    Android性能优化(三):响应优化
    Android性能优化(四):内存优化

    App启动的方式有三种:

    1. 冷启动:App没有启动过或App进程被killed, 系统中不存在该App进程, 此时启动App即为冷启动。
    2. 热启动:热启动意味着你的App进程只是处于后台, 系统只是将其从后台带到前台, 展示给用户。
    3. 介于冷启动和热启动之间, 一般来说在以下两种情况下发生:
      (1)用户back退出了App, 然后又启动, App进程可能还在运行,但是activity需要重建。
      (2)用户退出App后, 系统可能由于内存原因将App杀死, 进程和activity都需要重启,但是可以在onCreate中将被动杀死锁保存的状态(saved instance state)恢复。

    这里主要针对冷启动进行优化。

    一、先来看看冷启动的流程:

    1. Zygote进程中fork创建一个新的进程。
    2. 先创建和初始化Application类。
    3. 创建和初始化Launch Activity(onCreate onMesure onLayout,ondraw)。
    4. 调用setContetView方法后,将view添加到DecorView中,调用view的measuer/layotu/draw显示到界面上。

    二、冷启动优化:

    优化之前先说如何查看应用启动时间,方便进行对比:

    • 第一种方法:手机连接电脑,打开Android Studio,查看Logcat打印出来信息,筛选关键字Displayed就可以看到应用启动时间。如下图:
      在这里插入图片描述

    • 第二种方法:使用adb shell命令来启动应用并查看启动时间adb shell am start -W [packageName]/[packageName.launchActivity] 如下图:
      在这里插入图片描述
      优化方法:

    • 针对Application的,不要在Application中进行业务操作和耗时操作,不要以静态变量的方式在Application中保存数据。

    • 针对Launch Activity,不要在Activity的onCreate方法进行耗时操作,如有必要则在线程中操作或者延时加载。

    • 针对Launch Activity的View的绘制,减少Activity布局view的层级,最好不要超过4层,减少View测量绘制的时间。

    需要执行耗时任务时,推荐使用下面这种延时加载,在窗口完成以后进行加载,这里面的run方法是在onResume之后运行的。

    getWindow().getDecorView().post(new Runnable() {
        @Override
        public void run() {
            //TODO something
        }
    });
    
    展开全文
  • Android冷启动时间优化 Android APP启动优化
  • Part 2 App启动优化-附件资源
  • 导读性能优化一直都是各个APP推进中的重点、难点,爱奇艺 App也不例外。在此之前,爱奇艺App Android 版的启动速度虽然一直处于同类App领先的水平,但优势距离其他同类的APP...

    导读

    性能优化一直都是各个APP推进中的重点、难点,爱奇艺 App也不例外。在此之前,爱奇艺App Android 版的启动速度虽然一直处于同类App领先的水平,但优势距离其他同类的APP距离一直很小。面对这一瓶颈,爱奇艺技术产品团队为爱奇艺App的启动优化搭建了专项团队。在各个团队的大力支持下,将启动时间由1.5s优化到了0.5s,实现了巨大跨越,下文将分享爱奇艺App启动的优化实践。

    本文长度为2914字,预估阅读时间8分钟。

    凡事预则立,不预则废

    关于App 的启动优化, 大部分的技术同学第一反应是延迟执行任务,再通过做一些代码实现上的优化来提高代码的执行效率。爱奇艺App 早期的优化策略也是如此:将某些启动阶段不必要执行的任务延迟到首页某个生命周期之后再执行,或是延迟固定时间之后再执行等等。

    这一优化策略在前期的确有一些效果,但是后来就收益甚微了。爱奇艺App(Android)经过多年的稳定迭代, 功能不断丰富,代码量也越来越庞大。启动阶段涉及了很多业务的初始化功能,业务之间又有着复杂的依赖关系,轻易变更代码执行时序可能会导致崩溃或者某些业务异常。之前简单的延迟优化策略已经很难再取得收益,一种全新的优化方案已经迫在眉睫。

     

    工欲善其事,必先利其器

    有没有一种工具能直接看到当前任务执行的瓶颈呢?做过Android性能优化的同学应该都会比较熟悉Systrace和 TraceView这两款工具。但是这还不够,我们需要一款更为直观、便捷的工具。它能够把启动阶段代码执行的先后顺序、时间间隔、线程情况以及代码位置等信息直观的展示出来,让我们能一眼看出某一阶段的任务调度是否合理,然后再根据实际情况进一步做有针对性的优化。

    但到目前为止,我们尚未发现业内有满足此需求的现成工具。然而在一年前,我们团队自主开发了一款Lens开发调试工具,它能够以SDK的形式接入任意的Android 应用程序,可以提供任务分析、网络分析(抓包)、页面分析(视图拾取、视图层级等)、沙盒访问、快捷入口等等功能。于是我们团队经过讨论,决定用Lens来实现任务分析的功能,这样既能完成启动优化,又能进一步完善Lens的功能。经过我们团队持续不断的完善和优化,突破重重技术难关。终于实现了可以直接看见任务的执行状况的能力,就像医生拿到了病人的CT报告,精准优化已准备就绪。

    优化前启动耗时与线程信息(Debug)

    优化前启动任务情况(Debug)

     

    优化前启动任务执行时序(Debug)

    诊断:启动阶段有大量的线程启动,执行了大量的任务,并且主线程任务十分密集。 

    经过充分的思考后,我们团队给出了如下的优化方案:

    ·   任务化:将启动阶段的代码按照业务逻辑封装成独立任务,方便管理和调度。

    ·   并发:将启动阶段的任务尽量并发执行。

    ·   延迟:启动阶段只执行第一个页面渲染展示的必要任务,延迟的任务将在第一个页面渲染完成后再进行合理的调度触发。

    ·   兜底:设计兜底机制,保证程序稳定执行。

    ·   监控与优化:建立常态化监控机制,监测任务变化情况,实现精准优化。

    由于启动阶段的任务之间存在相互依赖关系,被依赖任务会出现异步执行未完成而导致的崩溃问题。为了解决这一问题,一种基于依赖关系来动态调度任务执行的任务管理器——《TaskManger》被设计出来。

    TaskManager(后文简称TM)支持给任务设置执行条件,例如等待某个任务执行完成后或者某个事件发生后再开始执行;支持“关系与”依赖、“关系或”依赖,支持延时执行,支持把任务提交到主线程或者子线程执行等等。除此之外,任务之间还能传递数据,监听事件等等。

    一、任务化

    我们重新梳理了Application 阶段的代码,并按照功能业务归类整理,提炼出了多个任务模块。例如,我们将播放器部分的初始化工作封装在PlayerInitTask类中。每个任务类都分为任务注册与任务执行两个部分,依据程序是否会启动页面展示,我们设置了不同的任务执行策略。

    PS:灵活的任务执行时机设置也是TM的一大优点。

    二、并发与线程收敛

    在完成启动业务的梳理和重构之后,将可以在子线程中运行的任务提交到子线程中执行,将之前比较耗时的任务分拆为多个子任务,阻塞并发执行,从而尽可能的充分利用CPU的算力。

    并且将启动阶段的任务都对接到了TM统一调度,避免其它线程抢占CPU资源以及一些不必要的系统开销问题,完成了启动阶段线程的收敛。通过采取这些措施启动阶段的线程数明显降低,主线程因为子线程抢占CPU资源而导致的执行效率过低的问题也得到了解决。

     

    三、延迟

    在启动阶段主要设置了两个事件:广告展示事件和首页展示事件。按照业务执行的必要性,我们把启动阶段不必要执行的任务分别延迟到了这两个阶段之后执行。任务之间也按照之前梳理的依赖关系,分别设置了相应的依赖条件,解决了因被依赖任务被延迟未执行而导致的崩溃或业务异常问题。TM还 提供了一些运行监测机制,能有效避免循环依赖问题的发生。

    由于TM的调度管理,这些任务在运行条件得到满足后会根据当前运行条件与设置的任务优先级等情况合理调度执行,不会出现大量任务同时并发执,从而导致页面卡顿的问题;

     

    四、兜底

    当任务延迟后,任务执行时机存在不确定性。这可能导致在业务需要时,一些初始化任务还没有执行完成的问题——TM 提供了任务兜底机制。

    使用上面的API可以保证业务依赖的任务一定被执行,从而解决了因为“异步”与“延迟”可能给业务带来崩溃或者逻辑异常问题。

     

    五、监控与优化

    1)阻塞等待监控

    由于TM提供了任务的兜底机制,理论上就会存在因业务需要而导致等待任务执行完成的场景产生。这种问题在低端设备上更为常见。为了解决这一问题,我们在TM中添加了任务等待监控功能,将其纳入常态化的监控中,并且成功发现了多项阻塞等待的问题。通过通知业务方进行逻辑优化,大大减少甚至避免了部分阻塞等待的问题,用户体验获得了更进一步的提升。

     

    2)启动数据监控

    我们将Lens的启动数据投递到后端,并且建立了启动分析日报机制。将启动过程分段,除了启动时间外,还投递了程序初始化阶段、页面创建阶段、页面渲染阶段的分阶段耗时数据,当某项数据明显劣化后,服务端就会发出预警。

     

    3)历史版本启动任务对比分析

    目前最新的Lens 版本支持版本间启动任务对比分析功能,我们可以在界面上展示出两个版本之间的任务变化差异,例如新增任务、减少任务及运行耗时变化超出阈值的任务信息。通过分析这些变化的任务信息,就可以直接“约谈”相关业务方,进而快速的完成优化工作。

    与此同时,我们团队还执行了一些其他的优化手段,例如推进代码执行效率的优化、提前加载一些重要展示数据等等。

     

    总结

    通过多个版本的迭代,完善了任务调度框架、启动任务常态化监控机制、任务分析功能等等。

    优化后启动耗时与线程信息(Debug)

     

    现已经优化到500ms以内,启动任务、启动阶段线程数也大幅度减少。在这次的优化实践工作中,Lens 与TM 两个工具发挥了重要作用。关于Lens的细节,我们将在后续进一步为大家分享。

    end

    也许你还想看

    效能篇 | 爱奇艺APP一键体检技术实践

    开源|爱奇艺开源基于Android App Bundle动态化方案Qigsaw

    扫一扫下方二维码,更多精彩内容陪伴你!

    展开全文
  • Android App 启动优化全记录

    千次阅读 2019-11-19 10:37:12
    本文参考了目前大部分 Android 应用启动优化的方案,将大家的方案做一个汇总,如果你有这方面的需求,只需要对照这篇文章,看看其他人的方案,查漏补缺。很多方案是要根据具体的业务去做优化的,所以这里也没有对每...
  • Android-APP启动优化

    千次阅读 2020-07-05 19:34:04
    Android-APP启动优化伪优化案例占位图方案总结(修改全局的主题)修改局部的主题真正的优化优化真正优化的总结 黑白屏问题优化 黑白屏在商业APP中的价值 如何使用Traceview工具对优化定位处理 伪优化 用于用户体验,...
  • iOSApp启动性能优化

    2021-01-27 16:32:36
    本文分为四个部分:第一部分科普了一些和App启动性能相关的前置知识第二部分主要讲如何定制启动性能的优化目标第三部分通过在WiFi管家这个具体项目的优化过程,分享一些有用的经验第四部分是关键点的总结。...
  • Android app 启动优化

    千次阅读 2017-03-12 01:55:49
    app启动优化 白屏 黑屏 解决办法
  • App 启动优化

    2018-05-19 19:57:14
    许多应用都出现启动速度缓慢,出现黑屏,白屏问题,这是因为 APP 没有进行启动优化。 Google文档 先看看 Google 官方文档 Launch-Time Performance 对应用启动优化的概述: 应用的启动分为冷启动、热启动、...
  • double launchTime = (CFAbsoluteTimeGetCurrent() - StartTime);
  • 主要介绍了Android APP启动方式、启动流程及启动优化分析的相关资料,需要的朋友可以参考下
  • APP性能优化--启动优化

    千次阅读 2022-03-24 21:38:10
    2.APP启动时间的优化,主要是针对冷启动进行优化 3.Arguments通过添加环境变量可以打印出APP的启动时间分析(Edit scheme-->Run-->Arguments) DYLD_PRINT_STATICS设置为1 如果需要更详细的信息,那就将DYLD_...
  • APP启动速度非常重要,APP启动速度慢,可能会造成用户体验不良好,尤其是在最近用Android studio之后,如果长时间不打开app,启动速度就会特别的慢,下面我们一起探讨一下影响app启动速度的原因,以及解决方案。...
  • App启动时间优化 一、首先我们需要清楚App的主题加载 你的App的主题位于 res/values/styles 我们点击Light主题进去,会发现此主题位于 app/build/intermediates/exploded-oar/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,744
精华内容 63,897
关键字:

APP启动优化