代码优化
对Bitmap的优化:
Android 提高代码质量-多种检测方案
lint
检测范围
- 潜在的bug
- 可优化的代码
- 安全性
- 性能
- 可用性
- 可访问性
- 国际化
插件使用
Android Studio 自带。
通过Gradle运行lint
- 注意:此时如果检测项目,应该把app的gradle配置,和module的gradle配置,加上如下结构,否则报错
android {
...
lintOptions {
abortOnError false
}
...
}
- Windows
gradle lint
- Linux 或 mac
./gradlew lint
- 单独检测模块文件或者某个目录
AS工程选择module,目录或者文件,右键选择Analyze----model----Inspect Code。然后配置就好了
具体查询文档即可,或者google搜索
findBugs
检测范围
针对java代码
- 常见的代码错误,序列化错误
- 肯能导致错误的代码,如空指针引用
- 国际化相关问题:如错误字符串转换
- 可能受到恶意攻击,如访问权限修饰符的定义等
- 多线程的正确性:如多线程编程时常见的同步,线程调度问题。
- 运行时性能问题:如由变量定义,方法调用导致的代码抵消问题
插件使用
AS 里面插件安装FindBugs-IDEA
添加plugin apply plugin:'findbugs'
定义任务,指定输出格式
参考文章
script 代码
task findbugs(type: FindBugs) {
ignoreFailures = false
effort = "default"
reportLevel = "medium"
excludeFilter = new File("${project.rootDir}/findbugs/findbugs-filter.xml")
classes = files("${project.rootDir}/app/build/intermediates/classes")
source = fileTree('src/main/java/')
classpath = files()
reports {
xml.enabled = false
html.enabled = true
xml {
destination "$project.buildDir/findbugs/findbugs-output.xml"
}
html {
destination "$project.buildDir/findbugs/findbugs-output.html"
}
}
}
不要忘记添加 findbugs/fingdbugs-filter.xml
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!-- ignore all issues in resource generation -->
<Class name="~.*\.R\$.*"/>
</Match>
<Match>
<Class name="~.*\.Manifest\$.*"/>
</Match>
</FindBugsFilter>
如果报错,添加如下节点即可解决
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!-- ignore all issues in resource generation -->
<Class name="~.*\.R\$.*"/>
</Match>
<Match>
<Class name="~.*\.Manifest\$.*"/>
</Match>
<Class name="~.*\.*Test" />
<!-- test classes are suffixed by 'Test' -->
<Not>
<Bug code="IJU" /> <!-- 'IJU' is the code for bugs related to JUnit test code -->
</Not>
</FindBugsFilter>
PMD
它跟Findbugs类似,但是它不是检测字节码,它是直接检测源代码。它使用静态分析来发现错误。它们的检测方法不同,可以取到互补的作用
检测范围
- 可能的bug——空的try/catch/finally/switch块。
- 无用代码(Dead code):无用的本地变量,方法参数和私有方法。
- 空的if/while语句。
- 过度复杂的表达式——不必要的if语句,本来可以用while循环但是却用了for循环。
- 可优化的代码:浪费性能的String/StringBuffer的使用。
插件使用与findBugs类似
task pmd(type: Pmd) {
ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")
ignoreFailures = false
ruleSets = []
source 'src'
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = false
html.enabled = true
xml {
destination "$project.buildDir/reports/pmd/pmd.xml"
}
html {
destination "$project.buildDir/reports/pmd/pmd.html"
}
}
}
CheckStyles
这个工具用来自动检测java源码。启动之后,可以按照制定的规则对java源码进行检查,被将所有的不符合规范的地方生成报告通知给你。
检测范围
- 注解
- javadoc注释
- 命名规范
- 文件头
- 导入包规范
- 尺寸设置
- 空格
- 正则表达式
- 修饰符
- 代码块
- 编码问题
- 类设计问题
- 重复、度量以及一些杂项
使用
导入plugin
apply plugin: 'checkstyle'
设置CheckStyle的版本
checkstyle {
toolVersion '6.1.1'
showViolations true
}
配置任务
task checkstyle(type: Checkstyle) {
ruleSetFiles = files("${project.rootDir}/checkstyle/zcw-checkstyle.xml")
ignoreFailures = false
ruleSets = []
source 'src'
include '**/*.java'
exclude '**/gen/**'
exclude 'androidTest/**'
exclude 'test/**'
}
未雨绸缪
主动提前添加资源国际化划分(即使你的程序很小,不可能发到国外,尽量提早支持,至少从架构和需求完整性考虑好的。一般中国,韩国,英语,香港,澳门 就够了)
对布局的动态管理和拆分提前做。
内存检测
工具
bugtags
LeakCanary
请求更新调优
Volley
OkHttp
Retrofit
HttpClient
待续。。。