利用Maven下载Android Gradle Plugin依
一、背景
近期由于部分需求开发需要将Gradle和Android Gradle Plugin进行升级到3.0.0以上,由于项目是运行在专门的编译机器进行编译,升级的话就要让运维将Gradle文件和Android Gradle Plugin依赖的所有文件放置到一个特定的文件夹里面,这样其实很麻烦,于是萌生了将Gradle和Android Gradle Plugin放置到项目目录下并进行依赖。
二、利用Maven下载Android Gradle Plugin所有依赖的文件
首先创建一个文件命名为pom.xml,文件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dep.download</groupId>
<artifactId>dep-download</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
<repository>
<id>google</id>
<url>https://dl.google.com/dl/android/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
<repository>
<id>jcenter</id>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<layout>default</layout>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.android.tools.build</groupId>
<artifactId>gradle</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
对于Maven不熟悉可以参考这个【教程】 。上面<repositories>标签声明了我们在build.gradle中google()和jcenter()的Maven库地址。dependencies则声明了我们这个项目需要依赖的库,这里是需要下载Android Gradle Plugin(com.android.tools.build:gradle:3.1.0),如果是要下载一个库和其依赖的库,只要修改上面的Maven坐标就可以。
pom.xml创建完毕则可以运行以下Maven命令, 进行这一步骤前需要先下载安装maven并配置环境变量。这一条命令是利用了maven的dependency插件实现copy-dependencies目标操作,-U 是强制更新snapshot类型的插件或依赖库,因此需要加上。
mvn -f pom.xml dependency:copy-dependencies -U
运行完毕会将依赖库下载在target\dependency目录下,Android Gradle Plugin 3.1.0版本互相依赖的库总共有72个,大约71M多。
image.png三、修改build.Gradle依赖关系
首先将target\dependency下所有文件复制到项目根目录下的任意一个文件夹,这里我命名为build-tools\gradle-plugin,并将gradle-4.4.all.zip下载放到build-tools目录下。
image.png接着修改根目录的build.gradle文件,将 classpath 'com.android.tools.build:gradle:3.1.0' 注释并增加 classpath fileTree(dir: 'build-tools/gradle-plugin', include: ['*.jar'])配置语句。
buildscript {
repositories {
google()
jcenter()
}
dependencies {
//classpath 'com.android.tools.build:gradle:3.1.0'
//依赖于本地库
classpath fileTree(dir: 'build-tools/gradle-plugin', include: ['*.jar'])
}
}
allprojects {
repositories {
google()
jcenter()
}
}
gradle-wrapper.properties文件下的gradle文件也修改成相对路径,distributionUrl=../../build-tools/gradle-4.4-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=../../build-tools/gradle-4.4-all.zip
这样就能将Gradle和Android Gradle Plugin修改成依赖自己下载的文件。
四、利用Maven下载Android Gradle Plugin依赖的文件(Maven本地库)
上面的做法虽然可以依赖,但是却不能使用原来classpath 'com.android.tools.build:gradle:3.1.0'的依赖方式,因此接下来是将gradle依赖的库文件按maven库形式下载下来。
首先将maven安装目录E:\apache-maven-3.5.3\E:\apache-maven-3.5.3\conf\settings.xml中将localRepository修改自定义目录,这里修改为D:/maven-jar,这就是maven下载后jar的目录
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:/maven-jar</localRepository>
接着在上面提及到的pom.xml所在文件夹下执行mvn install,这时候mvn就会将com.android.tools.build:gradle所依赖的jar下载到D:/maven-jar中,jar以及pom文件都会下载下来,这时候就可以在gradle里面设置maven本地库了 maven {url “file:\D:\maven-jar”}了。
image.png
五、升级Android Gradle Plugin 3.0遇到的问题
- 升级multidex到1.0.2
multidex需要升级到1.0.2并需要在module的buold.gradle里面增加以下配置以解决包依赖重复的问题
configurations {
all*.exclude group:'com.android.support', module:'multidex'
all*.exclude group:'com.android.support', module:'multidex-instrumentation'
}
- windowEnterAnimation和windowExitAnimation not found 问题
编译出现以下问题
Error:(22, 5) style attribute '@android:attr/windowEnterAnimation' not found
Error:(22, 5) style attribute '@android:attr/windowExitAnimation' not found
这是aapt2导致的,3.0默认启用了aapt2。解决办法就是在project的根目录下的gradle.properties最后添加关闭aapt2的代码:
android.enableAapt2=false