Android Tools

- draw9patch

- lint

- hierarchyviewer

- traceView

- monkey







  工具存放路径:sdk/tools/





  draw9patch





  

    介绍:
  

  
  

    所谓”*.9.png”这是Android os里所支持的一种特殊的图片格式,用它可以实现部分拉伸;这种图片是经过”9妹“进行特殊处理过的,如果不处理的话,直接用PNG图就会有失真,拉伸不正常的现象出现。
  

  
  

    使用:
  

  
  

    双击打开看到
  

  
  

    ![](http://img.blog.csdn.net/20140917141621430?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
  

  
  

    然后将需要拉伸的图片直接拖进去进行拉伸,右侧是拉伸效果
  

  
  

    ![](http://img.blog.csdn.net/20140917142108860?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  

  
  

    左侧和上方的黑线交叉的部分即可扩展区域
  

  
  

    右侧和下方的黑线交叉的部分即内容显示区域(如做button背景图时,button上文字的显示区域)
  

  
  

    

      lint
    

    
    

      介绍:
    

    
    

      Lint 是Android ADT 16引入的优化工具,它可以扫描你的代码,帮助发现潜在的问题,例如:

1.文本国际化(有些文本缺少其它语言版本)例如:layout文件中编写不规范的地方,会给出提示。考虑到国际化,如果直接在xml中写汉字会提醒你把文字写到string配置文件中

           2.Layout的性能问题
    

    
    

           3.无用的多余的资源 例如:项目中有哪些资源文件引入了却没有在代码中使用的话,会给提示。既包括图片资源、layout文件,也有定义的String常量和Color常量等。考虑到屏幕适配,如果有些图片只在高分辨率中放置了,会提醒你应该在中低分辨率的文件夹下也应该放置一份。

4.不一致的数组大小(在配置文件中) 5.重复的图标,图片 6.可用性问题(如没有为EditText指定 InputType) 7. Manifest xml配置错误。

      使用:
    

    
    

      有两种使用方式:
    

    
    

      通过命令运行:
    

    
    

      lint 检查布局路径
    

    
    

      然后返回检测结果
    

    
    

      如图:
    

    
    

      ![](http://img.blog.csdn.net/20140917145229803?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    

    
    

      通过Eclipse直接运行:
    

    
    

      选中项目右键-》AndroidTools-》Run Lint
    

    
    

      ![](http://img.blog.csdn.net/20140917145930984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    

    
    

      运行之后显示错误:
    

    
    

      ![](http://img.blog.csdn.net/20140917150320308?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    

    
    

      双击错误,还能跳到指定布局位置,右侧是错误详解。
    

    
    

      

        hierarchyviewer
      

      
      

        介绍:
      

      
      

        <span style="color: #2c2c2c;">HierarchyViewer能够</span>可视化的角度直观地获得<span lang="en-us">UI</span>布局设计结构和各种属性的信息,帮助我们优化布局设计。(也可以查看其他App的布局)
      

      
      

        使用:
      

      
      

        打开hierarchyviewer显示了一个虚拟器
      

      
      

        ![](http://img.blog.csdn.net/20140917155910586?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
      

      
      

          选中一个进程的界面,点击Load View Hierarchy 这个按钮,以微信个人界面为例:
      

      
      

        ![](http://img.blog.csdn.net/20140917161701531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
      

      
      

        首先我们可以看到一个主布局,它下面的子布局是以树形的结构展示,看上去结构非常清晰.
      

      
      

        ![](http://img.blog.csdn.net/20140917162030437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
      

      
      

        接下来,我们在看看,子布局,可以从下图看到大家最喜欢的“摇一摇”功能条目,清晰的层级结构,以及控件的名称,还有效果图的展示,我们完全可以通过它给提供出来的数据,自己也实现这个布局,就算不去模仿他人的布局,我们也可以通过这个工具去分析我们自己的工程,这样可以更好及更快的找到我们需要优化的地方,进行布局优化。
      

      
      

        ![](http://img.blog.csdn.net/20140917162645592?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
      

      
      

        点击左下角的图标回到之前的操作界面界面,然后我们在选中微信进程,点击Inspet Screenshot 这个按钮.我们会看到
      

      
      

        ![](http://img.blog.csdn.net/20140917163339212?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
      

      
      

        从这个界面我们可以看到,控件的类名都已经一丝不挂了,这个界面,分为3部分,左边以树形结构显示布局类名,中间放大左边选中的区域以及,显示颜色值和坐标值,下面的工具条还能对选中区域进行所发,以及刷新频率。右边则可以通过鼠标随意移动,中间则实时刷新数据。
      

      
      

        细心的朋友可以能会发现,左下角,3个按钮现在可以随意切换了,三个按钮功能分别是,主界面,布局分析界面,截屏分析界面。
      

      
      

        traceView
      

      
      

        介绍:
      

      
      

        TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析。
      

      
      

              TraceView是图形化的工具,最终它会产生一个图表,用于对性能分析进行说明。
      

      
      

        TraceView可以跟踪到具体的Method
      

      
      

        使用:
      

      
      

        限制条件:
      

      
      

        
          - 对于Android 1.5及以下的版本:不支持。
          
          - 对于Android 1.5以上2.1下(含2.1)的版本:受限支持。trace文件只能生成到SD卡,且必须在程序中加入代码。
          
          - 对于Android 2.2上(含2.2)的版本:全支持。可以不用SD卡,不用在程序中加代码,直接自己用DDMS就可以进程Traceview。
          
        
        
        <div style="color: #362e2b;">
          我先演示一下,低版本的用代码,生成trace文件,然后打开分析。
        </div>
        
        <div style="color: #362e2b;">
          <div class="dp-highlighter bg_java">
            <div class="bar">
              <div class="tools" style="color: silver;">
                **[java]** [view plain](http://blog.csdn.net/cym492224103/article/details/39343907#)[copy](http://blog.csdn.net/cym492224103/article/details/39343907#)[print](http://blog.csdn.net/cym492224103/article/details/39343907#)[?](http://blog.csdn.net/cym492224103/article/details/39343907#)

                
                <div>
                </div>
              </div>
            </div>
            
            
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">package</span> com.example.traceviewdemo;  </span>
              
              - <span style="color: black;">  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.Activity;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.ActionBar;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.Fragment;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Bundle;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Debug;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.LayoutInflater;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.Menu;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.MenuItem;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.ViewGroup;  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Build;  </span>
              
              - <span style="color: black;">  </span>
              
              - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: blue;">extends</span> Activity {  </span>
              
              - <span style="color: black;">  </span>
              
              - <span style="color: black;">    <span class="annotation" style="color: #646464;">@Override</span>  </span>
              
              - <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onCreate(Bundle savedInstanceState) {  </span>
              
              - <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onCreate(savedInstanceState);  </span>
              
              - <span style="color: black;">        <span class="comment" style="color: #008200;">// 开始</span>  </span>
              
              - <span style="color: black;">        Debug.startMethodTracing(<span class="string" style="color: red;">&#8220;mytrace&#8221;</span>);   </span>
              
              - <span style="color: black;">        setContentView(R.layout.activity_main);  </span>
              
              - <span style="color: black;">        action();  </span>
              
              - <span style="color: black;">    }  </span>
              
              - <span style="color: black;">    <span class="annotation" style="color: #646464;">@Override</span>  </span>
              
              - <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onDestroy() {  </span>
              
              - <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onDestroy();  </span>
              
              - <span style="color: black;">        <span class="comment" style="color: #008200;">// 停止</span>  </span>
              
              - <span style="color: black;">        Debug.stopMethodTracing();    </span>
              
              - <span style="color: black;">    }  </span>
              
              - <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> action(){  </span>
              
              - <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">for</span> (<span class="keyword" style="font-weight: bold; color: blue;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < <span class="number" style="color: #c00000;">100000</span>; i++) {  </span>
              
              - <span style="color: black;">                System.out.println(<span class="string" style="color: red;">&#8220;模拟耗时&#8221;</span>);  </span>
              
              - <span style="color: black;">        }  </span>
              
              - <span style="color: black;">    }  </span>
              
              - <span style="color: black;">  </span>
              
              - <span style="color: black;">}  </span>
              
            
          </div>
          
          

            需要添加权限:
          

        </div>
        
        <div style="color: #362e2b;">
          <div class="dp-highlighter bg_html">
            <div class="bar">
              <div class="tools" style="color: silver;">
                **[html]** [view plain](http://blog.csdn.net/cym492224103/article/details/39343907#)[copy](http://blog.csdn.net/cym492224103/article/details/39343907#)[print](http://blog.csdn.net/cym492224103/article/details/39343907#)[?](http://blog.csdn.net/cym492224103/article/details/39343907#)

                
                <div>
                </div>
              </div>
            </div>
            
            
              - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">uses-permission</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.permission.WRITE_EXTERNAL_STORAGE&#8221;</span> <span class="tag" style="font-weight: bold; color: blue;">/></span>  </span>
              
            
          </div>
          
          

            执行完后,会在sd卡生成一个mytrace.trace文件
          

        </div>
        
        <div style="color: #362e2b;">
          ![](http://img.blog.csdn.net/20140917173106006?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
        </div>
        
        <div style="color: #362e2b;">
          <span style="color: #4b4b4b;">我们把它导出,然后使用命令行执行分析该文件:</span><span style="color: #4b4b4b;">traceView 文件地址</span>
        </div>
        
        

          

            <div>
              ![](http://img.blog.csdn.net/20140917173247017?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
            </div>
            
            <div>
              显示下图:
            </div>
            
            <div>
              ![](http://img.blog.csdn.net/20140917175000815?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
            </div>
            
            <div style="color: #4b4b4b;">
              从上图我们可以看到,MainActivity的action()是最耗时的方法,占用了95%的时候。如果在真实项目中,我们首先就是找到消耗性能的方法,然后对其优化, 还有很多属性大家可以看一下
            </div>
            
            <div style="color: #4b4b4b;">
              ![](http://img.blog.csdn.net/20140917175451646?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
            </div>
            
            <div style="color: #4b4b4b;">
            </div>
            
            <div style="color: #4b4b4b;">
              我们在看看,高版本不用代码如何使用traceView的做法
            </div>
            
            <div style="color: #362e2b;">
              使用DDMS
            </div>
            
            <div style="color: #362e2b;">
              打开devices窗口,选择某个进程,点击右上角的start method profiling
            </div>
            
            

              <blockquote style="color: #362e2b;">
                

                  &nbsp;
                

                
                

                  &nbsp;
                

                
                <div>
                  

                    运行app一段时间后,再点击已变成stop method profiling的该按钮。eclipse会自动弹出debug的标签(可通过菜单File->save as保存数据)。界面同上 面。
                  

                </div>
                
                

                  &nbsp;
                

                
                

                  &nbsp;
                

                
                

                  &nbsp;
                

                
                <div>
                  

                    这种方式不需要修改代码,所以对于没有源码的程序同样可以进行排查。同时可以方便的进行全局性能排查
                  

                </div>
                
                

                  &nbsp;
                

              </blockquote>
              
              

                monkey
              

              
              

                介绍:
              

              
              

                Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
              

              
              

                使用:
              

              
              <blockquote style="color: #362e2b;">
                

                  &nbsp;
                

                
                

                  基本语法如下:
                

                
                

                  &nbsp;
                

                
                

                  <span class="katex math inline">adb shell monkey [options]

                  
                  

                    &nbsp;
                  

                  
                  

                    如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:
                  

                  
                  

                    &nbsp;</span> adb shell monkey -p your.package.name -v 500
                  

                  
                  

                    &nbsp;
                  

                  
                  ## 命令选项参考 <wbr />