#0x0.Pre
网上找到很多答案,但是很多都不能用,也没有声明环境,浪费了很多时间,而Gradle这货变化太快了,经常上个版本的方法、字段到下个版本就不能用了,所以先声明一下本文的环境和版本号,以免日后时间长,方法失效。
Android Studio:3.0.1
Android Gradle Plugin: 3.0.1
Gradle Wapper: gradle-4.1-all
Studio Embedded JDK:openjdk version “1.8.0_152-release”
最近手贱升级了Android Studio到3.0.1,结果就踏上踩坑之路,之前的打包脚本都没法用,并且jre用的内嵌的1.8,而我本机装的是1.7,于是乎gradlew的命令没法用,提示:
java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0
这个问题的原因是,系统环境变量中的Java指向的还是1.7,而Android Gradle Plugin应该是1.8编译出来的,生成的class文件中,Java版本号是52.0(1.7是51.0)。
#0x1. 解决JRE版本问题
首先想到更改环境变量,系统变量中新增JAVA_HOME_8,内容为D:\Android\android-studio\jre(本人AndroidStudio默认内嵌的1.8的JRE),命令行中运行java -version仍然显示:
java version “1.7.0_60”
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
然后查找Java路径where java:
C:\Windows\System32\java.exe
C:\Program Files\Java\jdk1.7.0_60\bin\java.exe
C:\Program Files\Java\jdk1.7.0_60\jre\bin\java.exe
应该是安装JDK时往系统目录复制了java.exe文件,避免引起其他问题,不敢轻易改动,就想其他办法,结果还真有可以更改Java版本的地方,在应用Root目录的gradle.properties中添加如下配置即可:
//请配置你的地址
org.gradle.java.home=D:/Android/android-studio/jre
默认还可以更改其他jvm参数:
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m
-XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
gradlew.bat中会查找到对应的JAVA_HOME,此问题顺利解决,我打包需要1.7,可以指定编译版本,放到对应Module的build.gradle的android节点中:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
#0x2.本地AAR文件不再支持
While using this plugin with Android Studio, dependencies on local AAR files are not yet supported.
gradle-plugin-3-0-0.html#known_issues
因为我的项目是分成多个Project的,B依赖A,所以A打包生成app-release.aar,然后在B项目中新建Module,并导入AAR的方式,现在这种方式不再支持,只好另寻它路,因为公司内部有Maven仓库,看看能否把AAR上传到仓库中。
有这样一个开源插件:android-maven-gradle-plugin
Root Project build.gradle: classpath ‘com.github.dcendents:android-maven-gradle-plugin:2.0’
Module build.gradle: apply plugin: ‘com.github.dcendents.android-maven’
添加task:
uploadArchives {
repositories {
mavenDeployer {
repository(url: "http://maven.xxx.com/nexus/content/repositories/snapshots/") {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.artifactId = 'gate2-connector-android'
pom.version = '1.0-SNAPSHOT'
}
}
}
这里又遇到2个坑: