背景
随着应用程序代码越来越庞大,代码组件化也成了一个趋势,组件的生态也愈加丰富多彩,一个应用就可能同时接入众多组件。在组件的使用文档中都有相应的使用方法以及使用场景,其中的使用方法和场景是组件开发者希望的使用方式,然而对于使用组件的应用开发者来说,不一定完全按照组件提供的方式去接入,这样可能就会出现问题:降低程序的健壮性;严重时甚至出现bug。而对于不合理接入组件造成的问题,一般是通过下面2种方式去降低,但不能避免:
- 多次调试应用程序,自测尽量覆盖到每个分支,减少组件问题发生的概率;
- 进行代码Review,希望通过其他同事在代码审查时,尽早发现使用组件的问题。
于是,本文提出一种可以很好解决这个问题的方法,简单来说就是,一种基于模板代码匹配检测组件规范化使用的方法。
解决的问题:解决应用开发者未按照组件规范化使用方式(即:未使用组件开发者提供的组件接入方式),导致的程序bug和程序的不健壮性等问题。
模块定义
应用程序模块:是指接入多个组件,并使用组件代码的应用;
组件模板代码模块:是指组件开发者提供的组件使用模板代码,针对于不同组件有不同模板代码;
模板代码匹配模块:是指利用静态代码规范扫描工具如lint,检测是否使用了和组件模板代码一样的顺序和方式的代码;
规范化检测模块:通过输入应用程序模块代码,以及组件模块模板代码,然后利用模板代码匹配模块进行检测。
技术详解
模板代码匹配原理
描述:此处探讨下模板代码匹配的实现原理,避免因缺少技术特征,进一步导致无法知晓方案如何实施的发生。模板代码匹配主要是利用静态代码规范扫描工具如lint,检测是否使用了和组件模板代码一样的顺序和方式的代码,并将匹配结果输出。使用lint工具实现的具体步骤如图1所示:
步骤1:将模板代码放到自定义lint检查规则里面,生成jar或aar,进行步骤2;
步骤2:将自定义lint检查规则jar或aar引入到项目中,进行步骤3;
步骤3:对项目执行lint检查,得出结论。参考
图1 模板代码匹配原理
场景1:应用接入单个组件的场景
描述:如图2所示,针对于接入单个组件的应用程序模块,首先需要获取组件模板代码和应用程序代码,并将其输入组件模板代码模块和应用程序模块,然后运行规范化检测模块,而规范化检测模块内部调用模板代码匹配模块,输出该组件规范化使用的检测结果。
步骤1:获取组件的模板代码,并将其输入组件模板代码模块,进行步骤2;
步骤2:获取应用程序的代码,并将其输入应用程序模块,进行步骤3;
步骤3:将组件模板代码模块和应用程序模块,输入规范化检测模块,进行步骤4;
步骤4:规范化检测模块调用模板代码匹配模块,进行步骤5;
步骤5:模板代码匹配模块运行,输出匹配结果,进行步骤6;
步骤6:规范化检测模块处理匹配结果,如果匹配成功,则检测成功,结束;否则,检测失败,进行步骤7。匹配结果展示可有如下2种:(1)标记应用程序模块使用到组件代码但未成功匹配代码的代码段,直观形象展示给应用程序开发者,并将组件模板代码在标记处附上,方便应用开发者修改;(2)匹配成功,文本显示组件匹配成功即可。由于匹配结果展示不属于本文的核心点,就不在此展开来讲。
步骤7:对于匹配结果为FALSE的应用程序,在应用开发者修改后,可从步骤1开始再次检测,否则直接结束。
图2 应用接入单个组件的场景
场景2:应用接入多个组件的场景
描述:如图3所示,针对于接入多个组件的应用程序模块,首先也是需要获取多个组件的模板代码和应用程序代码,并将其输入组件模板代码模块和应用程序模块,然后运行规范化检测模块,在规范化检测模块内部调用模板代码匹配模块,输出该组件规范化使用的检测结果。接入多个组件和单个不同的是,在检测时会针对于多个组件做匹配,其他步骤是一样的。
步骤1:获取多个组件的模板代码,并将其挨个输入组件模板代码模块,进行步骤2;
步骤2:获取应用程序的代码,并将其输入应用程序模块,进行步骤3;
步骤3:将组件模板代码模块和应用程序模块,输入规范化检测模块,进行步骤4;
步骤4:规范化检测模块调用模板代码匹配模块,进行步骤5;
步骤5:模板代码匹配模块采用循环运行,从组件模板代码模块获取每个组件的模板代码,对其进行模板代码匹配,保存每个组件匹配结果,进行步骤6;
步骤6:模板代码匹配模块输出整体模板代码匹配结果,进行步骤7;
步骤7:规范化检测模块处理匹配结果,如果匹配成功,则检测成功,结束;否则,检测失败,进行步骤8。匹配结果展示如场景1所述,由于匹配结果展示不属于本文的核心点,就不展开来讲了。
步骤8:对于匹配结果为FALSE的应用程序,在应用开发者修改后,可从步骤1开始再次检测,否则直接结束。
图3 应用接入多个组件的场景