android 进阶篇 08、启动速度、卡顿与布局优化简述
run -- edit Configurations -- profiling -- start this recording on startup 前面打勾
主要有两种模式可以选择,sample java methods:间隔时间采样,每隔一定时间进行采样,分析相应方法的时间占用;trace java method:方法调用跟踪,会跟踪调用每个方法,然后记录每个方法的耗时,这种方式特别卡,并且也没有必要,一般使用第一种足以;
保存之后,我们以 profile 方式启动 app,即可在 profiler 界面查看启动耗时相关信息;
在 prfiler 界面主要看三个模块来分析启动耗时
Top Down:方法的调用栈信息,我们可以通过分析方法调用栈过程中的各个方法的耗时时间,来确定是在那个过程中耗时较多; Flame Chat:又称火焰图,是以时间条的形式对方法的耗时进行记录,我们一般在这个图上总览一下各个方法的耗时,真正去分析时间还得去 Top down 中分析具体的方法; Bottom Up:也是方法的调用信息,不过跟 Top Down 正好相反,是从底部往顶部查找的,一般不看这个模块,查找不方便,看第一个方法调用栈就可以;
4、黑白屏问题
当我们点击 app 图标时,在应用还没有启动起来的时候会有白屏或者黑屏代替,这是 google 提供的界面加载方法,不过用户体验不好,我们可以通过设置背景图的方法解决;
我们首先定义 style 属性,将 windowbackground 属性设置为我们的背景图片;
然后在 activity 标签中修改 theme 属性,使用我们自定义的 style 标签;
最后我们要在 activity 的 oncreate 方法中 settheme 设置回应用的主题,因为启动了之后还是需要使用应用的主题的;
添加背景图片并不能对启动速度有优化,只是为了提高用户体验度;
<resources><!-- Base appl
<style name="AppTheme.myapp"><item name="android:windowBackground">@drawable/ic_controls</item></style>
</resources>
<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:name=".application.ArchDemoApplication"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:theme="@style/AppTheme.myapp"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
protected void onCreate(Bundle savedInstanceState) {setTheme(R.style.AppTheme);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);、、、}
二、卡顿分析
卡顿分析跟启动速度的分析的操作基本相同,也是使用 Android studio 自带的 profiler 分析器进行分析;
打开 Profiler 界面,保持应用运行在设备上或者模拟器上;
点击 cpu 运行模块进入 cpu 分析界面;
在 Select CPU Profiling mode 中选择 Trace System Calls,并点击 record;
然后在设备上操作我们应用想要分析的界面,操作完成后点击 stop;
此时会自动生成 SystemTraceRecording 界面;
我们可以在生成的界面上进行分析,界面显示了许多有用的信息,比如每一帧的消耗时间,如果时间过长会变红,并且在下面时间条显示具体方法名;
我们还可以在右边的 Top down 界面查看具体方法调用栈信息;跟启动速度优化的右侧界面相同;
三、布局分析
布局方面的优化主要可以从三个方面进行分析;
1、层级优化
framework 层在对布局进行 measure、layout 和 draw 操作时是一层一层布局递归调用的,因此我们的布局层次结构越深,则耗时越久,我们应该尽量减少布局层级,扁平化处理布局;
我们可以使用 Android studio 自带的 Layout Inspector 布局分析器进行布局的分析;
在设备或者模拟器上运行我们的应用;
Tools -- layoutinspector 进入布局分析界面,系统会自动检测应用进程并展示;
在左侧视图树界面查看视图层级;右侧属性界面查看 view 属性;
使用 merge 标签
有一些布局需要在多处使用时,我们可以将其抽离成一个单独的布局文件,然后在需要的地方直接 include 即可,此类布局就可以使用 merge 标签,这个布局在附加到别的布局中时,merge 标签会自动删除掉,如果不使用 merge 标签,而是使用布局标签包裹,那么就会产生一层冗余的布局嵌套;
使用 ViewStub 标签
当布局中某个 view 或者 viewgroup 在特殊情况下才会显示时,我们可以使用 viewstub 标签,它不可见不占用资源,只有当我们设置为 visible 或者调用 inflater 方法时才会被初始化;
2、过度渲染
我们可以通过开启开发者模式的渲染选项查看是否存在过度绘制; 过度绘制一般采用考虑通过如下方式解决;
移除掉布局中不需要的背景
尽量使视图层级结构扁平化
3、布局加载优化
异步加载 可以通过使用 androidX 中的库进行布局的异步加载implementation "androidx.asynclayoutinflater:asynclayoutinflater:1.0.0"
new AsyncLayoutInflater(this).inflate(R.layout.activity_main, null, new AsyncLayoutInflater.OnInflateFinishedListener() {@Overridepublic void onInflateFinished(@NonNull View view, int resid, @Nullable ViewGroup parent){setContentView(view);//......
评论