Android性能优化(一)App启动时间优化

App启动时间优化

一、首先我们需要清楚App的主题加载

你的App的主题位于

res/values/styles

<style name = "AppTheme" parent = "Theme.AppCompat.Light">

我们点击Light主题进去,会发现此主题位于

app/build/intermediates/exploded-oar/com.android.support/appcompat-v7/25.1.0/res/values/values.xml

<style name = "Theme.AppCompat.Light" parent = "Base.Theme.AppCompat.light">

点击此Light又会跳到

<style name = "Base.Theme.AppCompat.Light" parent = "Base.v7.Theme.AppCompat.light">

我们点击后面这个Light进去又会跳到

<style name = "Base.v7.Theme.AppCompat.Light" parent = "Platform.Theme.AppCompat.light">

在这里他定义了一个

<item name ="windowNoTitle"> false </item>

这里有一个非常重要的选项

在他的父类

<style name = "Platform.AppCompat.Light" parent = "android.Theme.light">

中有一个

<item name ="android.windowBackground">@color/background_material_light</item>

而这个color就是白色

在v7包中的color中定义此色

<color name = "background_material_light">@color/material_grey_50 </color>

所以我们可根据windowBackground去优化App启动的视觉感官

二、如何解决呢

1> 我们可以在原来的AppTheme主题下去加一行

<item name = "android : windowIsTransluncent>true</item>

这样我们在启动App时回去加载一个透明的背景,当然在用户层面看到的就是Launcher 桌面,过一会应用才会加载出来,强行甩锅给手机系统。
我们在应用启动后需要还原主题,我们需要在系统主Activity中去加载最开始的主题。
可以在主ActivityonCreat方法中去

setTheme(R.style.AppTheme)

这样在应用加载出来时又恢复了正常,只是手机System需要背锅了

2> 如果想要彻底的优化根治app的启动时间,我们需要更加深入的了解app的启动以及一些测量app启动的方法

三、如何测启动一个App的时间

我们如和获知一个APP的启动时间呢

1> 我们在用logcat抓取手机app启动的日志中去搜索 “dispaly” 关键字可获取该app的启动时间
2>可以使用adb命令去启动主Activity去获取该app的启动时间

adb shell am start -W 包名/+全类名

比如

adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity

在控制台打印出日志中的 ThisTime 就是启动时间

四、Launcher启动App的过程

Launcher上点击某个app的图标会直接调用到amstartActivity方法,该方法会将app分为方法区堆区java栈三个部分
Android性能优化(一)App启动时间优化_第1张图片
ActivityThreadattach方法会开启app,Application再开启activity,在调用attach后会调用attach Application远端进程调用handleBindApplication去创建App,调用ApplicationonCreat方法也就是ActivityThread中的mInstrumenttation.callApplicationOnCreat(app)去启动

五、找到最耗时的方法

通过检查trace的方法在主线程中找到最耗时的方法看能否放在子线程中,放在子线程中的方法要复合以下几个特征:
1、没有创建handler
2、没有绘制UI
3、异步要求不是很高

除此以外如果是单例模式的话可以尝试用懒汉模式创建,这样在使用该对象的时候再去创建,节省资源

如果是对启动页要求不是很大的情况下可以加入

<item name = "android : windowDisablePreview">true</item>

意思为设置禁止启动项

你可能感兴趣的:(Android性能优化)