Android可以使用gradle进行构建的,而gradle wrapper除去首次使用的安装需要联网或者使用本地zip文件之外,使用起来和直接gradle几乎没有差别,这篇文章以前面使用Android Studio创建的安卓Demo应用为例,介绍如何使用gradle wrapper来进行apk文件的构建。
sdk安装可参看如下内容:https://liumiaocn.blog.csdn.net/article/details/103626265 本文示例使用26.1.1的Android SDK。
注:当然也可以使用Android Studio安装的sdk,实际上只是需要将SDK根目录告诉gradle即可。
代码准备示例代码工程:https://github.com/liumiaocn/easypack/tree/master/containers/standard/android/Demo
gradle配置设定:keystore设定Demo应用中的keystore文件需要结合所在的目录进行实际修改,比如本文示例的Demo在/root目录下,所以相关配置文件修改如下:
[root@liumiaocn Demo]# grep -n jks app/build.gradle 6: storeFile file('/root/Demo/keyReleaseV2.jks') 15: storeFile file('/root/Demo/keyReleaseV2.jks') [root@liumiaocn Demo]#gradle wrapper准备
gradle wrapper首次执行时会下载相应的gradle并安装至当前用户的~/.gradle目录下,成功执行之后即可使用首次设定的gradle环境了。随便执行一个gradlew的命令即可,比如确认版本信息
[root@liumiaocn Demo]# ./gradlew --version Downloading https://services.gradle.org/distributions/gradle-5.4.1-all.zip .............................................................................................................................. Unzipping /root/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx/gradle-5.4.1-all.zip to /root/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx Set executable permissions for: /root/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx/gradle-5.4.1/bin/gradle Welcome to Gradle 5.4.1! Here are the highlights of this release: - Run builds with JDK12 - New API for Incremental Tasks - Updates to native projects, including Swift 5 support For more details see https://docs.gradle.org/5.4.1/release-notes.html ------------------------------------------------------------ Gradle 5.4.1 ------------------------------------------------------------ Build time: 2019-04-26 08:14:42 UTC Revision: 261d171646b36a6a28d5a19a69676cd098a4c19d Kotlin: 1.3.21 Groovy: 2.5.4 Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018 JVM: 1.8.0_232 (Oracle Corporation 25.232-b09) OS: Linux 5.4.2-1.el7.elrepo.x86_64 amd64 [root@liumiaocn Demo]#
从第2次开始gradlew就不再需要下载gradle了,会直接使用~/.gradle/wrapper下刚刚下载并设定好的5.4.1版本的gradle
[root@liumiaocn Demo]# ls ~/.gradle daemon native notifications wrapper [root@liumiaocn Demo]# ./gradlew --version ------------------------------------------------------------ Gradle 5.4.1 ------------------------------------------------------------ Build time: 2019-04-26 08:14:42 UTC Revision: 261d171646b36a6a28d5a19a69676cd098a4c19d Kotlin: 1.3.21 Groovy: 2.5.4 Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018 JVM: 1.8.0_232 (Oracle Corporation 25.232-b09) OS: Linux 5.4.2-1.el7.elrepo.x86_64 amd64 [root@liumiaocn Demo]#构建
在使用gradlew构建安卓应用过程中最重要的设定就是和SDK的关联,和SDK的关联有两种方式,这里分别介绍如下
方式1: 设定环境变量设定环境变量ANDROID_HOME
或者
设定环境变量ANDROID_SDK_ROOT
执行示例日志如下所示:
[root@liumiaocn Demo]# export ANDROID_SDK_ROOT=/usr/local/android [root@liumiaocn Demo]# find . -type f |grep apk [root@liumiaocn Demo]# ./gradlew assembleRelease > Task :app:lintVitalRelease Calling mockable JAR artifact transform to create file: /root/.gradle/caches/transforms-2/files-2.1/053686f578beda34f83b61a336b8111f/android.jar with input /usr/local/android/platforms/android-29/android.jar Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/5.4.1/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 2m 46s 26 actionable tasks: 25 executed, 1 up-to-date [root@liumiaocn Demo]#
确认创建的apk文件
[root@liumiaocn Demo]# find . -type f |grep apk ./app/build/intermediates/apk_list/release/mainApkListPersistenceRelease/apk-list.gson ./app/build/outputs/apk/release/output.json ./app/build/outputs/apk/release/app-release.apk [root@liumiaocn Demo]#
此时local.properties文件中设定的实际是错误信息
[root@liumiaocn Demo]# grep sdk.dir local.properties sdk.dir=/Users/liumiao/Library/Android/sdk [root@liumiaocn Demo]#方式2: 设定local.properties
此文件实际为Android Studio自动创建,在文件头可以看到,特意强调此文件不应该使用版本管理给管理起来而且也不应该编辑,其原因是因为Android Studio自动创建会覆盖此文件。而这个文件唯一的作用就是告诉gradle需要使用的sdk的位置。
[root@liumiaocn Demo]# cat local.properties ## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file should *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. sdk.dir=/Users/liumiao/Library/Android/sdk [root@liumiaocn Demo]#
由于这里我们不直接使用Android Studio,而是使用gradle进行编译,所以可以直接修改sdk.dir为本地的sdk的安装目录, 首先事前设定此设定文件
[root@liumiaocn Demo]# vi local.properties [root@liumiaocn Demo]# grep sdk.dir local.properties sdk.dir=/usr/local/android [root@liumiaocn Demo]# unset ANDROID_SDK_ROOT [root@liumiaocn Demo]# env |grep ANDROID [root@liumiaocn Demo]# ./gradlew clean BUILD SUCCESSFUL in 6s 2 actionable tasks: 2 executed [root@liumiaocn Demo]# find . -type f |grep apk [root@liumiaocn Demo]#
然后执行构建,确认所生成的APK文件信息
[root@liumiaocn Demo]# ./gradlew assembleRelease BUILD SUCCESSFUL in 1m 14s 26 actionable tasks: 25 executed, 1 up-to-date [root@liumiaocn Demo]# find . -type f |grep apk ./app/build/intermediates/apk_list/release/mainApkListPersistenceRelease/apk-list.gson ./app/build/outputs/apk/release/output.json ./app/build/outputs/apk/release/app-release.apk [root@liumiaocn Demo]#常见问题 需要安装JDK而不是JRE
在编译的过程中需要使用JDK下的tools.jar等文件,如果安装的是JRE,在编译时一般会提示如下类似的错误信息
> Task :app:compileReleaseJavaWithJavac FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:compileReleaseJavaWithJavac'. > Could not find tools.jar. Please check that /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre contains a valid JDK installation.
- 对应方法 以CentOS的OpenJDK为例,java-1.8.0-openjdk.x86_64包安装的只是OpenJDK的JRE环境,而java-1.8.0-openjdk-devel.x86_64才是OpenJDK的开发包,所以需要安装的是java-1.8.0-openjdk-devel.x86_64
如果未设定指定SDK路径的环境变量或者在设定文件中设定路径错误,会提示如下类似信息
Could not determine the dependencies of task ':app:compileReleaseJavaWithJavac'. > SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting the sdk.dir path in your project's local properties file at '/root/Demo/local.properties'.
- 对应方法 设定ANDROID_HOME或者ANDROID_SDK_ROOT环境变量,或者设定local.properties中的sdk.dir