From e1da728bb06e89c142a3536f6b50e3c273bc2ff1 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Thu, 13 Aug 2020 10:07:25 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=8F=A3=E6=B0=B4=E8=AF=9D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blogs/Android/口水话/性能优化口水话.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blogs/Android/口水话/性能优化口水话.md b/blogs/Android/口水话/性能优化口水话.md index b9af5b4..44c71d2 100644 --- a/blogs/Android/口水话/性能优化口水话.md +++ b/blogs/Android/口水话/性能优化口水话.md @@ -20,7 +20,7 @@ Apk 包主要分为几个部分,libs so 库、dex、res、assets、resources.a 这些和权限输出,我都写在一个插件里面了。 -除此之外呢,还有一些算是激进优化手段,但是我们并没有做。对于 libs so 库,可以选择只保留 arm64-v8a,基本上现在手机大多都是这个 CPU 架构;对于 dex 可以使用 Facebook 开源的 ReDex 进行 dex 重分包、去除行号信息;对于 resources.arsc 可以使用微信开源的 AndResGuard 对资源路径进行混淆;还有 R 文件内联等。 +除此之外呢,还有一些算是激进优化的手段,但是我们并没有做。对于 libs so 库,可以选择只保留 arm64-v8a,基本上现在手机大多都是这个 CPU 架构;对于 dex 可以使用 Facebook 开源的 ReDex 进行 dex 重分包、去除行号信息;对于 resources.arsc 可以使用微信开源的 AndResGuard 对资源路径进行混淆;还有 R 文件内联等。 #### 布局优化 @@ -30,7 +30,7 @@ Apk 包主要分为几个部分,libs so 库、dex、res、assets、resources.a 在写布局的时候,考虑是否有必要写布局,如果布局比较简单,是否可以选择直接 new,比如 RecyclerView 的 ItemView 可能就只是一个 TextView,这时 new TextView 显然比解析 xml 文件效率更高。如果要写布局文件了,考虑布局的复杂性,如果比较简单,FrameLayout 就行,如果布局比较复杂,可能导致嵌套过多,这时可以使用约束布局。同时为了后期维护性,我不建议使用线性布局。有时候,我们会封装一些控件放在系统控件里面,这时候就需要考虑是否可以 merge 最外层的布局。最后就是 ViewStub 延时初始化,基本上很少用。处理布局嵌套就这些,可以通过 Layout Inspector 来查看布局层级。 -接着是过度绘制,过度绘制可能是项目中遇到最多的了。首先记住最最重要的一点,就是在往顶层布局添加 background 时,一定要考虑是否有必要。我们的 Activity 的默认主题色是灰白色,如果 UI 图给的背景色是白色,基本上无一例外大家都会在顶层布局把 background 置为灰色,这就导致了一层过度绘制,解决办法很简单,再写一个主题即可。还有些系统控件,默认是有背景色的,可以指定 background 为 null 即可,典型的就是 AppBarLayout 了。其次呢,就是代码层面的了,能少绘制就少绘制。比如 RecyclerView 的局部刷新、还有在选中/非选中的场景下,需要注意重复点击已选中的 Item 的处理以及在本地筛选数据的情况下,利用数据缓存避免重复处理数据。过度绘制就这些,可以使用开发者工具打开过度绘制查看。 +接着是过度绘制,过度绘制可能是项目中遇到最多的了。首先记住最最重要的一点,就是在往顶层布局添加 background 时,一定要考虑是否有必要。我们的 Activity 的默认主题色是灰白色,如果 UI 图给的背景色是白色,基本上无一例外大家都会在顶层布局把 background 置为白色,这就导致了一层过度绘制,解决办法很简单,再写一个主题即可。还有些系统控件,默认是有背景色的,可以指定 background 为 null 即可,典型的就是 AppBarLayout 了。其次呢,就是代码层面的了,能少绘制就少绘制。比如 RecyclerView 的局部刷新、还有在选中/非选中的场景下,需要注意重复点击已选中的 Item 的处理以及在本地筛选数据的情况下,利用数据缓存避免重复处理数据。过度绘制就这些,可以使用开发者工具打开过度绘制查看。 除了上面比较常用的,还有一些优化手段可以考虑。比如使用 AsyncLayoutInflater 异步创建 View、使用掌阅开源的 X2C,这些都是建立在解析 Layout 是 IO 过程,创建 View 是通过反射为优化基础上的。