引言
一般来说,我们都会将自己的产品与同类的产品进行个比对,不可避免的会去做些性能优化,以达到胜过其他产品的优势。所以,今天我们就来讲讲性能优化的方方面面。
通常我们所说的性能优化,会从以下几个方面入手:
1. APP启动速度优化
2. APP UI流畅度优化
3. 内存优化
4. APP瘦身
5. 电量优化
APP启动速度优化
(1)初识启动方式
APP启动的方式分为3种:;冷启动、热启动、温启动。
-冷启动:应用程序从头开始,需要做大量的工作,耗费的时间最多。
-热启动:系统会把你的活动放在前台,活动有驻留在内存中,比如按了home键。相对于冷启动,开销较低。
-温启动:用户退出应用程序,随后又重新启动,但是活动的进程是有驻留在后台的,比如按了back键退出应用。
(2)为什么白屏?启动慢?
1、Application的onCreate流程,一般来说,在这个方法会进行大量的通用组件的初始化工作;
2、Activity的onCreate流程,布局太过复杂,导致UI布局渲染耗时,影响启动性能。
(3)解决办法
第一种方法:主题切换。这是治标不治本的问题,只是改善了交互的友好性。
主题theme_bg:其中android:opacity=”opaque”参数是为了防止在启动的时候出现背景的闪烁。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">
<!--黑色背景颜色-->
<item android:drawable="@android:color/black" />
<!-- logo-->
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher" />
</item>
<!-- 右上角的图标元素 -->
<item>
<bitmap
android:gravity="top|right"
android:src="@drawable/launch_screens" />
</item>
<!--最下面的文字-->
<item android:bottom="50dp">
<bitmap
android:gravity="bottom"
android:src="@mipmap/ic_launcher" />
</item>
</layer-list>
样式style:
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/theme_bg</item>
</style>
在manifest中,将启动页的主题设置为我们定义的主题AppTheme.Launcher:
<activity android:name=".MainActivity"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在MainActivity中,切换回原来的主题:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//切换回原来的主题,必须在setContentView前调用
setTheme(R.style.AppTheme);
setContentView(R.layout.activity_main);
}
第二种方法:异步加载、延迟加载、多进程时按照进程区分进行一些初始化工作等。
主要有以下几种情况需要延迟加载:
该段文本转载自:http://www.jianshu.com/p/f5514b1a826c
1. 数据库及IO操作都移到工作线程,并且设置线程优先级为THREAD_PRIORITY_BACKGROUND,这样工作线程最多能获取到10%的时间片,优先保证主线程执行。
2. 流程梳理,延后执行;
实际上,这一步对项目启动加速最有效果。通过流程梳理发现部分流程调用时机偏早、失误等,例如:
更新等操作无需在首屏尚未展示就调用,造成资源竞争;
调用了IOS为了规避审核而做的开关,造成网络请求密集;
自有统计在Application的调用里创建数量固定为5的线程池,造成资源竞争,在上图traceview功能说明图中最后一行可以看到编号12执行5次,耗时排名前列;此处线程池的创建是必要但可以延后的。
修改广告闪屏逻辑为下次生效。
3.其它优化;
去掉无用但被执行的老代码;
去掉开发阶段使用但线上被执行的代码;
去掉重复逻辑执行代码;
去掉调用三方SDK里或者Demo里的多余代码;
信息缓存,常用信息只在第一次获取,之后从缓存中取;
项目是多进程架构,只在主进程执行Application的onCreate();
具体操作:在启动页Activity或ManiActivity的onCreate中进行延迟操作
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
myHandler.post(mLoadingRunnable);
}
});
相关链接: