APP性能优化-Memory
APP性能优化-稳定性(crash率)
APP性能优化-包体压缩
APP性能优化-CPU
APP性能优化-UI
APP性能优化-流畅度
前言
Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成;但是如果主线程执行一些太耗时操作,或者主线程短时间内需要执行太多任务,操作周期超过16ms,就会导致丢帧,32ms内看到的是同一帧。为了流畅度就不能让CPU太过于繁忙。
优化思想
1.少做、提前做、分散做、延迟做、异步做
2.提升硬件功率
优化工具
TraceView
:停留在Eclipse时代的工具;两种触发方式:1.DDMS触发;2.代码中开始点写上Debug.startMethodTrace() ,结束点写上Debug.stopMethodTrace(),运行应用后,导出生成在存储卡根目录的trace文件,然后在DDMS里面打开
CPU Profiler
:Android Studio集成工具,自定义分析范围
CPU Profiler优化CPU
假设用户点击跳转视频播放页面,播放器页面可能会涉及到以下操作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
initVideoSdk();
startPlayVideo();
initScreenOrientation();
initAudioChange();
reqeustPageData();
reqeustComments();
requestRecommendVideo();
}
//初始化视频sdk
public static void initVideoSdk(){
try {
//模拟视频SDK初始化时间
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始播放视频
private void startPlayVideo(){
try {
//模拟拉起视频播放耗时
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//请求页面数据
private void reqeustPageData(){
try {
//模拟页面刷新耗时
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//请求评论数据
private void reqeustComments(){
try {
//模拟评论适配器刷新耗时
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//请求推荐视频
private void requestRecommendVideo(){
try {
//模拟推荐视频刷新耗时
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//监听屏幕旋转
private void initScreenOrientation(){
try {
//模拟监听屏幕旋转初始化耗时
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//监听生命周期释放、获取音频权限
private void initAudioChange(){
try {
//模拟音频监听初始化耗时
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
上面是通过伪代码模拟各个操作的耗时,profiler一下当时CPU的情况


页面的初始化就耗费了1s,这里只是伪代码,实际情况可能更差,同时CPU使用出现了抖动,那实际反馈给用户的就是
页面打开慢
,而且在这段时间内响应不了用户操作,这样给用户的体验不是很好,对以上步骤稍作调整
1.initVideoSdk():完全可以提前初始化,比如application或其他合适时机
2.除reqeustPageData()外,reqeustComments()、requestRecommendVideo()这种在页面实际是由上到下的列表展示方式,可以按照顺序改成串行
执行,或者delay
执行,
3.initScreenOrientation()、 initAudioChange()一开始没有必要初始化,几乎没人会在进页面1s就进行转屏操作,这类可以延迟初始化
关于CPU的优化只是抛砖引玉,这里只是给出个思路,更多优化需要针对具体业务以及页面结构进行具体优化
提升硬件功率(Hardcoder)
部分厂商会针对部分APP做一些小改动,其中比较典型的就是“暴力提频”。系统在识别到目标APP启动,页面切换等场景时,会粗暴地提高 CPU 频率,从而提升 APP 运行的性能。Hardcoder
需要跟厂商合作,需要申请权限,加入白名单,感兴趣的可以去研究下 http://github.com/Tencent/Hardcoder.git
网友评论