Rootop 服务器运维与web架构

linux下sonar分析安卓代码

描述:
首先我这安卓项目是一个gradle项目,问开发类似于maven项目,可以直接用gradle打包。
而且不需要提前安装gradle,在代码中有配置下载gradle。
源码目录/gradle/wrapper/gradle/wrapper
#Mon Feb 05 11:27:19 CST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
可以看到gradle下载

# 安装java1.8 下载并解压… 过程略
配置java环境变量

[root@localhost ~]# vi /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

保存退出。
做一个java软连接,android sdk会去/usr/bin/下找java命令

[root@localhost ~]# ln -s /usr/local/jdk/bin/java /usr/bin/java

# android sdk 安装、解压并配置环境变量 /etc/profile 解压略…
# sdk下载地址 http://tools.android-studio.org/index.php/sdk
# http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
# 配置环境变量

[root@localhost android-sdk-linux]# vi /etc/profile
export ANDROID_HOME=/usr/local/android-sdk-linux
export PATH=$ANDROID_HOME/tools:$PATH

生效

[root@localhost android-sdk-linux]# source /etc/profile

# 查看所有的sdk

[root@localhost ~]# android list sdk --all

# 更新 sdk

[root@localhost ~]# ./android update sdk --no-ui

会提示接受授权,按Y回车。开始更新。

# 配置安卓源码下的 build.gradle 文件加入sonar插件

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
 repositories {
 jcenter()
 }
 dependencies {
 classpath 'com.android.tools.build:gradle:2.2.3'
 classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
 // NOTE: Do not place your application dependencies here; they belong
 // in the individual module build.gradle files
 }
}

// 下面是新加的 位置必须在buildscript{}下 注意sonar版本,结尾补充。
plugins {
 id "org.sonarqube" version "2.4"
}

apply plugin: 'org.sonarqube'

sonarqube {
 properties {
 property "sonar.projectName", "aladinn-v3-android"
 property "sonar.projectKey", "aladinn-v3-android"
 }
}
// 上面是新加的

allprojects {
 repositories {
 jcenter()
 maven { url "https://jitpack.io" }
 maven { url "https://maven.google.com" }
 }
}

task clean(type: Delete) {
 delete rootProject.buildDir
}
ext {

 supportVersion = '26.0.2'
}

# 配置安卓源码下的 gradle.properties 加入sonar服务器的配置

systemProp.sonar.host.url=http://sonar.xxx.com
systemProp.sonar.login=admin
systemProp.sonar.password=admin

# 在安卓源码下创建 sonar-project.properties 配置文件

# projectKey、projectName修改成你的项目名称
sonar.projectKey=aladinn-v3-android
sonar.projectName=aladinn-v3-android
sonar.projectVersion=1.0
# src---------修改成你的源文件夹路径,多个路径逗号隔开
sonar.sourceEncoding=UTF-8
sonar.sources=app/src/main/java
sonar.java.source=app/src/main/java
# binDir--------修改成你的二进制文件夹路径
sonar.binaries=app/build/intermediates/classes
sonar.profile=Sonar and Android Lint way
sonar.java.binaries=app/build/intermediates/classes
sonar.android.lint.report=app/build/outputs/lint-results-release-fatal.xml

这样3个配置文件配置好了,开始分析

[root@localhost aladinn-v3-android]# ./gradlew sonarqube --stacktrace

报错:

Warning: License for package Android SDK Build-Tools 26.0.2 not accepted.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> You have not accepted the license agreements of the following SDK components:
 [Android SDK Build-Tools 26.0.2]

这里有可能没有26.0.2的sdk

[root@localhost aladinn-v3-android]# android list sdk --all | grep "26.0.2"
 9- Android SDK Build-tools, revision 26.0.2
可以看到序号是<strong>9</strong>,安装它。

[root@localhost aladinn-v3-android]# android update sdk -u -a -t 9
-u是在命令行运行,-a所有 -t过滤,可以指定安装序号。多个用逗号分隔

# 再次执行上面分析命令 –stacktrace为了输出更多错误信息,方便排错。

[root@localhost aladinn-v3-android]# ./gradlew sonarqube --stacktrace

又报错:
Warning: License for package Android SDK Build-Tools 25.0.2 not accepted.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugApk'.
 > A problem occurred configuring project ':autoLayoutLib'.
 > You have not accepted the license agreements of the following SDK components:
 [Android SDK Build-Tools 25.0.2].
 Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
 Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html

这次提示 25.0.2 版本,还是搜索,再安装它。

[root@localhost aladinn-v3-android]# android list sdk --all | grep "25.0.2"
 13- Android SDK Build-tools, revision 25.0.2
[root@localhost aladinn-v3-android]# android update sdk -u -a -t 13

# 再次执行上面分析命令

[root@localhost aladinn-v3-android]# ./gradlew sonarqube --stacktrace

然后可喜可贺的就出现 BUILD SUCCESSFUL 了。

sonar服务器中也出现了代码分析结果。

注意:
可能会遇到sonar服务器返回500的错误,原因可能出现在mysql的 max_allowed_packet= 参数上。
我这里直接配置参数为max_allowed_packet=100M
改完重启mysql,重启sonar服务器

关于注意sonar插件版本问题:
开始用2.2版本插件,分析失败,换2.6版本也提示失败。
2.6的报错为:
* Exception is:
java.lang.NoSuchMethodError: com.android.build.gradle.api.ApkVariant.getCompileClasspath(Ljava/lang/Object;)Lorg/gradle/api/file/FileCollection;

提示没有这个方法。怀疑是sonar版本问题,降为2.5还是不行,最后用2.4成功。
具体的gradle和sonar版本对应关系没找到。如果提示类似错误,可以更改版本试试。
支持的版本:https://jcenter.bintray.com/org/sonarsource/scanner/gradle/sonarqube-gradle-plugin/

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4019.html

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

评论已关闭。