Android性能测试插件————360 FireLine Plugin、LeakCanary

  360 FireLine Plugin是360团队针对安卓开发提供的一个功能插件,适用于对安卓APP安全检查规则。目前火线扫描规则共覆盖六大类:

 1. APP安全检查

 2. 代码规范检查

 3. 内存泄露检查

 4. 日志输出检查

 5. 空指针检查

 6. 多线程检查

提高开发效率必备!

例如:不合理的Activity组件导出会导致拒绝服务,以下是检查之前和之后的代码编写对比:


代码示例:

                                                   
                            @Override
                            protected void onCreate(Bundle savedInstanceState) {
                                super.onCreate(savedInstanceState);
                                setContentView(R.layout.activity_main);
                                
                                Intent i = getIntent();
                                String url = i.getStringExtra("url");//触发规则
                                
                            } 
                            
                            //同时AndroidManifest.xml文件中的该activity组件设置为导出
                            <activity
                                android:name="com.qihoo.test.activity.TestActivity"                                  
                                android:exported="true">                                
                            </activity>
                            
运行360 fireLine后出现的推荐写法:


                                                   
                            @Override
                            protected void onCreate(Bundle savedInstanceState) {
                                super.onCreate(savedInstanceState);
                                setContentView(R.layout.activity_main);
                                try{
                                   Intent i = getIntent();
                                   String url = i.getStringExtra("url");//触发规则
                                }catch{
                                    //捕获异常做自定义处理
                                }
                            }
                            
                            //AndroidManifest.xml中不需要导出的组件设置为不可导出。当组件需要导出时,进行权限验证或者身份判断。
                            <activity
                                android:name="com.qihoo.test.activity.TestActivity"                                  
                                android:exported="false">                                
                            </activity>
                            
有些时候可能不经意忘记关闭流的读写操作,而且程序能正常运行,但是内存却吃不消,例如:


描述:资源对象没有关闭。请确保输入输出流创建的对象在使用完成后进行了妥善的关闭处理。例如java.io.InputStream,java.io.OutputStream,java.io.Reader,java.io.Writer,java.util.zip.ZipFile,java.net.socket等类创建出的对象。

代码示例:

                                                   
                            InputStream in = null;      
                            InputStream in2 = null; 
                            try {
                                in = new URL("http://www.apache.org").openStream(); //触发规则
                                in2 = new URL("http://www.apache.org").openStream();//触发规则
                                
                            } catch (SQLException e) {
                                e.printStackTrace();
                            } 
                             
                        

推荐写法:

                                                   
                            InputStream in = null;      
                            InputStream in2 = null; 
                            try {
                                in = new URL("http://www.apache.org").openStream(); 
                                in2 = new URL("http://www.apache.org").openStream();    
                                
                            } catch (SQLException e) {
                                e.printStackTrace();
                            } finally {
                                IOUtils.closeQuietly(in);//工具类关闭
                                if(in2!=null){
                                    in2.close();//手动关闭
                                }  
                            }
                             
                        

强烈推荐LeakCanary

    简介:谁也不会喜欢 OutOfMemoryError,简称OOM。在处理大量的bitmap的时候,容易引发内存泄漏,其实不止在处理图片的时候发生,当有一系列对这个对象的引用,在该对象的生命周期结束的时候,还没有被系统回收掉,内存很快被耗尽,那就会造成内存泄漏,程序崩溃。

内存泄漏对策:利用MAT或者YourKit之类的内存分析工具反复查看发生泄漏的根源,并计算这个对象到GC roots的最短强引用路径,然后反复进行分析、修复。这工作量蛮大的。LeakCanary是Square公司开发的一款在程序未崩溃之前进行对程序内存泄漏检测的第三方开源类库,帮助你在开发阶段方便的检测出内存泄露的问题,使用起来更简单,如图这是一张内存泄漏后的显示报告,很优雅对吧。





 

LeakCanary在Eclipse中的使用:

       首先导入LeakCanary依赖,这里提供官网最新依赖的资源,http://filemarkets.com/fs/5ju9st6go288a82e67/

http://download.csdn.net/download/seeing_is_believing/9873941  

鼠标点击对应项目后,使用快捷键(Alt+Enter),或者选中项目,右键点击,选择Properties ,如图所示:



在自定义的Application中进行初始化操作:

[java]  view plain  copy
  1. public class InitApplication extends Application {  
  2. private RefWatcher refWatcher;  
  3.   
  4.   
  5. public static RefWatcher getRefWatcher(Context context) {  
  6.     InitApplication initApplication = (InitApplication) context.getApplicationContext();  
  7.     return initApplication.refWatcher;  
  8. }  
  9.     @Override  
  10.     public void onCreate() {  
  11.         // TODO Auto-generated method stub  
  12.         super.onCreate();  
  13.         refWatcher=LeakCanary.install(this);  
  14.     }  
  15. }  
当然你也可以直接在onCreate方法中写入:LeakCanary.install(this);

接下来配置清单文件:加入两个服务,一个Activity

 

[java]  view plain  copy
  1. <p style="background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"></p><pre name="code" class="java"><span style="color:#333333;"><application  
  2.        android:name=".init.InitApplication"  
  3.         android:allowBackup="true"  
  4.        android:icon="@mipmap/ic_launcher"  
  5.         android:label="@string/app_name"  
  6.         android:supportsRtl="true"  
  7.        android:theme="@style/AppTheme">  
  8.         <activityandroid:name=".MainActivity">  
  9.             <intent-filter>  
  10.                 <actionandroid:name="android.intent.action.MAIN" />  
  11.    
  12.                 <categoryandroid:name="android.intent.category.LAUNCHER" />  
  13.             </intent-filter>  
  14.         </activity>  
  15.   
  16.   
  17. </span><span style="color:#ff0000;"><strong><service  
  18.             android:name="com.squareup.leakcanary.internal.HeapAnalyzerService"  
  19.             android:enabled="false"  
  20.             android:process=":leakcanary" />  
  21.            
  22.           <service  
  23.             android:name="com.squareup.leakcanary.DisplayLeakService"  
  24.             android:enabled="false" />  
  25.             
  26.         <activity  
  27.             android:name="com.squareup.leakcanary.internal.DisplayLeakActivity"  
  28.             android:enabled="false"  
  29.             android:icon="@drawable/__leak_canary_icon"  
  30.             android:label="@string/__leak_canary_display_activity_label"  
  31.             android:taskAffinity="com.squareup.leakcanary"  
  32.             android:theme="@style/__LeakCanary.Base" >  
  33.             <intent-filter>  
  34.                 <action android:name="android.intent.action.MAIN" />  
  35.   
  36.   
  37.                 <category android:name="android.intent.category.LAUNCHER" />  
  38.             </intent-filter>  
  39.         </activity></strong></span><span style="color:#333333;">  
  40. </application></span></pre><span style="color:#333333"><br>  
  41. <br>  
  42. </span><p></p>  
  43. <pre></pre>  
  44. <pre name="code" class="java" style="color: rgb(51, 51, 51);"></pre><span style="color:#333333">代码中配置:</span>  
  45. <p></p>  
  46. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  47. 在setContentView(R.layout.activity_main)之后<br>  
  48. <span style="white-space:pre"></span> //内存泄漏检测<br>  
  49. <span style="white-space:pre"></span>//在内存泄漏方面还是leakcanary 和allocation tracker配合着使用最好,<br>  
  50. <span style="white-space:pre"></span>//leakcanary 能够确定对象是否还存活,allocation tracker确定对象分配位置。<br>  
  51.       </p><pre name="code" class="java">  RefWatcher refWatcher = InitApplication.getRefWatcher(this);  
  52.         refWatcher.watch(this);</pre><br>  
  53. <br>  
  54. <p></p>  
  55. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  56. 在onDestory()方法中</p>  
  57. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  58. <span style="white-space:pre"></span>   </p><pre name="code" class="java">  RefWatcher refWatcher = InitApplication.getRefWatcher(this);  
  59.             refWatcher.watch(this);</pre><br>  
  60. Eclipse的LeakCanary配置到此结束,可以运行测试了。<p></p>  
  61. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  62. <br>  
  63. </p>  
  64. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  65. LeakCanary在AndroidStudio中的使用:<br>  
  66. </p>  
  67. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  68.  首先在app中的Builde.gradle中加入:</p>  
  69. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  70. <span style="color:rgb(51,51,51); font-family:'Microsoft YaHei'; font-size:18px; line-height:24px; background-color:rgb(245,245,245)"></span></p><pre name="code" class="java">dependencies {  
  71.  debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' // or 1.4-beta1  
  72. eleaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' // or 1.4-beta1  
  73. testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' // or 1.4-beta1  
  74. }  
  75. </pre>其次与Eclipse配置不同的是无需修改清单文件,自定义Application和Activity中的用法同Eclipse,这里不再重复。<span style="color:rgb(51,51,51); font-family:'Microsoft YaHei'; font-size:18px; line-height:24px; background-color:rgb(245,245,245)"> </span><br>  
  76. <br>  
  77. <p></p>  
  78. <p style="text-align:left; font-family:'Microsoft YaHei'; font-size:18px; color:rgb(51,51,51); background-color:rgb(245,245,245)">  
  79. <br>  
  80. </p>  
  81. <p><span style="line-height:24px"><span style="color:#333333; font-family:'Microsoft YaHei'; font-size:18px; background-color:rgb(245,245,245)">       小结:在当下,编写代码越来越需要效率,编写后还要及时对代码进行审核,难免会有疏忽,如果这时有一个助手帮你调试,检查疏漏的地方,那么将大大提高开发效率,节省下来的时间,你可以去外面兜兜风也是不错的。</span></span></p>  
  82. <p style="font-size:18px"><span style="font-family:Microsoft YaHei; color:#111111"><span style="color:rgb(51,51,51); line-height:24px; background-color:rgb(245,245,245)"><strong><br>  
  83. </strong></span></span></p>  
  84. <p style="font-size:18px"><span style="font-family:Microsoft YaHei; color:#111111"><span style="color:rgb(51,51,51); line-height:24px; background-color:rgb(245,245,245)"><strong><br>  
  85. </strong></span></span></p>  
  86. <p style="font-size:18px"><span style="color:#111111"><span style="color:rgb(51,51,51); font-family:'Microsoft YaHei'; line-height:24px; background-color:rgb(245,245,245)"><strong><br>  
  87. </strong></span></span></p>  
  88.                       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值