Android App 优化之 Layout 怎么摆

为了便于阅读, 应邀将Android App性能优化系列, 转移到掘金原创上来.
掘金的新出的"收藏集"功能能够用来作系列文集了.html

优化完App的启动速度, 接下来咱们要关注的就是UI布局怎么更高效了.android

欲善其事, 先利其器. 分析布局, 就不得不用到Hierarchy Viewer了.git

本文工具使用皆以GithubApp的详情界面RepoDetailActivity为例说明.
为了避免影响阅读体验, 对应的布局文件activity_repo_detail.xml的代码放在文末github

1, Hierarchy Viewer怎么用

Hierarchy发音 [美: 'haɪərɑrki] [英: 'haɪərɑːkɪ] 层次结构的意思.
以前一直念不顺这个单词Hierarchy, 就简称为H Viewer了. 下文就这么简称吧.性能优化

官网描述, H Viewer是用来分析调试和优化咱们的UI的一个图形化工具. 它会展现当前界面的View层级.app

1.1 启用H Viewer

比较早接触Android开发的同窗可能知道, H Viewer只能在root过的机器才能使用. 主要是在没有root过的机器中view server这个服务是没有开启的. H Viewer就没法链接到机器获取view层级信息.socket

正所谓高手在民间, 你们都尝试在未root的机器中启用view server来使用H Viewer. 最具表明性的就是romainguy的ViewServer, 只需集成少许代码到你的Activity, 至关于在手机端开启了view server服务, 创建socket通道与PC端的H Viewer通讯.ide

此工程被Android官网吸取, 做为开启H View的方案之一.工具

完整开启H Viewer的套路以下:布局

  1. 手机开启开发者模式, USB调试.
  2. 根据手机的Android系统版本:
    • 4.0及如下, 没有root. 使用上述的开源工程ViewServer提供的方式.
    • 4.0及如下, 已经root. 无需其余额外设置.
    • 4.1及以上. 须要在PC端设置ANDROID_HVPROTO环境变量.

设置系统环境变量: ANDROID_HVPROTO, 值为ddm
具体设置系统环境变量根据PC系统不一样而异.

作完上述配置后, 你就能够打开H Viewer了, 打开DDMS, 以下操做进入H Viewer界面:

ddms_open_hviewer

1.2 H Viewer界面详解

GithubApp的详情界面RepoDetailActivity为例说明:

Snip20160902_1

界面分为四个部分:

  1. Window
    显示当前链接的设备和供分析的界面. 可手动选择.

  2. Tree View
    树状图的形式展现该Activity中的View层级结构. 能够放大缩小, 每一个节点表明一个View, 点击能够弹出其属性, 当前值, 而且在LayoutView中会显示其在界面中相应位置.
    Tree View是咱们主要要分析的视图.

  3. Tree Overview
    Tree View的概览图. 有一个选择框, 能够拖动选择查看. 选中的部分会在Tree View中显示.

  4. Layout View
    匹配手机屏幕的视图, 按照View的实际显示位置展现出来的框图.

1.3 H Viewer参数解读

  1. 经过Tree View能够很直观的看到View的层级.
  2. 点击Tree View的RepoItemView这个节点:

关于三个小圆点的性能指示, 在App优化之性能分析工具一文中有提到, 再强调一遍:

三个小圆点, 依次表示Measure, Layout, Draw, 能够理解为对应View的onMeasure, onLayout, onDraw三个方法.

  • 绿色, 表示该View的此项性能比该View Tree中超过50%的View都要快.
  • 黄色, 表示该View的此项性能比该View Tree中超过50%的View都要慢.
  • 红色, 表示该View的此项性能是View Tree中最慢的.

若是你的界面的Tree View中红点较多, 那就须要注意了. 通常来讲:

1, Measure红点, 多是布局中嵌套RelativeLayout, 或是嵌套LinearLayout都使用了weight属性.
2, Layout红点, 多是布局层级太深.
3, Draw红点, 多是自定义View的绘制有问题, 复杂计算等.

由上图, 能够看到咱们的RepoItemView的三项指标都不合格, 证实其还有不少优化空间. 层级, 绘制均可以优化.

除了用H Viewer来作代码后分析, Android还提供了Lint, 在咱们编写xml布局文件时就即时的给出一些相关提示.

2, Lint tool

打开RepoDetailActivity的布局文件activity_repo_detail.xml, 在Android Studio菜单栏中开启Lint检查:

选择当前文件:

会在下方弹出分析结果:

分析结果包括用法检测(例如版本特有属性), 国际化(字符串是否提取到strings.xml, Rlt支持等), 以及咱们今天的主题---性能分析结果.

点开"Android -> Lint -> Performance"项, 能够看到关于布局性能的建议项. 此例中是说ScrollView的父级LinearLayout是没必要要的.

3, 怎么优化你的布局

经过以上工具的使用和分析, 也基本能找到布局的一些常见的好与很差的了.

正所谓授之以鱼不如授之以渔. 在此也就不太详细去讲怎么优化了, 几点建议, 你们自行实践吧:)

尽可能减小布局层级和复杂度

  1. 尽可能不要嵌套使用RelativeLayout.
  2. 尽可能不要在嵌套的LinearLayout中都使用weight属性.
  3. Layout的选择, 以尽可能减小View树的层级为主.
  4. 去除没必要要的父布局.
  5. 善用TextView的Drawable减小布局层级.
  6. 若是H Viewer查看层级超过5层, 你就须要考虑优化下布局了~

善用Tag


  1. 使用include来重用布局.

  2. 使用 来解决include或自定义组合ViewGroup致使的冗余层级问题. 例如本例中的RepoItemView的布局文件实际能够用一个 标签来减小一级.

ListView优化

  1. contentView复用
  2. 引入holder来避免重复的findViewById.
  3. 分页加载

4, 附示例代码

因github上的源码会持续更新, 特留对应代码在此.

activity_repo_detail.xml

 

  
  
  

 

    
  
  
  

 

        
  
  
  

 

            
  
  
  

 

            
  
  
  

 

                
  
  
  

 

                    
  
  
  

 

                    
  
  
  

 

                

                
  
  
  

 

            

            
  
  
  

 


                
  
  
  

 

                    
  
  
  

 

                    
  
  
  

 

                

                
  
  
  

 

            

            
  
  
  

 

                
  
  
  

 

            

            
  
  
  

 

                
  
  
  

 

            

        

    
复制代码

com.anly.githubapp.ui.widget.RepoItemView对应的布局:

 

  
  
  

 

    
  
  
  

 

        
  
  
  

 

        
  
  
  

 

        
  
  
  

 

            
  
  
  

 

            
  
  
  

 

        

        
  
  
  

 

        
  
  
  

 

            
  
  
  

 

            
  
  
  

 

            
  
  
  

 

                
  
  
  

 

                
  
  
  

 

            


        

    

    
  
  
  

 
复制代码

优化不一样于作功能, 可能分析的多, 出的成果少~ 比较枯燥, 然而优化也是App发展的必经之路, 欢迎你们分享经验.

相关文章
相关标签/搜索