Android应用优化

目录

  1. 启动速度优化
    启动方式(热冷)
    界面优化(闪屏页)
    初始化(Application)

  2. 内存优化
    垃圾回收机制
    内存泄漏
    图片加载(Glide)

  3. 用户体验优化
    懒加载(界面+数据)
    加载状态
    缓存、PlaceHolder

  4. 其他

启动速度优化

启动方式:冷启动 / 热启动
界面优化:
1、启动:主要思想就是利用闪屏页,闪屏页的Theme可以设置windows的背景,android:windowDisablePreview 这个属性最好不要设为true,也就是点击app图标后,显示的第一个界面。
闪屏页的布局要尽可能简单,一般1s~2s后跳转到MainActivity,在这期间可以进行一些操作,比如网络请求或者初始化,比如网络请求获取升级、广告配置等,但是不能等网络请求回调后才跳转到主页,不能阻塞跳转流程,要处理好弱网和断网的情况。

ps:充分利用系统状态栏,以及刘海屏适配。

2、布局界面:
	1)性能消耗FrameLayout、LinearLayout < RelativeLayout。
	2)复杂界面使用约束布局,简单的不用嵌套的,使用相对或者线性布局,使用
	 < include > 标签复用,使用< merge >标签减少布局嵌套。	
	3)使用ViewStub实现界面懒加载。
	4)尽量少使用wrap_content,少用LinearLayout的layout_weight属性。
	5)避免重复的background。

初始化(Application):
1、懒加载,某些开源库按需延迟初始化
2、在闪屏页可以异步初始化一些初始化耗时长的类

内存优化

垃圾回收机制——可达性分析算法,
关于GCRoot:

a. java虚拟机栈(栈帧中的本地变量表)中的引用的对象。
b.方法区中的类静态属性引用的对象。
c.方法区中的常量引用的对象。
d.本地方法栈中JNI本地方法的引用对象。

Android中的内存泄漏——Activity销毁了,但是因为有其他对象仍持有activity的引用,导致activity对象无法被垃圾回收机制回收
如何优化:优化工具 LeakCanary :
https://mp.weixin.qq.com/s/zswNArUj8PqPXmVHMUUxuA
其他:
1、fragment使用viewBinding要在onDestroyView方法中置viewBinding为空
2、fragment使用recyclerview导致的内存泄漏

3、cursor、bitmap等使用完毕后要及时关闭

图片加载:一张图片被加载到ImageView上,它在内存中所占的大小?
drawable文件夹的分组(hdpi,xhdpi,xxhdpi),分别对应不同分辨率的设备,关于图片大小和占用内存详见:https://blog.csdn.net/guolin_blog/article/details/50727753
现在图片放在哪比较好,如果只有一套图片,最好放在xxhdpi文件夹下,两套的话就放在xhdpi(2x)和xxhdpi(3x)中。
此外,网络图片和Bitmap推荐使用Glide加载,Glide不止是使用起来方便,他还会根据你into的ImageView的大小来对图片进行压缩,然后在本地保存一个缓存,尽可能减少了图片占用内存的大小。
关于Glide缓存的一个坑,如果路径没变,但是图片变了,Glide仍旧会使用缓存,导致图片显示错误。

用户体验优化

懒加载
比较常见的就是Fragment的懒加载了,比如我经常使用Fragment+ViewPager来实现多Fragment布局,通过设置FragmentStateAdapter的RESUME_ONLY_CURRENT_FRAGMENT属性,可以设置只有可见的fragment才会resume,然后在fragment的resume方法中进行一些初始化工作。另外ViewPager的setOffscreenPageLimit可以设置ViewPager中划出页面的缓存数量,合理设置这个值对应用流畅度作用非常明显。
布局懒加载使用viewstub,比如某些页面,需要先从网络获取数据然后显示,就可以使用ViewStub来写特定的布局(还可以复用),在拿到网络数据后在inflate viewstub。

加载状态——找设计…

缓存 + PlaceHolder = Paging

下图为Google官方推荐的Android项目架构
Android架构

Paging在架构中的地位

Paging在架构中的状态

Paging的用法:见实例 https://github.com/yanghao2777/SimplePagingdemo

其他

1、代码结构优化——Lint
Analyze-> InspectCode
2、StrictMode
等待完成后的结果重点关注的部分:特定版本才有的API

之前在这里遇到过坑,即android api29才有的属性RelativePath用法不当,导致在29以下的版本卡在这里,也不会崩溃。

在这里插入图片描述

left和start的区别…;

字面意思

关于这部分,也可以通过开启Android的StrictMode,在编译时就可以检查出这些错误。

如果只是要去除没用到的资源,可以点击Analyze->Run Inspaction by Name… ,然后输入:unused resources,执行! 但是要注意,此方法检查出来的所有资源不一定是可以安全删除的,需要自己再确认一下

背景重复绘制
无用的import

删除无用的import,也可以通过AndroidStudio的
File->Setting->Editor->General->Auto Import,勾选Add unambigous imports on the fly(复制后自动添加import)和Optimize imports on the fly(自动清除无用import)来实现。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值