Android代码优化和项目改进

代码优化

对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"
        }
    }
}

参考规则xml配置

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

待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,660评论 25 709
  • 1 背景 一个项目开发必然会涉及团队协作,而工程质量就需要团队去保证。一般我们期望的代码:无潜在风险、无重复逻辑、...
    zyl06阅读 8,419评论 5 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,486评论 19 139
  • 骤雨初歇秋蝉声声送离别 往事如风杯酒邀明月 难舍难分泪眼相看无语哽咽 落笔临帖情字怎么写 枫叶染红思念清秋知时节 ...
    夜已空阅读 1,300评论 2 6
  • 称量、过筛、搅拌……厨房里的我正在做蛋糕,相比于三年前的边看食谱边做,如今的我对于做蛋糕这件事可以说已经是得心应手...
    美未香阅读 3,499评论 3 7