APET-NPE插件工作原理

android应用程序编译的过程如下:

从图中,我们可以看出,app编译大致经历了四大阶段:java source files -> .class files -> .dex files -> .apk package 。分析这些阶段,我们兴奋的发现,过程中会产生.class文件,因此,可以借鉴字节码的思路来实现检测目标。

该插件的工作原理如下:

通过合理选择编译过程文件+改造findbugs,扫描过程文件(.class files)来实现NullPointerException检测。

PS:绿色部分为人机交互动作,接下来会详细描述。

怎么安装APET-NPE插件

1、入口链接
入口链接: http://tools.taobao.net/site/store/product_detail.htm?product_id=336
2、安装
方式一:
(1)使用eclipse的插件安装功能 Help -> Install New Software
(2)在Work with输入链接 http://tools.taobao.net/file/eclipsePlugin/eclipse/336/update_site
(3)勾选下面的apet,点next安装
(4)重启eclipse
建议取消 Contact all update sites during install to find required software的勾选,已提高安装速度。
注意:mac和ubuntu操作系统只能采用方式一安装,否则会导致eclipse无法启动!
方式二:
(1)确保eclipse处于关闭状态
(2)拷贝解压后的下载包,直接粘贴至 \eclipse 目录下
推荐使用方式一安装

3、修改eclipse配置(可选,但推荐做)

我们都知道,eclipse是内存大户,eclipse的启动配置,直接影响着它的运行速度和用户体验。因此,我们推荐大家使用以下配置:

(1)找到eclipse.ini文件,打开

(2)推荐删除 --launcher.XXMaxPermSize项,并修改-vmargs配置
==============
windows操作系统
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Dhelp.lucene.tokenizer=standard
-Xms512m
-Xmx512m
-XX:PermSize=96m
-XX:MaxPermSize=96m
-Xmn128m
-XX:+DisableExplicitGC
==============
==============
mac操作系统
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Dhelp.lucene.tokenizer=standard
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-Xms512m
-Xmx512m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-Xmn128m
-XX:NewRatio=8
-XX:+DisableExplicitGC
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
==============
==============
ubuntu操作系统
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Dhelp.lucene.tokenizer=standard
-Xms512m
-Xmx512m
-XX:PermSize=128m
-XX:MaxPermSize=256m
-Xmn128m
-XX:+DisableExplicitGC
==============

PS:经过测试,优化后的配置,比默认配置减少67.8%的FGC次数,有效提升eclipse速度和体验 :)

4、启动eclipse

怎么使用APET-NPE插件

很简单,操作分为四步进行:

1、打开bugs table视图:Window -> Show View -> Other -> Apet Category -> bugs table

2、选中目标项目/文件夹/文件,点击图标(可以关注 eclipse右下角的进度信息)

3、双击 bugs table 视图的 Description列,查看具体的NullPointerException代码

4、改代码,fix NPE bug

截图如下:

1、打开bugs table

2、选中检测对象,进行扫描

3、查看详细的问题代码

APET-NPE与官方findbugs的区别

有同学问到,按照字节码的思路,findbugs本身就可以扫描NullPointerException,为什么还要自己开发一套新插件呢? 这个问题提的非常好,年初我们也想直接用findbugs,但不能如愿,它本身的特性,限制了它在android领域的作用,最直接的一点,就是它无法直接扫描android代码。于是,jimmy也就应运而生了。

APET-NPE较官方findbugs而言,有以下优势,欢迎大家鉴定:

1、量身定制:我们改造了findbugs的逻辑,简化了android工程的扫描过程。同时在它上面封装一层业务代码,用来选择文件、记录文件路径、管理findbugs启动停止等;
2、支持多任务:APET-NPE能并行处理多任务,且结果视图更清晰易懂,bug描述中文化、简洁化,而官方findbugs只能一次处理一个任务(前提都是要import到eclipse中);
3、精简规则:使潜在缺陷的数量从“千数量级”降低到“10数量级”,提高开发、测试工程师的工作效率;
4、优化逻辑:从逻辑上做了优化,避免findbugs扫描过程中产生的过度消耗机器内存,eclipse挂起、无响应的现象,提高稳定性;
5、贴心推荐eclipse配置:充分优化eclipse.ini中-vmargs的配置,提升插件运行过程中的用户体验。

NullPointerException检测的更多相关文章

  1. APP漏洞扫描器之本地拒绝服务检测详解

    APP漏洞扫描器之本地拒绝服务检测详解 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确全面.本文将讲一下应用漏洞 ...

  2. java 空指针异常(java.lang.NullPointerException)

    在Java中对值为null的指针调用任何方法,就会引发空指针异常(java.lang.NullPointerException).空指针异常绝对 是Java中最难查找和调试的一种异常,你永远无法得到任 ...

  3. java.lang.NullPointerException错误分析

    java.lang.NullPointerException是什么错误 你使用了空的指针.在java中虽然号称抛弃了C++中不安全的指针,但其实他所有的东西你都可以理解为指针.这种情况一般发生在你使用 ...

  4. 空指针错误 java.lang.NullPointerException

    使用基本的JAVA数据类型,变量的值要么已经是默认值,如果没有对其正常赋值,程序便 不能通过编译,因此使用基本的JAVA数据类型(double,float,boolean,char,int,long) ...

  5. 安卓开发过程中空指针的问题Java.lang.NullPointerException

    最近做一个新闻客户端的应用,经常出现空指针的问题,我想一方面可能是自己水平有限,二是开发过程中有一些遗漏的地方.一般情况下新手出现空指针的概率较高.下面来总结一下经常出现的问题. 1.所谓的指针,就是 ...

  6. java.lang.NullPointerException 错误原因

    [http-nio-8081-exec-1] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] - Servlet.service() for ...

  7. JAVA可检测异常和非检测异常

    Java的可检测异常和非检测异常泾渭分明.可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则. 非检测异常不遵循处理或声明规则.在产生此类异常时,不一定非要采取任何适当 ...

  8. NullPointerException异常的原因及java异常??

    所谓空指针异常,是因为用空(null)去调用属性或方法.   null表示没有这个对象,既然没有这个对象,那么去调用他的属性和方法,就会报异常.   <--主要有以下几种原因:   1.使用了未 ...

  9. eclipse中。安装findbugs java检测工具

    问题提出: 当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价 ...

随机推荐

  1. CLR via C# 第五章学习记录(更新中)

    1.设置全局溢出检查,项目属性->生成->高级->检测运算上溢/下溢 2.局部使用溢出检测 Byte b = ; b = ));// 不检测溢出 checked// 检测溢出代码段 ...

  2. Netdata 是一款 Linux 性能实时监测工具

    具体的netdata介绍请参照GIT:https://github.com/firehol/netdata/wiki 以下只介绍centos下的netdata的安装与使用: 1.安装Netdata需要 ...

  3. Unity 自动寻路Navmesh之跳跃,攀爬,斜坡

    在之前的几篇Blog总,我们已经系统学习了自动寻路插件Navmesh的相关概念和细节.然而,如果要做一个场景精美的手游,需要用到各种复杂的场景地形,而不仅仅是平地上的自动寻路.今天我们将通过一个完整的 ...

  4. poj1088(記憶化搜索)

    題目鏈接:http://poj.org/problem?id=1088 題意:中文題誒- 思路:dfs,不過直接dfs因該會超時,那我們給他加個記錄路徑就好了... 代碼: #include < ...

  5. 洛谷P3959 宝藏(状压dp)

    传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ...

  6. Linux上安装Apache服务器

    http://httpd.apache.org/download.cgi httpd-2.4.29.tar.gz #创建httpd用户 groupadd httpd useradd -g httpd ...

  7. maven工程运行出Unable to compile class for JSP: 错误

    使用mvn tomcat:run运行时出现500错误,使用tomcat7再次运行就好了 更新,上面的是在命令行操作的 如果要在idea上面出现错误的话需要在pom.xml上配置下面的语句 org.ap ...

  8. appium desktop连接模拟器

    1.adb准备好,我建议,下载Androidstudio,因为这样adb是最新的,可能会避免很多问题 2.adb connect 127.0.0.1:xxxx (网易mumu是7555,别的模拟器自行 ...

  9. [Android基础]Android四大组件之BroadCast

    BroadCast的定义: 广播是一种订阅--通知 事件,广播接收者向Android系统 register (订阅广播),广播发送者向Adnroid系统 sendBroadCast(发送广播),然后A ...

  10. UVaLive6435(dp)

    要点 题意:两个数据传输数列,每个数列里有若干个数据包并给出发出时间\(t\),每个数据包到达的时间\(T\)是\(t <= T < t + D\),问有多少种到达序列. 将题目转化为第二 ...