Android项目源码质量检测

从开发的角度来讲,一款软件的优秀与否,除了与软件整体架构有关,还决定于开发者的编码是否规范以及能否对相关平台特性的充分利用。对于软件的整体架构, 目前阶段我们只能依靠开发者的经验,去构建良好的架构。对于编码是否规范以及平台特性的使用,除了开发者的编码经验,我们还可以依赖一些工具来对我们编写 的源码进行检查,来提高代码的质量。本文将以Android为平台,对三种代码质量检查的工具进行介绍。

 

 

一、Android SDK中自带的StrictMode(限制模式)

 

        最新的Android平台中(Android 2.3起),新增加了一个类,叫StrictMode(android.os.StrictMode),这个类可以用来帮助开发者改进他们编写的应用,并 且提供了多种策略,这些策略能及时的检查应用中存在的问题。

 

        我们可以在项目的开发测试阶段,将项目ProjectBuild Target改为Android2.3或2.3以上,使用系统提供的StrictMode(限制模式)来进行开发测试,并使用 StrictMode给我们提供的多种限制策略,进行单个线程,或者整个jvm的监测,例如,我们通过使用ThreadStrictMode对磁盘读写和 网络进行检测,当程序运行过相关的代码后,我们就可以得到所有读写磁盘和访问网络所消耗的时间,进而是我们得知项目当中哪些地方耗时过长,我们就可以在那 些不合理的地方进行优化。


        StrictMode还给我们提供了多种形式的策略违背输出,例如log日志,运行时弹出对话框等模式。StrictMode的使用也是非常简单。例如, 你想对UI线程中的读磁盘进行检测,你只需要在主线程当中Activity的onCreate方法加入以下代码即可:

StrictMode.setThreadPolicy((newStrictMode.ThreadPolicy.Builder()).detectDiskReads().penaltyLog().penaltyDialog().build());


        当有读取磁盘的时候便会在log中输出以下内容(并且会在正在运行的模拟器或手机上弹出对话框,提示当前程序有策略违背):

10:03:56.122: DEBUG/StrictMode(16210): StrictMode policy violation; ~duration=696 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2 


        同样,当对Activity对象进行检测,Activty对象内存泄漏的时候,便会在log当中输出如下内容:

05-17 09:45:24.835: E/StrictMode(566): class com.alipay.StrictModeDemoActivity;instances=2; limit=1

05-17 09:45:24.835: E/StrictMode(566):android.os.StrictMode$InstanceCountViolation: classcom.alipay.StrictModeDemoActivity; instances=2; limit=1

 

        目前,StrictMode给我们提供了两大类的策略,一类是对于当前线程的监控(Disk Reads、Network access等),另外一类是关于VM虚拟机等方面的监控策略(内存泄漏的Activity对象和SQLite对象)。

 

        但通过项目实践,发现如果想通过StrictMode来保证代码的质量,是远远不够的,一是StrictMode检测到策略违背时输出的log日志包含的 信息是有限的,二是现在给我们提供的检测策略种类还不够多。但是值得欣慰的是,从API Level10到15,我发现Google也在不断的完善StrictMode这个工具类,相信在不久的将来它的作用一定会越来越重要。


 

二、ADT自带的Lint工具

 

        在Eclipse的ADT插件更新到最新的16.0及以上版本,内部集成了一个名为Lint的工具。Lint工具能够专门针对Android工程项目进行全面的分析,包括项目内的资源文件、布局文件和静态代码进行检查,检查结果如下图:



 

 

        下面列举一些项目检查过程中发现的典型问题:

 

1)代码中的字符串没有进行全球化处理。

提示信息: "AboutVersionName" is not translated in en

 

2 不同命名的两个图片文件,具有相同的图片内容,资源冗余。

提示信息:The following unrelated icon files have identical contents: alipay_contact_normal.9.png, alipay_qrcode_normal.9.png

 

3)xml布局文件或描述文件当中的一些比较典型的警告信息

提示信息:The id "AlipaySubTitle" is not referring to any views in this layout

提示信息:<uses-sdk> tag appears after <application> tag

 

4)布局文件的优化

提示信息:This <Framelayout> can be replaced with a <merge> tag

 

5)代码的高效性

用Android API中性能更好的SparseArray来代替HashMap。

Use new SparseArray<String>(...) instead for better performance

 

6)低性能的源代码:

mBackImgMap.put("0",new Integer(R.drawable.basic));

优化之后的源代码:

mBackImgMap.put("0",Integer.valueOf(R.drawable.basic));

最好不要直接调用包装类的构造函数,而用valueOf方法来替代他,这样有助于程序更高效的执行。

提示信息:Use Integer.valueOf(R.drawable.basic) instead

 

7)避免在manifest.xml文件中对debug属性进行硬编码,

提示信息:Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one

 

        美中不足的是eclipse插件形式的Lint工具还没有导出错误报告的功能。

 


 

三、JAVA代码质量检测工具PMD

 

        最后一个介绍的工具是PMD,相对于前两种代码质量检测工具,它不是专门给android编程定制的工具,PMD最大的优势在于它能够依据java通用的 编码规范检测出代码当中编码不规范的地方,在通用的编码过程中,它的作用明显要比前两种工具更广泛,而且检查更加严格。

 

        首先在自己的电脑中安装PMD工具(我安装的是eclipse的PMD插件,推荐大家以这种方式来安装,用起来更加傻瓜式一些,当然专家级的朋友可以安装PMD的独立客户端,详细资料请参考http://pmd.sourceforge.net/rules/java/strictexception.html)。

 

        下面结合当前项目中的部分实际代码来进行对PMD工具的实践:

        在eclipse中选中当前项目,点击右键->PMD -> check code with PMD

就会在项目源码中加入不规范的提示信息,我们也可以以报告的形式导出这些不规范的编码列表,当然导出报告的形式有多种,如下图reports文件夹:



 

        下面结合代码当中的一些不规范代码来进行具体说明:

1)sourceCode:packagecom.alipay.android.appHall;

problem: src/com/alipay/android/appHall/AppHall.java:1        Package name contains upper casecharacters

包的命名需要用小写字母。

 

2)sourceCode:

public void onItemClick(AdapterView<?>parent, View arg1, int index, long arg3) {

                AppItemInfo itemInfo = mAppItemInfos.get(index);

                itemInfo.onClick(mContext);

           }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值