Gradle传递System Property

最近在搭建Jenkins环境,实现Android自动化编译的过程中,由于内网服务器不能访问外网,因此只能配置Robolectric访问内网的服务器。

根据官方文档 Configuring Robolectric,发现如果要更改Robolectric默认的下载服务器链接地址,需要在项目的每个lib库中都配置如下参数,才能实现:

但是这样配置有一个问题,就是没办法动态调整链接地址。

而我们使用

手工指定的参数,并没有在编译的时候生效。

参数丢失的原因是因为测试用例在新的JVM中执行,传入的参数不会自动带给新创建的JVM

这时需要在Gradle脚本中将读到的值重新设到系统属性里面,才可以被Java程序读到。

每个项目的build.gradle中都增加上面的配置之后,就可以保证在外部编译的时候动态指定参数了。

参考链接


Gradle本站镜像

使用Android Studio开发,最痛苦的其中一项是Maven下载数据缓慢,目前已经可以根据在Ubuntu 14.04 系统中的Apache Tomcat上部署Apache Archiva 2.2.1来使用本站的代理服务器的方式进行提速了。另一个痛苦的事情就是下载Gradle工具包的速度异常缓慢了,不仅慢,而且还容易失败。
目前本网站已经提供了Gradle工具包的下载代理,具体的操作就是把services.gradle.org进行域名污染,指向本站的IP地址121.199.27.227
Windows下的解决方法为修改C:\Windows\System32\drivers\etc下的hosts文件,里面增加如下内容:

接着修改Android Studio项目下的gradle\wrapper\gradle-wrapper.properties文件,把其中的

修改为:

注意,上面的修改其实主要是把HTTPS修改成了HTTP,原因在于HTTPS无法进行域名污染。

当然,另外一个比较简单的修改方式为,只要修改distributionUrl为本站地址,更加省事:

目前本站提供的Gradle工具包版本如下:

Android Studio(Gradle)解决库依赖冲突问题

最近在调整代码的时候,出现如下问题:

网上查询了一下,找到如下的解决方法:

我们常常用gradle.build文件导入依赖库,但是有时候库依赖会发生版本冲突或多个模块依赖同一个库的情况。

这就引出两个问题,如下:

  • 版本冲突时,Gradle会下载多个版本的依赖库吗?
  • 当多个模块依赖同一个库时,每个模块都会去下载该依赖库吗?
    为解决这疑问,接下来我们在Android StudioGradle举个例子:
    gradle.build依赖部分的配置:

在文件目录下或Android StudioTerminal下敲gradlew -q app:dependencies 命令,便有以下输出:

可以看出:com.android.support.test:runner:0.3 这个模块原本是依赖于com.android.support:support-annotations22.2.0版本,但由于你又在gradle.build中加了这行androidTestCompile 'com.android.support:support-annotations:22.2.1'gradle就会下载com.android.support:support-annotations22.2.1版本,而不会去下载com.android.support:support-annotations22.2.0版本,因此com.android.support.test:runner:0.3 就会被强转变依赖于com.android.support:support-annotations22.2.1版本
第二个问题,我还是利用上面gradle命令行打出的信息来看看:

仔细看上面的依赖,com.android.support:appcompat-v7:22.2.1com.android.support:design:22.2.1,有共同依赖一个com.android.support:support-v4:22.2.1库,且com.android.support:design:22.2.1 依赖于com.android.support:appcompat-v7:22.2.1,但从打印出的信息可以看出com.android.support:design:22.2.1 依赖两个库的信息被打了星号标记,这标记意思是忽略这两个依赖的意思,也就是说不去下载这两个库。
从上面的两个例子来看,gradle对于需要多个版本的依赖库来说,一般只会下载你配置导入那个版本,如果没有手动导入,那就会下载所有模块依赖的最新版本那个库,面对多个模块依赖同一个库,每个模块不都会去下载该依赖库,而是下载一个该依赖库,共享给多个模块。
修改配置文件为:

打印信息:

比较上面两种配置compile信息部分,后面一种配置的 com.android.support:design:22.2.1 就没有输出两个打星号的依赖库信息了。
因此遇到这两种情况是,是gradle能自动帮我们解决掉了这两种情况,对于如何使用gralde命令行查看库依赖(depends)请看官方文档

参考链接


gradle 管理依赖库两个问题

Windows下搭建基于Jenkins+Git+Gradle的Android持续集成

下载Jenkins


官网下载,如果官网下载存在问题,也可以在本站下载Jenkins

下载Gradle


目前Android Studio支持的是Gradle 2.8版本,因此下载2.8版本的即可。Gradle 2.8,也可以本站下载

安装Tomcat


官方主页Apache Tomcat。Windows下面建议下载32-bit/64-bit Windows Service Installer版本。
DownloadTomcat9

安装Jenkins


将下载的jenkins.war包直接放到tomcat下的webapps目录,启动tomcat,在浏览器输入:http://127.0.0.1:8080/jenkins

安装Git plugin,Gradle plugin,Android Lint Plugin插件


点击Jenkins首页的"Manage Jenkins"链接,如下图:
ManageJenkins

进入设置,点击"Manage Plugins",添加Git plugin,Gradle plugin,Android Lint Plugin

ManagePlugins在打开的页面中,搜索并且安装插件

PluginManagerInstall

系统配置


返回首页,点击" Manage Plugins",然后进入页面中选择Configure System,配置JDK,Gradle,Git的选项。

JenkinsConfigure
设置JDK
SettingJava

SettingJavaManual

新建项目


首页点击"创建一个新任务",如下图:
NewJenkinsJobs
在接下来的页面中,输入工程的名字,并且选择"Freestyle project"

NewJobsCreateSelect
设置Git中源代码的路径,如果是使用SSH证书认证的登陆,则在Credentials中进行配置,如下图:

JenkinsJobAndroidConfigureGitNew

接下来配置触发构建的条件,目前我们设置为每天晚上3点,注意里面输入的是H 3 * * *,每个字符之间都有一个英文的空格。

JenkinsJobAndroidConfigureTrigger

接下来,配置Gralde的编译,在构建项目中选择"Invoke Gradle Script",如下图:
InvokeGradleScript
在选项的Tasks栏目中输入clean build --stacktrace --debug,如下图:

InvokeGradleScriptTasks
接下来,配置构建后操作,一般增加Publish Android Lint results,Archive the artifacts这两项即可,具体的配置参考下图:

InvokeGradleScriptTasksAfterBuild

构建项目


BuildNow

检验构建结果


构建完成以后检查一下,如果在:

下面成功生成了APK文件,则说明配置是成功的。

参考链接


基于Jenkins+git+gradle的android持续集成,jenkinsgradle

Mac Gradle 编译报告Failure initializing default system SSL context

Mac 10.9 版本下使用Gradle 编译 Android 项目,报告错误

使用 -debug 参数,得到的详细输出如下

可以看到,异常信息为

到具体的目录下面去看,这个文件果然是不存在的,有些版本链接到了一个不存在的目录,这种情况一般是经历过系统升级,往往会造成这个现象,另外,就是系统安装的Java 是Apple 提供的 Java 版本,而不是 Orcale 官网下载的独立版本。

解决方法是可以到Orcale 官网下载最新版本的 Java ,安装替换即可解决问题。

使用 Homebrew 安装指定版本的软件

在命令行下使用

就可以安装 FORMULANAME 对应的工具,它会处理好依赖关系,非常方便。默认情况下,安装最新版本。但是现在在使用 Gradle 的时候,最新版本的 Gradle 是1.10,但是编译Android 的项目失败,只能降级成 1.9 版本的才行,解决方法如下

1.查看 brew 支持哪些版本的 gradle

可以看到,支持 1.9 版本的。

2. 进入 brew 所在的git仓库

3.复制粘贴刚才 brew versions gradle 命令的提示,我们需要1.9 版本的,因此执行

此时,本地仓库中的gradle 就被替换成了 1.9 的链接地址信息。

4. 安装

可以看到输出的信息已经是 1.9 的版本了。

java.lang.ClassNotFoundException:org.gradle.api.artifacts.result.ResolvedModuleVersionResult

使用 Gradle 升级到 1.10 版本,编译 Android 项目的时候报告类似如下的异常信息

搜索了一下,找到答案如下

也就是说Gradle 1.9 以上的版本编译 Android 代码目前是存在问题的。