Android-APP启动优化

  • 伪优化
    • 案例
    • 占位图方案
    • 总结(修改全局的主题)
    • 修改局部的主题
  • 真正的优化
    • 优化
    • 真正优化的总结

黑白屏问题优化
黑白屏在商业APP中的价值
如何使用Traceview工具对优化定位处理

伪优化

用于用户体验,用来给到用户体验,没有实质性的优化

案例

注意看这一块(parent=“Theme.AppCompat.Light”)
如果没写这一块,启动时会是一个黑屏,写了这一块,启动时会是一个白屏;

 <!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimarydark</item><item name="colorAccent">@color/coloraccent</item><!--去掉系统默认的标题栏--><item name="windowNoTitle">true</item><item name="windowActionBar">false</item><!-- 设置activity切换动画 --><item name="android:windowAnimationStyle">@style/activityAnimation</item></style>

相信很多人,经常在Application中做一些初始化,这样会造成启动时白屏的时间延长,有些好的手机上面可能发现不了,我们这里就做了个延时3秒来模拟下;
注意看下面的GIF图,在冷启动时点击启动app的时候,注意看启动时的白屏;

public class App extends Application {@Overridepublic void onCreate() {super.onCreate();File file = new File(Environment.getExternalStorageDirectory(), "app1.trace");Log.i(TAG, "onCreate: " + file.getAbsolutePath());//把分析结果存在一个文件Debug.startMethodTracing(file.getAbsolutePath());//对全局属性赋值mContext = getApplicationContext();mMainThread = Thread.currentThread();mMainThreadId = android.os.Process.myTid();mMainLooper = getMainLooper();mHandler = new Handler();try {//这里来模拟做一些初始化工作Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}NIMClient.init(this, loginInfo(), options());Debug.stopMethodTracing();}
}

这一块白屏是不是很难看?
注: 这个不是微信,这个是我在码云上面下载的一个模仿微信的项目哦;

以前都会觉得是个很难看的bug,现在很多软件会利用这个白屏时间,显示一张背景图;

占位图方案

我想大家应该知道parent就是父类吧,也是继承的样式吧 ?
我们跟着这个parent="Theme.AppCompat.Light"父类,一层一层的往下找;
最终看到这个(Platform.AppCompat.Light)样式
android:windowBackground:看名字应该知道吧,窗口背景;

 <style name="Platform.AppCompat.Light" parent="android:Theme.Light">......<item name="android:windowBackground">@color/background_material_light</item>......</style>

我们来修改这个android:windowBackground ,注意不是在这个里面直接修改!!!

我们在自己的主题里面将android:windowBackground 修改为蓝色;下面来看看效果;

 <!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light"><!--在这里重写android:windowBackground  将它的颜色改为蓝色--><item name="android:windowBackground">@color/assist_blue_down</item><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimarydark</item><item name="colorAccent">@color/coloraccent</item><!--去掉系统默认的标题栏--><item name="windowNoTitle">true</item><item name="windowActionBar">false</item><!-- 设置activity切换动画 --><item name="android:windowAnimationStyle">@style/activityAnimation</item></style>

我们修改成蓝色后,注意到没?启动时候,这里使我们自己设置的蓝色了吧?那是不是就可以在这类放一张启动图片了?
这里放一张启动图片(广告图)后,那启动的时候,就先出来的是那张启动图片(广告图)了;

来看看用图片的效果
我们来放这张图片,来看看效果

总结(修改全局的主题)

这样直接修改全局的主题会有个不好的问题,就是会造成APP的每一个页面都会有这样一个背景图,就会牵扯到布局优化的过度渲染了,如果不了解布局优化的,请移步到我的另一篇博客中:
Android UI绘制优化及建议

修改局部的主题

我们这里新加一个主题;将背景设置成广告的图片

       <style name="AppTheme.Launcher1"><item name="android:windowBackground">@drawable/bg</item></style>

然后在这个LAUNCHER页面中去设置这个独立的主题Launcher1

 <activityandroid:theme="@style/AppTheme.Launcher1"android:name=".activity.SplashActivity"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity>

在代码中再设置主题,效果和上面一样,这里我就不放gif图片了

public class SplashActivity extends BaseActivity {private static final String TAG = "david";@Overrideprotected void onCreate(Bundle savedInstanceState) {//        setTheme(R.style.AppTheme);super.onCreate(savedInstanceState);setTheme(R.style.AppTheme_Launcher1);}
}

真正的优化

尽可能的去减少Activity、Application中onCreate中的耗时代码;
我们来分析Application中onCreate方法的耗时
启动时间:Debug.startMethodTracing(file.getAbsolutePath());
结束时间:Debug.stopMethodTracing();
用这两个方法的调用来,记录这个时间,生成.trace文件,注意要开好文件存储权限;
直接冷启动运行APP,生成文件,然后我们把文件导出来

然后把这个文件拖入到我们的AS里面;

结合我们这个Application中的onCreate来看上面的图
可以发现第一行自己调用的方法吧,然后对应段落下出现了很多各种段落,表示的是方法中调用的其方法,第一行可以看得出这个对应方法以及内部调用后的所需要时间,也就是每个方法的执行耗费的时间;
鼠标放到上面,可以有这个方法执行所耗费的时间注意看我鼠标那,框中最下面显示:6.62ms (表示这个方法执行了6.62毫秒)

public class App extends Application {private static final String TAG = "kaizi";public static List<Activity> activities = new LinkedList<Activity>();@Overridepublic void onCreate() {super.onCreate();File file = new File(Environment.getExternalStorageDirectory(), "app1.trace");Log.i(TAG, "onCreate: " + file.getAbsolutePath());//把分析结果存在一个文件Debug.startMethodTracing(file.getAbsolutePath());//对全局属性赋值mContext = getApplicationContext();mMainThread = Thread.currentThread();mMainThreadId = android.os.Process.myTid();mMainLooper = getMainLooper();mHandler = new Handler();//因为LQRUIKit中已经对ImageLoader进行过初始化了initImageLoader(getApplicationContext());initNim();initImagePicker();initOkHttp();NIMClient.init(this, loginInfo(), options());Debug.stopMethodTracing();}private void initOkHttp() {}
}

如果不喜欢看图的,也可以来看看这个

上图中,第三列%:表示这段总耗时,每个方法对应消耗的百分比;
注意看:initImageLoader、initNim方法耗时占比比较大吧?
我们就需要解决掉这两个方法的耗时,这两个方法处理的价值是最大的,其余的想处理的也可以去处理,看个人;

优化

这类我们将耗时的、对异步要求不高、调用的方法中没去创建handler 没操作UI 的初始化方法,放到了子线程中去调用;
并将可以做懒加载的方法,注释掉,让需要用的地方去做懒加载;

public class App extends Application {private static final String TAG = "kaizi";public static List<Activity> activities = new LinkedList<Activity>();@Overridepublic void onCreate() {super.onCreate();File file = new File(Environment.getExternalStorageDirectory(), "app1.trace");Log.i(TAG, "onCreate: " + file.getAbsolutePath());//把分析结果存在一个文件Debug.startMethodTracing(file.getAbsolutePath());//对全局属性赋值mContext = getApplicationContext();mMainThread = Thread.currentThread();mMainThreadId = android.os.Process.myTid();mMainLooper = getMainLooper();mHandler = new Handler();//因为LQRUIKit中已经对ImageLoader进行过初始化了
//new Thread(){@Overridepublic void run() {initImageLoader(getApplicationContext());//如果要用线程来节约了这些初始化的时间//1.里面的API不能去创建handler//2.不能有UI操作//3.对异步要求不高initNim();initImagePicker();initOkHttp();//可以懒加载}}.start();NIMClient.init(this, loginInfo(), options());Debug.stopMethodTracing();}
}

来看看这个优化后的时间


是不是减少了很多?这样就会让我们APP在启动的时间,减少耗时启动了;

真正优化的总结

优化方案:
1.开线程 调用的方法中没去创建handler 没操作UI 对异步要求不高;
2.懒加载 用到的时候再初始化,如网络,数据库操作;

注意:如果有些需要马上要用到的一些对象和框架,尽量去做懒加载,防止异步加载的对象和框架还没加载完成,在页面中马上使用,造成空指针或者一些异常
还有一些耗时的,可以不放在Application里面,结合懒加载可以在启动页LAUNCHER中,设置主题背景,然后在启动页中启动定时广告,相信大部分框架和代码在这个广告三秒的时间内能初始化完成了。还可以在这三秒中调用下载下一次启动时的图片广告信息等等

感谢收看到最后的童鞋

Android-APP启动优化相关推荐

  1. Android App启动优化

    一:启动优化 1. 启动状态 应用有三种启动状态,冷启动.温启动与热启动:每种启动状态都会影响该应用向用户显示所需的时间. 在冷启动中,应用从头开始启动. 在另外两种状态中,系统需要将后台运行的应用带 ...

  2. Android 系统性能优化(72)-----App启动优化

    App启动优化的一篇深度好文 原文地址: http://www.jianshu.com/p/c056e63dc7a2 正文 对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题, ...

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

    Android性能优化(一):APP启动优化 性能优化系列文章: Android性能优化(一):APP启动优化 Android性能优化(二):UI布局优化 Android性能优化(三):响应优化 An ...

  4. android启动分析,Android APP启动方式、启动流程及启动优化分析

    本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式.app启动流程和app启动优化等知识! app应用启动方式 1.冷启动 当启动应用时,后台没有该应用的进程,这时系统会 ...

  5. 【转】Android APP 启动黑屏优化补丁 (2016-01-18 10:35:23)

    [转]Android APP 启动黑屏优化补丁 (2016-01-18 10:35:23) 转载▼ 这个必须转,这才是高手,解决官方都解决不好的问题! 原文地址,以下为转贴内容: 使用说明 ***** ...

  6. Android APP性能优化

    转载自:https://www.cnblogs.com/qwangxiao/p/8727229.html Android APP性能优化(最新总结) 导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化 ...

  7. Android 系统(102)---Android APP耗电优化

    Android APP耗电优化 可能造成耗电的一些原因 网络请求耗电,而且手机数据网络进行http请求比无线网进行http请求更加耗电,因为数据网络调用到一些底层的硬件模块,就如GPS一样,当手机打开 ...

  8. Android APP性能优化(一)

    Android APP性能优化(最新总结) 安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂 ...

  9. App启动优化-一顿操作猛如虎

    前言 ++一个应用App的启动速度能够影响用户的首次体验,用户希望应用能够及时响应并快速加载.启动时间过长的应用不能满足这个期望,并且可能会令用户失望.这种糟糕的体验可能会导致用户在应用商店针对您的应 ...

  10. Android App性能优化之内存优化

    为什么要进行内存优化? 1.App运行内存限制,OOM导致App崩溃 2.App性能:流畅性.响应速度和用户体验 Android的内存管理方式 Android系统内存分配与回收方式 ●   一个App ...

最新文章

  1. 【已解决】nimfa 环境的详细搭建过程 + 各种依赖库的安装、下载、调试
  2. Android初级第一讲---Android开发环境的配置
  3. Xp下的程序编译成linux,WinXP下打造自己的linux 0.11简易编译环境(原创)
  4. css 大图保持宽高比压缩,css 保持宽高比缩放
  5. 服务器系统怎么调节风扇速度,服务器主板怎样设置风扇速度
  6. 转:高等数学、线性代数、概率论数理统计书籍推荐
  7. Javascript中的单例和模块模式
  8. zabbix3.2自动发现
  9. 小常识:软件常见的各种版本英文缩写
  10. 2023 年十大战略技术趋势中哪一项最需要 HTAP ?
  11. Python+Selenium程序执行完,浏览器自动关闭问题
  12. 全新的福昕JavaScript PDF阅读器
  13. visual studio2017 调试时出现:“Project1.exe”(Win32): 已加载“D:\workplace\Project1\Debug\Project1.exe”。已加载符号。
  14. 从刘老师的进化的力量到有感,疫情阶段如何弯道超车
  15. c语言程序设计韦良芬答案,论高职院校《C语言程序设计》的教学改革
  16. Unity 获取手机触摸方法
  17. php支付宝异步回调验签失败,thinkphp网站支付宝异步回调验签失败问题_PHP开发框架教程...
  18. 基于LSTM算法的风电功率区间预测【含源代码】
  19. Flask项目搭建及部署(完整版!全网最全)
  20. 这些年造过的一些轮子

热门文章

  1. pythonplotly k线 动态_GitHub - Yanglian666/PythonPlotlyCodes: 《Python 数据分析:基于 Plotly 的动态可视化绘图》 源代码...
  2. ubuntu16.04安装jdk以及详细jdk环境配置教程,亲测没毛病。
  3. phpstudy搭建Yaf框架
  4. Python打包成exe文件_详细操作
  5. 华为 java sd卡_无需使用Micro SD卡!只需简单三招,轻松给华为手机扩展容量
  6. 使用JavaScript实现图片轮播,上一张后一张,循环播放
  7. 程序员会碰到什么误解或给人以刻板的形象?
  8. 重构学习(三):代码重构的原则
  9. 大数据未来有哪些趋势,人工智能,区块链?
  10. 阿里巴巴菜鸟包裹java面试总结