导读: Infer的安装教程,包括docker镜像安装和linux编译源码两种安装方式。

介绍

Infer是Facebook一款开源的静态分析工具。Infer可以分析Objective-C,Java或者C代码,重点作用于分析APP(Android/iOS)项目,报告潜在的问题。Infer已经成为 Facebook 开发流程的一个环节,包括Facebook Android和iOS主客户端,Facebook Messenger,Instagram在内的,以及其他影响亿万用户的手机应用,每次代码变更,都要经过Infer的检测。

Infer相比其它静态分析工具的优点:

    是一款开源静态的代码分析工具; 效率高,规模大,几分钟可以扫描数千行代码; 支持增量及非增量分析; 分解分析,整合输出结果。Infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分析的深度和速度。

Infer捕捉的bug类型:

Resource leakNull dereferenceResource leakMemory leakNull dereferencePremature nil termination argumentRetain cycleParameter not null checkedIvar not null checked

资源

    Infer的Github地址 Infer的官方网站(需翻墙) Infer的官方安装教程(需翻墙) Infer的release版下载地址 Infer的example使用教程 Infer中文版帮助文档(部分已过时)

本文使用docker和linux两种方式安装,推荐使用linux安装。
安装时间为2017.06.20,版本为0.12.0。

1. 使用Docker镜像安装

注意事项

    Docker可以在win及linux双平台安装,本文使用win7 64位。使用此方法需会使用docker,本人也是第一次使用,如有错误之处欢迎指正。 安装过程需要联网并下载约1.5G数据,请确保网络状况良好且本地硬盘空间足够,且尽量不要在有代理的环境中安装。 如果系统开启了Hyper-V,需要在控制面板-程序-打开或关闭Windows功能中关闭。

安装过程

dockerVirtualBoxGit%HOME%\\.docker\machine\cacheDocker Quickstart Terminaldefault%HOME%\\.docker\machine\machinesdocker-machine create --driver virtualbox testtestdocker machine192.168.99.100docker-machine lsdocker-machine start defaultSSH工具192.168.99.100docker/tcuserinferdocker images
wget -O Dockerfile https://raw.githubusercontent.com/facebook/infer/master/docker/Dockerfile
wget -O run.sh https://raw.githubusercontent.com/facebook/infer/master/docker/run.sh
sh run.sh```
8. 使用infer。执行指令`docker run -it infer`启动一个容器。启动后会自动进入infer的examples目录,如果没有可以执行`cd /infer/examples`。直接执行`infer -- javac Hello.java`可以看到分析java文件的结果。执行`cd android_hello;infer -- ./gradlew build`可以看到分析安卓项目的结果。
9. 扫描自己的安卓项目。由于源码是放在win中的,而infer是在docker里面的,所以要扫描自己的项目则需要将源码放进docker容器中。首先打开VirtualBox找到default,右键-设置-共享文件夹,在右侧找到添加共享文件夹的图标,选择存放源码的本地目录,再给共享文件夹取一个名称(如files),勾选自动挂载和固定分配,重新启动default后连接上去,切换到根目录下即可看到共享的文件夹。执行`docker run -itd infer`在后台启动一个容器,执行`docker ps`查看所有正在运行的容器,执行`docker cp /<源路径> 容器ID:/<目标路径>`将源码从docker复制到容器中,执行`docker attach 容器ID`进入容器,找到cp时的目标路径即为源码,再将源码替换掉example目录里面的文件,使用相同的指令即可扫描。另外,docker容器关闭后不会保存里面新增或修改的文件,若需保存至镜像中,需执行`docker commit 容器ID infer:latest`。

## 2. 使用Infer源码安装
>源码安装时不同的操作系统略有不同,可参考官方教程。我的操作系统为ubuntu14.04_64位。安装过程中可能会有一些报错,但是我忘记记录了,如有问题可联系我。

1. 安装依赖。可参考官方github-[How to install Infer from source](https://github.com/facebook/infer/blob/master/INSTALL.md#pre-compiled-versions),ubuntu14执行:`sudo apt-get install -y autoconf automake build-essential git libgmp-dev libmpc-dev libmpfr-dev m4 openjdk-8-jdk pkg-config python-software-properties unzip zlib1g-dev`
2. 前往Infer的github中下载最新的release版,[下载地址](https://github.com/facebook/infer/releases)
3. 下载完成后依次执行如下指令,其中的文件名替换为下载的文件名

tar xf infer-.tar.xz cd infer-/ ./build-infer.sh java make install```

infer -- javac Hello.java
    android sdk tools android sdk platform-tools android 5.1.1(API22)(必须22版) 中的 sdk platform android support repository
https://services.gradle.org/distributions/gradle-3.4-bin.zipexpamle/android_hello/gradle/wrappergradle-wrapper.propertiesdistributionUrl=gradle-3.4-bin.zipinfer -- ./gradlew build./gradlew clean

docker安装过程较为容易,但是使用起来较为麻烦; linux安装过程问题比较多,但是后续使用起来要容易一点。